import { SDKNumberifyNestly, SDKNumber } from '../../xlinkSdkUtils/types.js';
import { BigNumber } from '../BigNumber.js';
import { KnownRoute } from '../buildSupportedRoutes.js';
import { OneOrMore } from '../typeHelpers.js';
import { KnownTokenId, KnownChainId } from './knownIds.js';
import 'big.js';
import '../../types.internal-BwEnb5-y.js';
import 'viem';
import '../../evmUtils/evmContractAddresses.js';

type TransferProphetAggregated<T extends Readonly<TransferProphet[]> = OneOrMore<TransferProphet>> = TransferProphet & {
    transferProphets: T;
};
type TransferProphet_Fee_Rate = {
    type: "rate";
    token: KnownTokenId.KnownToken;
    rate: BigNumber;
    minimumAmount: BigNumber;
};
type TransferProphet_Fee_Fixed = {
    type: "fixed";
    token: KnownTokenId.KnownToken;
    amount: BigNumber;
};
type TransferProphet_Fee = TransferProphet_Fee_Rate | TransferProphet_Fee_Fixed;
interface TransferProphet {
    isPaused: boolean;
    bridgeToken: KnownTokenId.KnownToken;
    minBridgeAmount: null | BigNumber;
    maxBridgeAmount: null | BigNumber;
    fees: TransferProphet_Fee[];
}
interface PublicTransferProphet extends Omit<SDKNumberifyNestly<TransferProphet>, "bridgeToken" | "fees"> {
    fromChain: KnownChainId.KnownChain;
    fromToken: KnownTokenId.KnownToken;
    toChain: KnownChainId.KnownChain;
    toToken: KnownTokenId.KnownToken;
    fromAmount: SDKNumber;
    toAmount: SDKNumber;
    fees: SDKNumberifyNestly<((TransferProphet_Fee_Rate & {
        amount: SDKNumber;
    }) | TransferProphet_Fee_Fixed)[]>;
}
interface PublicTransferProphetAggregated<T extends readonly PublicTransferProphet[] = readonly PublicTransferProphet[]> extends SDKNumberifyNestly<PublicTransferProphet> {
    transferProphets: T;
}
declare function transformFromPublicTransferProphet(transferProphet: PublicTransferProphet): TransferProphet;
declare function transformToPublicTransferProphet(route: KnownRoute, fromAmount: SDKNumber | BigNumber, transferProphet: TransferProphet): PublicTransferProphet;
/**
 * @example
 * transformToPublicTransferProphetAggregated(
 *   [
 *     // tokenA : chain1 -> chain2
 *     transferProphetOf(tokenAChain1, tokenAChain2),
 *     // tokenB : chain2 -> chain3
 *     transferProphetOf(tokenBChain2, tokenBChain3),
 *     // tokenC : chain3 -> chain4
 *     transferProphetOf(tokenCChain3, tokenCChain4),
 *   ],
 *   [
 *     // tokenA -> tokenB : chain2
 *     exchangeRateOf(tokenAChain2, tokenBChain2),
 *     // tokenB -> tokenC : chain3
 *     exchangeRateOf(tokenBChain3, tokenCChain3),
 *   ],
 * )
 */
declare const transformToPublicTransferProphetAggregated: (transferProphets: OneOrMore<PublicTransferProphet>, exchangeRates: readonly BigNumber[]) => PublicTransferProphetAggregated<OneOrMore<PublicTransferProphet>>;

export { type PublicTransferProphet, type PublicTransferProphetAggregated, type TransferProphet, type TransferProphetAggregated, type TransferProphet_Fee, type TransferProphet_Fee_Fixed, type TransferProphet_Fee_Rate, transformFromPublicTransferProphet, transformToPublicTransferProphet, transformToPublicTransferProphetAggregated };
