import { ethers } from "ethers";
import { type OdysseyZebecCard, type Token, type Weth, type ZebecCard } from "./artifacts";
/**
 * Card type featured by zebec instant card.
 */
export type CardType = "silver" | "carbon";
/**
 * Zebec Instant Card configs
 */
export type CardConfig = {
    nativeFeePercent: string;
    nonNativeFeePercent: string;
    revenueFeePercent: string;
    totalCardSold: bigint;
    cardVault: string;
    revenueVault: string;
    commissionVault: string;
    usdcAddress: string;
    minCardAmount: string;
    maxCardAmount: string;
    dailyCardPurchaseLimit: string;
};
export type FeeTier = {
    feePercent: string;
    minAmount: string;
    maxAmount: string;
};
export type CardPurchaseOfDay = {
    totalCardPurchased: string;
    cardPurchasedTimestamp: number;
};
/**
 * A type that hold swap transaction data
 */
export type SwapData = {
    dstAmount: string;
    from: string;
    to: string;
    swapParams: {
        executor: string;
        description: {
            srcToken: string;
            dstToken: string;
            srcReceiver: string;
            dstReceiver: string;
            srcAmount: string;
            minReturnAmount: string;
            flags: string;
        };
        routeData: string;
    };
    ether: string;
    gas: number;
    gasPrice: string;
};
export type SwapAndBuyCardParams = {
    swapData: Omit<SwapData, "gas" | "gasPrice">;
    cardType: CardType;
    buyerEmail: string;
    overrides?: ethers.Overrides;
};
export type SwapAndBuyCardParamsOdyssey = {
    cardType: CardType;
    buyerEmail: string;
    ether: string;
    slippage: number;
    overrides?: ethers.Overrides;
};
/**
 * A class which holds methods and properties to interact with Zebec Instanct Card evm contracts.
 * @example
 *
 * const signer = <ethers.Signer Instance> // most wallet provider have way to create signer
 * const chainId = 11155111 // sepolia;
 * const service = new ZebecCardService(signer, chainId);
 *
 */
export declare class ZebecCardService {
    readonly signer: ethers.Signer;
    readonly chainId: number;
    readonly zebecCard: ZebecCard | OdysseyZebecCard;
    readonly usdcToken: Token;
    readonly weth: Weth;
    /**
     * Create instance of ZebecCardService.
     * @param signer ethers signer
     * @param chainId chain ID supported by sdk
     */
    constructor(signer: ethers.Signer, chainId: number);
    /**
     *	Sets Native Fee in card config.
     *
     *  Can only be invoked admin.
     *
     * @param params
     * @returns
     */
    setNativeFee(params: {
        feeInPercent: string;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
    /**
     * Sets NonNative Fee in card config
     *
     * Can only be invoked admin.
     *
     * @param params
     * @returns
     */
    setNonNativeFee(params: {
        feeInPercent: string;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
    /**
     * Sets Revenue Fee in card config
     *
     * Can only be invoked admin.
     *
     * @param params
     * @returns
     */
    setRevenueFee(params: {
        feeInPercent: string;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
    /**
     * Sets Revenue vault address in card config
     *
     * Can only be invoked admin.
     *
     * @param params
     * @returns
     */
    setRevenueVault(params: {
        vaultAddress: ethers.AddressLike;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
    /**
     * Sets commission vault address in card config
     *
     * Can only be invoked admin.
     *
     * @param params
     * @returns
     */
    setCommissionVault(params: {
        vaultAddress: ethers.AddressLike;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
    /**
     * Sets card vault address in card config
     *
     * Can only be invoked admin.
     *
     */
    setCardVault(params: {
        vaultAddress: ethers.AddressLike;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
    /**
     * Sets usdc address in card config
     * Can only be invoked by admin
     */
    setUsdcAddress(params: {
        tokenAddress: ethers.AddressLike;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
    /**
     * Sets minimum card amount for purchasing card in card config
     */
    setMinCardAmount(params: {
        minCardAmount: string;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
    /**
     * Sets maximum card amount for purchasing card  in card config
     */
    setMaxCardAmount(params: {
        maxCardAmount: string;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
    /**
     * Sets daily card purchase limit in card config
     */
    setDailyCardPurchaseLimit(params: {
        dailyCardPurchaseLimit: string;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
    /**
     * Updates fee for given min - max (range) amount and inserts if range in not found.
     */
    setFee(params: {
        minAmount: string;
        maxAmount: string;
        feePercent: string;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
    /**
     * Sets fee tiers only be invoked by admin
     */
    setFeeTiers(params: {
        feeTiers: FeeTier[];
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
    private _parseFeeTiers;
    setCustomFee(params: {
        tokenAddress: string;
        fee: number | string;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
    getCustomFee(params: {
        tokenAddress: string;
        overrides?: ethers.Overrides;
    }): Promise<string>;
    setReloadableFee(params: {
        fee: string | number;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
    /**
     * Deposits usdc to user vault
     * @param params
     * @returns
     */
    depositUsdc(params: {
        amount: string;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
    /**
     * Withdraw usdc from user vault
     * @param params
     * @returns
     */
    withdraw(params: {
        amount: string;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
    /**
     * Transfer specified amount from user's vault balance to card vault with some fee amount for card purchase.
     * @param params
     * @returns
     */
    buyCard(params: {
        amount: string;
        cardType: CardType;
        buyerEmail: string;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
    /**
     * Swaps given src token to usdc and transfers to user's vault
     * @param params
     * @param overrides
     * @returns
     */
    swapAndDeposit(params: {
        swapData: Omit<SwapData, "gas" | "gasPrice">;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
    buyCardDirect(params: {
        amount: string;
        cardType: CardType;
        buyerEmail: string;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
    swapAndBuyCardDirect(params: SwapAndBuyCardParams): Promise<ethers.ContractTransactionResponse>;
    swapAndBuyCardOdyssey(params: SwapAndBuyCardParamsOdyssey): Promise<ethers.ContractTransactionResponse>;
    getReloadableFee(): Promise<string>;
    /**
     * Gets minimum usdc amount for given ether amount
     * @param etherAmount
     * @param slippage
     * @returns
     */
    getMinimumUsdcAmount(etherAmount: string, slippage: number): Promise<string>;
    /**
     * Gets user's vault balance
     * @param params
     * @returns
     */
    getUserBalance(params: {
        userAddress: ethers.AddressLike;
    }): Promise<string>;
    /**
     * Gets user's card purchase
     * @param params
     * @returns
     */
    getCardPurhcaseOfDay(params: {
        userAddress: ethers.AddressLike;
    }): Promise<CardPurchaseOfDay>;
    /**
     * Gets Zebec Instant Card contract configs
     * @returns
     */
    getCardConfig(): Promise<CardConfig>;
    /**
     * Gets fee tiers
     * @returns Array of fee tier
     */
    getFeeTiers(): Promise<Array<FeeTier>>;
    /**
     * Gets admin adddress
     * @returns
     */
    getAdmin(): Promise<string>;
    /**
     * add allowance of given amount of given token to given spender
     * @param params
     * @returns
     */
    approve(params: {
        token: string;
        spender: ethers.AddressLike;
        amount: string;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse | null>;
    /**
     * Wrap ETH to Wrapped ETH
     * @param param
     * @returns
     */
    wrapEth(params: {
        amount: string;
        overrides?: ethers.Overrides;
    }): Promise<ethers.ContractTransactionResponse>;
}
