import { IPlugin } from "@skynetxbt/core";
import { EventEmitter } from "events";
import { StakingOperationResult, StakingViewResult } from "./types";
import { TokenOperationResult } from "./VeniceToken";
interface RateLimit {
    amount: number;
    type: "RPM" | "RPD" | "TPM";
}
interface ModelRateLimit {
    apiModelId: string;
    rateLimits: RateLimit[];
}
interface VeniceBalances {
    VCU: number;
    USD: number;
}
interface ApiTier {
    id: string;
    isCharged: boolean;
}
interface RateLimitResponse {
    data: {
        apiTier: ApiTier;
        accessPermitted: boolean;
        balances: VeniceBalances;
        rateLimits: ModelRateLimit[];
    };
}
export interface VenicePluginConfig {
    rpcUrl?: string;
    privateKey?: string;
    stakingContractAddress?: string;
    veniceTokenAddress?: string;
    veniceApiKey?: string;
    veniceBaseUrl?: string;
}
export declare class VenicePlugin extends EventEmitter implements IPlugin {
    private config;
    readonly name: string;
    readonly description: string;
    private stakingContract;
    private veniceToken;
    private provider;
    private signer;
    private apiClient;
    constructor(config?: VenicePluginConfig);
    initialize(): Promise<void>;
    cleanup(): Promise<void>;
    getVCUsBalance(vvvBalance: string): Promise<string>;
    getModelInfo(modelId: string): Promise<string>;
    getTokenBalance(address: string): Promise<TokenOperationResult>;
    /**
     * Check allowance for staking contract
     */
    checkAllowance(ownerAddress: string): Promise<TokenOperationResult>;
    /**
     * Approve staking contract to spend tokens
     */
    approveStaking(amount: string): Promise<TokenOperationResult>;
    stake(recipient: string, amount: string): Promise<StakingOperationResult>;
    initiateUnstake(amount: string): Promise<StakingOperationResult>;
    finalizeUnstake(): Promise<StakingOperationResult>;
    claim(): Promise<StakingOperationResult>;
    getPendingRewards(userAddress: string): Promise<StakingViewResult<string>>;
    getVenicePercentage(): Promise<StakingViewResult<string>>;
    getUserStakeInfo(userAddress: string): Promise<StakingViewResult<any>>;
    getStakingStats(): Promise<StakingViewResult<any>>;
    getRateLimits(): Promise<RateLimitResponse | null>;
    getModelRateLimits(modelId: string): Promise<ModelRateLimit | null>;
    getVeniceBalances(): Promise<VeniceBalances | null>;
}
export {};
