import { BigNumberish, BytesLike, ContractTransactionResponse, Interface } from "ethers";
import { CollaterlCCY } from "./constants";
export interface NodeSDKConfig {
    name: string | undefined;
    chainId: number;
    version: number;
    nodeURL: string;
    configSource: string;
    proxyAddr: string;
    proxyABILocation: string;
    shareTokenABILocation: string;
    limitOrderBookABILocation: string;
    limitOrderBookFactoryABILocation: string;
    symbolListLocation: string;
    priceFeedConfigNetwork: string;
    gasLimit?: number | undefined;
    proxyABI?: Interface | undefined;
    lobFactoryABI?: Interface | undefined;
    lobABI?: Interface | undefined;
    shareTokenABI?: Interface | undefined;
    priceFeedEndpoints?: PriceFeedEndpointsOptionalWrite;
    multicall?: string;
}
export type SettlementConfig = SettlementCcyItem[];
export interface SettlementCcyItem {
    perpFlags: bigint;
    description: string;
    settleTokenDecimals: number;
    settleCCY: string;
    settleCCYAddr: string;
    collateralCCY: string;
    collateralCCYAddr: string;
    triangulation: string[];
}
export interface MarginAccount {
    symbol: string;
    positionNotionalBaseCCY: number;
    side: string;
    entryPrice: number;
    leverage: number;
    markPrice: number;
    unrealizedPnlQuoteCCY: number;
    unrealizedFundingCollateralCCY: number;
    collateralCC: number;
    liquidationPrice: [number, number | undefined];
    liquidationLvg: number;
    collToQuoteConversion: number;
}
export interface PoolStaticInfo {
    poolId: number;
    poolMarginSymbol: string;
    poolMarginTokenAddr: string;
    poolMarginTokenDecimals: number;
    poolSettleSymbol: string;
    poolSettleTokenAddr: string;
    poolSettleTokenDecimals: number;
    MgnToSettleTriangulation: string[];
    shareTokenAddr: string;
    oracleFactoryAddr: string;
    isRunning: boolean;
}
export interface PerpetualStaticInfo {
    id: number;
    poolId: number;
    state: string;
    limitOrderBookAddr: string;
    initialMarginRate: number;
    maintenanceMarginRate: number;
    collateralCurrencyType: CollaterlCCY;
    S2Symbol: string;
    S3Symbol: string;
    lotSizeBC: number;
    referralRebate: number;
    priceIds: string[];
    isPyth: boolean[];
    perpFlags: bigint;
}
/**
 * @global
 * @typedef {Object} ExchangeInfo
 * @property {PoolState[]} pools Array of state objects for all pools in the exchange.
 * @property {string} oracleFactoryAddr Address of the oracle factory used by the pools in the exchange.
 */
export interface ExchangeInfo {
    pools: PoolState[];
    oracleFactoryAddr: string;
    proxyAddr: string;
}
/**
 * @global
 * @typedef {Object} PoolState
 * @property {boolean} isRunning True if the pool is running.
 * @property {string} marginTokenAddr  Address of the token used by the pool.
 * This is the token used for margin deposits, liquidity provision, and trading fees.
 * @property {string} poolShareTokenAddr Address of the pool share token.
 * This is the token issued to external liquidity providers.
 * @property {number} defaultFundCashCC Amount of cash in the default fund of this pool, denominated in margin tokens.
 * @property {number} pnlParticipantCashCC Amount of cash in the PnL participation pool, i.e. cash deposited by external liquidity providers.
 * @property {number} totalTargetAMMFundSizeCC Target AMM funds aggregated across all perpetuals in this pool.
 * @property {number} brokerCollateralLotSize Price of one lot for brokers who wish to participate in this pool. Denominated in margin tokens.
 * @property {PerpetualState[]} perpetuals Array of all perpetuals in this pool.
 */
export interface PoolState {
    isRunning: boolean;
    poolSymbol: string;
    settleSymbol: string;
    marginTokenAddr: string;
    settleTokenAddr: string;
    poolShareTokenAddr: string;
    defaultFundCashCC: number;
    pnlParticipantCashCC: number;
    totalTargetAMMFundSizeCC: number;
    brokerCollateralLotSize: number;
    perpetuals: PerpetualState[];
}
export interface PerpetualState {
    id: number;
    state: string;
    baseCurrency: string;
    quoteCurrency: string;
    indexPrice: number;
    collToQuoteIndexPrice: number;
    markPremium: number;
    markPrice: number;
    midPrice: number;
    currentFundingRateBps: number;
    openInterestBC: number;
    longBC: number;
    shortBC: number;
    isMarketClosed: boolean;
}
export interface OrderResponse {
    tx: ContractTransactionResponse;
    orderId: string;
}
export interface OrderStruct {
    orders: Order[];
    orderIds: string[];
}
export interface Order {
    symbol: string;
    side: string;
    type: string;
    quantity: number;
    reduceOnly?: boolean | undefined;
    limitPrice?: number | undefined;
    keepPositionLvg?: boolean | undefined;
    brokerFeeTbps?: number | undefined;
    brokerAddr?: string | undefined;
    brokerSignature?: BytesLike | undefined;
    stopPrice?: number | undefined;
    leverage?: number | undefined;
    deadline?: number | undefined;
    executionTimestamp: number;
    submittedTimestamp?: number;
    parentChildOrderIds?: [string, string];
}
export interface TradeEvent {
    perpetualId: number;
    positionId: string;
    orderId: string;
    newPositionSizeBC: number;
    executionPrice: number;
}
/**
 * @global
 * @typedef {Object} SmartContractOrder
 * @property {bigint} flags
 * @property {number} iPerpetualId
 * @property {number} brokerFeeTbps
 * @property {string} traderAddr
 * @property {string} brokerAddr
 * @property {string} executorAddr
 * @property {BytesLike} brokerSignature
 * @property {bigint} fAmount
 * @property {bigint} fLimitPrice
 * @property {bigint} fTriggerPrice
 * @property {number} leverageTDR
 * @property {number} iDeadline
 * @property {number} executionTimestamp
 * @property {number} submittedTimestamp
 */
export interface SmartContractOrder {
    flags: BigNumberish;
    iPerpetualId: BigNumberish;
    brokerFeeTbps: BigNumberish;
    traderAddr: string;
    brokerAddr: string;
    executorAddr: string;
    brokerSignature: BytesLike;
    fAmount: bigint;
    fLimitPrice: bigint;
    fTriggerPrice: bigint;
    leverageTDR: BigNumberish;
    iDeadline: BigNumberish;
    executionTimestamp: BigNumberish;
    submittedTimestamp: BigNumberish;
}
/**
 * @global
 * @typedef {Object} ClientOrder
 * @property {bigint} flags
 * @property {bigint} iPerpetualId
 * @property {bigint} brokerFeeTbps
 * @property {string} traderAddr
 * @property {string} brokerAddr
 * @property {string} executorAddr
 * @property {BytesLike} brokerSignature
 * @property {bigint} fAmount
 * @property {bigint} fLimitPrice
 * @property {bigint} fTriggerPrice
 * @property {bigint} leverageTDR
 * @property {bigint} iDeadline
 * @property {bigint} executionTimestamp
 * @property {string} parentChildDigest1
 * @property {string} parentChildDigest2
 * @property {string} callbackTarget
 */
export interface ClientOrder {
    flags: BigNumberish;
    iPerpetualId: BigNumberish;
    brokerFeeTbps: BigNumberish;
    traderAddr: string;
    brokerAddr: string;
    executorAddr: string;
    brokerSignature: BytesLike;
    fAmount: bigint;
    fLimitPrice: bigint;
    fTriggerPrice: bigint;
    leverageTDR: BigNumberish;
    iDeadline: BigNumberish;
    executionTimestamp: BigNumberish;
    parentChildDigest1: string;
    parentChildDigest2: string;
    callbackTarget: string;
}
export interface TypeSafeOrder {
    flags: bigint;
    iPerpetualId: number;
    brokerFeeTbps: number;
    traderAddr: string;
    brokerAddr: string;
    brokerSignature: string;
    fAmount: bigint;
    fLimitPrice: bigint;
    fTriggerPrice: bigint;
    leverageTDR: number;
    iDeadline: number;
    executionTimestamp: number;
    parentChildDigest1: string;
    parentChildDigest2: string;
    callbackTarget: string;
}
export interface PriceFeedConfig {
    network: string;
    ids: Array<{
        symbol: string;
        id: string;
        type: string;
        origin: string;
    }>;
    endpoints: PriceFeedEndpoints;
}
export interface PriceFeedEndpointsItem {
    type: string | "odin" | "pyth" | "onchain" | "v2" | "v3" | "low-liq" | "polymarket";
    endpoints: string[];
    writeEndpoints?: string[];
}
export type PriceFeedEndpoints = Array<Required<PriceFeedEndpointsItem>>;
export type PriceFeedEndpointsOptionalWrite = Array<PriceFeedEndpointsItem>;
export interface PriceFeedSubmission {
    symbols: Map<string, string[]>;
    ids: string[];
    priceFeedVaas: string[];
    prices: number[];
    isMarketClosed: boolean[];
    timestamps: number[];
}
export interface PriceFeedFormat {
    conf: bigint;
    expo: number;
    price: bigint;
    publish_time: number;
}
export interface PriceFeedJson {
    conf: string;
    expo: number;
    price: string;
    publish_time: number;
}
export interface PythV2MetaData {
    slot: number;
    proof_available_time: number;
    prev_publish_time: number;
}
export interface PythV2LatestPriceFeed {
    binary: {
        encoding: string;
        data: string[];
    };
    parsed: [
        {
            ema_price: PriceFeedFormat;
            id: string;
            price: PriceFeedFormat;
            metadata: PythV2MetaData;
        }
    ];
}
export interface APIReferralCodePayload {
    code: string;
    referrerAddr: string;
    createdOn: number;
    passOnPercTDF: number;
    signature: string;
}
export interface APIReferPayload {
    parentAddr: string;
    referToAddr: string;
    passOnPercTDF: number;
    createdOn: number;
    signature: string;
}
export interface APIReferralCodeSelectionPayload {
    code: string;
    traderAddr: string;
    createdOn: number;
    signature: string;
}
export interface GasPriceV2 {
    maxPriorityFee: number;
    maxfee: number;
}
export interface GasInfo {
    safeLow: number | GasPriceV2;
    standard: number | GasPriceV2;
    fast: number | GasPriceV2;
    fastest?: number;
    estimatedBaseFee?: number;
    blockTime: number;
    blockNumber: number;
}
export interface TokenOverride {
    tokenAddress: string;
    newSymbol: string;
}
/**
 * Perpetualdata corresponding to the data in the smart contract
 */
export interface PerpetualData {
    poolId: number;
    id: number;
    fInitialMarginRate: number;
    fSigma2: number;
    iLastFundingTime: number;
    fDFCoverNRate: number;
    fMaintenanceMarginRate: number;
    perpetualState: string;
    eCollateralCurrency: number;
    S2BaseCCY: string;
    S2QuoteCCY: string;
    incentiveSpreadBps: number;
    minimalSpreadBps: number;
    S3BaseCCY: string;
    S3QuoteCCY: string;
    fSigma3: number;
    fRho23: number;
    liquidationPenaltyRateBps: number;
    currentMarkPremiumRatePrice: number;
    currentMarkPremiumRateTime: number;
    premiumRatesEMA: number;
    fUnitAccumulatedFunding: number;
    fOpenInterest: number;
    fTargetAMMFundSize: number;
    fCurrentTraderExposureEMA: number;
    fCurrentFundingRate: number;
    fLotSizeBC: number;
    fReferralRebateCC: number;
    fTargetDFSize: number;
    fkStar: number;
    fAMMTargetDD: number;
    perpFlags: bigint;
    fMinimalTraderExposureEMA: number;
    fMinimalAMMExposureEMA: number;
    fSettlementS3PriceData: number;
    fSettlementS2PriceData: number;
    fTotalMarginBalance: number;
    fMarkPriceEMALambda: number;
    fFundingRateClamp: number;
    fMaximalTradeSizeBumpUp: number;
    iLastTargetPoolSizeTime: number;
    fStressReturnS3: [number, number];
    fDFLambda: [number, number];
    fCurrentAMMExposureEMA: [number, number];
    fStressReturnS2: [number, number];
}
/**
 * LiquidityPoolData corresponding to the data in the smart contract
 */
export interface LiquidityPoolData {
    isRunning: boolean;
    iPerpetualCount: number;
    id: number;
    fCeilPnLShare: number;
    marginTokenDecimals: number;
    iTargetPoolSizeUpdateTime: number;
    marginTokenAddress: string;
    prevAnchor: number;
    fRedemptionRate: number;
    shareTokenAddress: string;
    fPnLparticipantsCashCC: number;
    fTargetAMMFundSize: number;
    fDefaultFundCashCC: number;
    fTargetDFSize: number;
    fBrokerCollateralLotSize: number;
    prevTokenAmount: number;
    nextTokenAmount: number;
    totalSupplyShareToken: number;
    fBrokerFundCashCC: number;
}
export declare const referralDomain: {
    readonly name: "Referral System";
};
export declare const referralTypes: {
    readonly NewCode: readonly [{
        readonly name: "Code";
        readonly type: "string";
    }, {
        readonly name: "ReferrerAddr";
        readonly type: "address";
    }, {
        readonly name: "PassOnPercTDF";
        readonly type: "uint32";
    }, {
        readonly name: "CreatedOn";
        readonly type: "uint256";
    }];
    readonly NewReferral: readonly [{
        readonly name: "ParentAddr";
        readonly type: "address";
    }, {
        readonly name: "ReferToAddr";
        readonly type: "address";
    }, {
        readonly name: "PassOnPercTDF";
        readonly type: "uint32";
    }, {
        readonly name: "CreatedOn";
        readonly type: "uint256";
    }];
    readonly CodeSelection: readonly [{
        readonly name: "Code";
        readonly type: "string";
    }, {
        readonly name: "TraderAddr";
        readonly type: "address";
    }, {
        readonly name: "CreatedOn";
        readonly type: "uint256";
    }];
    readonly EIP712Domain: readonly [{
        readonly name: "name";
        readonly type: "string";
    }];
};
export interface IdxPriceInfo {
    s2: number;
    s3?: number;
    ema: number;
    s2MktClosed: boolean;
    s3MktClosed?: boolean;
    conf: bigint;
    predMktCLOBParams: bigint;
}
export interface PredMktPriceInfo {
    s2: number;
    ema: number;
    s2MktClosed: boolean;
    conf: bigint;
    predMktCLOBParams: bigint;
}
export interface PythMetadata {
    id: string;
    market_hours: {
        is_open: boolean;
        next_open?: number;
        next_close?: number;
    };
    attributes: {
        symbol?: string;
        asset_type?: string;
        base?: string;
        cms_symbol?: string;
        country?: string;
        cqs_symbol?: string;
        description?: string;
        display_symbol?: string;
        nasdaq_symbol?: string;
        publish_interval?: string;
        quote_currency?: string;
        schedule?: string;
    };
}
