import { ContractConfig, ExtrinsicConfig, BalanceConfigBuilder, AssetMinConfigBuilder, FeeConfigBuilder, SubstrateQueryConfig, EvmQueryConfig } from '@moonbeam-network/xcm-builder';
import { AssetRoute, FeeConfig, ConfigService } from '@moonbeam-network/xcm-config';
import * as _moonbeam_network_xcm_types from '@moonbeam-network/xcm-types';
import { AssetAmount, AnyChain, AnyParachain, ChainAsset, Asset, EvmChain, EvmParachain, Ecosystem, AnyAsset } from '@moonbeam-network/xcm-types';
import { Signer, SubmittableExtrinsic } from '@polkadot/api/types';
import { IKeyringPair, ISubmittableResult } from '@polkadot/types/types';
import { WalletClient, PublicClient, HttpTransport, Hash } from 'viem';
import { ApiPromise } from '@polkadot/api';
import { RuntimeDispatchInfo } from '@polkadot/types/interfaces';
import { HexString } from '@polkadot/util/types';

type EvmSigner = WalletClient;
interface Signers {
    evmSigner?: EvmSigner;
    polkadotSigner?: Signer | IKeyringPair;
}
interface TransferData {
    destination: DestinationChainTransferData;
    getEstimate(amount: number | string): AssetAmount;
    max: AssetAmount;
    min: AssetAmount;
    source: SourceChainTransferData;
    transfer(amount: bigint | number | string, signers: Signers): Promise<string>;
}
interface SourceChainTransferData extends ChainTransferData {
    destinationFee: AssetAmount;
    destinationFeeBalance: AssetAmount;
    feeBalance: AssetAmount;
    max: AssetAmount;
}
interface SovereignAccountBalance {
    feeAssetBalance: bigint | undefined;
    transferAssetBalance: bigint;
}
interface DestinationChainTransferData extends ChainTransferData {
    sovereignAccountBalances?: SovereignAccountBalance;
}
interface ChainTransferData {
    balance: AssetAmount;
    chain: AnyChain;
    existentialDeposit?: AssetAmount;
    fee: AssetAmount;
    min: AssetAmount;
}

interface GetSourceDataParams {
    route: AssetRoute;
    destinationAddress: string;
    destinationFee: AssetAmount;
    sourceAddress: string;
}
declare function getSourceData({ route, destinationAddress, destinationFee, sourceAddress, }: GetSourceDataParams): Promise<SourceChainTransferData>;
interface GetFeeParams {
    balance: AssetAmount;
    feeBalance: AssetAmount;
    contract?: ContractConfig;
    chain: AnyParachain;
    destinationFee: AssetAmount;
    extrinsic?: ExtrinsicConfig;
    feeConfig?: FeeConfig;
    sourceAddress: string;
}
declare function getFee({ balance, feeBalance, chain, contract, destinationFee, extrinsic, feeConfig, sourceAddress, }: GetFeeParams): Promise<AssetAmount>;
interface GetAssetsBalancesParams {
    address: string;
    chain: AnyParachain;
    routes: AssetRoute[];
    evmSigner?: EvmSigner;
}
declare function getAssetsBalances({ address, chain, routes, }: GetAssetsBalancesParams): Promise<AssetAmount[]>;

interface GetDestinationDataParams {
    route: AssetRoute;
    destinationAddress: string;
}
declare function getDestinationData({ route, destinationAddress, }: GetDestinationDataParams): Promise<DestinationChainTransferData>;

interface GetBalancesParams {
    address: string;
    asset: ChainAsset;
    builder: BalanceConfigBuilder;
    chain: AnyChain;
}
declare function getBalance({ address, asset, builder, chain, }: GetBalancesParams): Promise<AssetAmount>;
interface GetMinParams {
    asset: Asset;
    builder?: AssetMinConfigBuilder;
    chain: AnyChain;
}
declare function getAssetMin({ asset, builder, chain, }: GetMinParams): Promise<AssetAmount>;
declare function getMin({ balance, existentialDeposit, fee, min, }: DestinationChainTransferData): AssetAmount;
interface GetMaxParams {
    balance: AssetAmount;
    existentialDeposit?: AssetAmount;
    fee: AssetAmount;
    min: AssetAmount;
}
declare function getMax({ balance, existentialDeposit, fee, min, }: GetMaxParams): AssetAmount;
interface GetDestinationFeeParams {
    address: string;
    asset: Asset;
    feeAsset: Asset;
    destination: AnyChain;
    fee: number | FeeConfigBuilder;
    source: AnyChain;
}
declare function getDestinationFee({ address, asset, destination, fee, feeAsset, source, }: GetDestinationFeeParams): Promise<AssetAmount>;
interface ConvertToChainDecimalsParams {
    asset: AssetAmount;
    target: ChainAsset;
}
declare function convertToChainDecimals({ asset, target, }: ConvertToChainDecimalsParams): AssetAmount;
declare function getExistentialDeposit(chain: AnyChain): Promise<AssetAmount | undefined>;
interface GetDestinationFeeBalanceParams {
    balance: AssetAmount;
    feeBalance: AssetAmount;
    route: AssetRoute;
    sourceAddress: string;
}
declare function getDestinationFeeBalance({ balance, feeBalance, route, sourceAddress, }: GetDestinationFeeBalanceParams): Promise<AssetAmount>;
interface GetExtrinsicFeeParams {
    address: string;
    balance: AssetAmount;
    chain: AnyParachain;
    extrinsic: ExtrinsicConfig;
    feeBalance: AssetAmount;
    feeConfig?: FeeConfig;
}
declare function getExtrinsicFee({ address, balance, chain, extrinsic, feeBalance, feeConfig, }: GetExtrinsicFeeParams): Promise<AssetAmount>;
interface GetContractFeeParams {
    address: string;
    balance: AssetAmount;
    chain: EvmChain | EvmParachain;
    contract: ContractConfig;
    destinationFee: AssetAmount;
    feeBalance: AssetAmount;
    feeConfig?: FeeConfig;
}
declare function getContractFee({ address, balance, chain, contract, destinationFee, feeBalance, feeConfig, }: GetContractFeeParams): Promise<AssetAmount>;
interface ValidateSovereignAccountBalancesProps {
    amount: bigint;
    destinationData: DestinationChainTransferData;
    sourceData: SourceChainTransferData;
}
declare function validateSovereignAccountBalances({ amount, sourceData, destinationData, }: ValidateSovereignAccountBalancesProps): void;

interface SdkOptions {
    configService?: ConfigService;
    ecosystem?: Ecosystem;
}
declare function Sdk({ configService, ecosystem }?: SdkOptions): {
    assets: _moonbeam_network_xcm_types.Asset[];
    setAsset(asset: string | AnyAsset): {
        sources: AnyChain[];
        setSource(source: string | AnyChain): {
            destinations: AnyChain[];
            setDestination(destination: string | AnyChain): {
                setAddresses({ sourceAddress, destinationAddress, }: {
                    sourceAddress: string;
                    destinationAddress: string;
                }): Promise<TransferData>;
            };
        };
    };
};
declare function getParachainBalances(chain: AnyParachain, address: string, service?: ConfigService): Promise<AssetAmount[]>;

declare class PolkadotService {
    #private;
    readonly api: ApiPromise;
    readonly chain: AnyParachain;
    constructor(api: ApiPromise, chain: AnyParachain);
    static create(chain: AnyParachain): Promise<PolkadotService>;
    static createMulti(chains: AnyParachain[]): Promise<PolkadotService[]>;
    get decimals(): number;
    get existentialDeposit(): AssetAmount;
    query(config: SubstrateQueryConfig): Promise<bigint>;
    getExtrinsic(config: ExtrinsicConfig): SubmittableExtrinsic<'promise', ISubmittableResult>;
    getExtrinsicCallHash(config: ExtrinsicConfig): HexString;
    getPaymentInfo(account: string, config: ExtrinsicConfig): Promise<RuntimeDispatchInfo>;
    getFee(account: string, config: ExtrinsicConfig): Promise<bigint>;
    transfer(account: string, config: ExtrinsicConfig, signer: Signer | IKeyringPair, statusCallback?: (params: ISubmittableResult) => void): Promise<string>;
}

declare class EvmService {
    readonly chain: EvmChain | EvmParachain;
    readonly client: PublicClient<HttpTransport>;
    static create(chain: EvmChain | EvmParachain): EvmService;
    constructor(chain: EvmChain | EvmParachain);
    query(query: EvmQueryConfig): Promise<bigint>;
    getFee(address: string, contract: ContractConfig): Promise<bigint>;
    getBalance(address: string, contract: ContractConfig): Promise<bigint>;
    transfer(signer: EvmSigner, contract: ContractConfig): Promise<Hash>;
}

export { type ChainTransferData, type ConvertToChainDecimalsParams, type DestinationChainTransferData, EvmService, type EvmSigner, type GetAssetsBalancesParams, type GetBalancesParams, type GetContractFeeParams, type GetDestinationDataParams, type GetDestinationFeeBalanceParams, type GetDestinationFeeParams, type GetExtrinsicFeeParams, type GetFeeParams, type GetMaxParams, type GetMinParams, type GetSourceDataParams, PolkadotService, Sdk, type SdkOptions, type Signers, type SourceChainTransferData, type SovereignAccountBalance, type TransferData, convertToChainDecimals, getAssetMin, getAssetsBalances, getBalance, getContractFee, getDestinationData, getDestinationFee, getDestinationFeeBalance, getExistentialDeposit, getExtrinsicFee, getFee, getMax, getMin, getParachainBalances, getSourceData, validateSovereignAccountBalances };
