import { Aptos, Ed25519Account, SimpleTransaction, AccountAuthenticator, CommittedTransactionResponse, InputGenerateTransactionPayloadData, AccountAddressInput, MoveStructId, LedgerVersionArg, TableItemRequest } from '@aptos-labs/ts-sdk';
import { Provider } from '@layerzerolabs/lz-core';
import { Network, Chain, Stage } from '@layerzerolabs/lz-definitions';
import { AccountsOption, MoveSdkImpl, LayerZeroModulesSdk } from '@layerzerolabs/lz-movevm-sdk-v2';
import { MoveFunction, EntryFunctionArgumentTypes, MoveValue, PrivateKey, MnemonicAndPath, ByteCode, GasOptions, TransactionResponse } from '@layerzerolabs/move-definitions';

/**
 * The basis points (BPS) used to apply a safety margin to the gas limit.
 *
 * 1 BPS = 0.01%, so 2000 BPS = 20%.
 */
declare const GAS_LIMIT_SAFETY_BPS = 2000;
/**
 * Applies a safety margin to the gas limit.
 *
 * @param {string} gasUsed - The amount of gas used.
 * @returns {bigint} The gas limit with the safety margin applied.
 */
declare function applyGasLimitSafety(gasUsed: string): bigint;

declare const ENDPOINT_V2_ADDRESS: {
    [network in Network]?: string;
};
declare const SIMPLE_MESSAGE_LIB_ADDRESS: {
    [network in Network]?: string;
};
declare const ULN_MESSAGE_LIB_ADDRESS: {
    [network in Network]?: string;
};
declare const COUNTER_V2_ADDRESS: {
    [network in Network]?: string;
};
declare const OFT_ADDRESS: {
    [network in Network]?: string;
};
declare const LAYERZERO_VIEWS_ADDRESS: {
    [network in Network]?: string;
};
declare const EXECUTOR_ADDRESS: {
    [network in Network]?: string;
};
declare const EXECUTOR_ULN301_ADDRESS: {
    [network in Network]?: string;
};
declare const DVN_ADDRESS: {
    [network in Network]?: string;
};
declare const DVN_301_ADDRESS: {
    [network in Network]?: string;
};
declare const DVN_UPGRADER_ADDRESS: {
    [network in Network]?: string;
};
declare const WORKER_COMMON: {
    [network in Network]?: string;
};
declare const PRICE_FEED: {
    [network in Network]?: string;
};
declare const TREASURY_ADDRESS: {
    [network in Network]?: string;
};
declare const ENDPOINT_V2_COMMON: {
    [network in Network]?: string;
};
declare const DVN_FEE_LIB: {
    [network in Network]?: string;
};
declare const EXECUTOR_FEE_LIB: {
    [network in Network]?: string;
};
declare const DEPLOY_TO_OBJECT: {
    [network in Network]?: string;
};

/**
 * Options for initializing the SDK.
 */
interface SdkOptions {
    /**
     * The chain for the SDK (optional).
     * default value is Chain.APTOS
     */
    chain?: Chain;
    /**
     * The provider for the SDK.
     */
    provider: Aptos;
    /**
     * The stage of the SDK (optional).
     * default value is Stage.SANDBOX
     */
    stage?: Stage;
    /**
     * The accounts option (optional).
     * default value is read from generated/addresses.ts
     */
    accounts?: AccountsOption;
}
/**
 * Creates an instance of the SDK from the given provider.
 *
 * @param {Provider} provider - The provider of the current chain. {@link AptosProvider}
 * @param {Stage} [stage] - The stage of the SDK. {@link Stage}
 * @returns {SDK} The initialized SDK instance.
 */
declare function getSDKFromProvider(provider: Provider, stage?: Stage): SDK;
/**
 * The SDK class provides methods to interact with the Aptos.
 * For usage, please check [README.md](../README.md).
 *
 * @implements {MoveSdkImpl<Ed25519Account>}
 */
declare class SDK implements MoveSdkImpl<Ed25519Account> {
    chain: Chain;
    stage: Stage;
    client: Aptos;
    LayerzeroModule: LayerZeroModulesSdk<Ed25519Account>;
    accounts: AccountsOption;
    /**
     * Creates an instance of the SDK.
     *
     * @param {SdkOptions} options - The SDK options.
     */
    constructor(options: SdkOptions);
    /**
     * Gets the Aptos client.
     *
     * @returns {Aptos} The Aptos client.
     */
    getAptosClient(): Aptos;
    /**
     * Sends and confirms an authenticated transaction.
     *
     * @param {Object} args - The arguments for the transaction.
     * @param {SimpleTransaction} args.txn - The transaction to send.
     * @param {AccountAuthenticator} args.auth - The authenticator for the transaction.
     * @returns {Promise<CommittedTransactionResponse>} The response of the committed transaction.
     */
    sendAndConfirmAuthTransaction(args: {
        txn: SimpleTransaction;
        auth: AccountAuthenticator;
    }): Promise<CommittedTransactionResponse>;
    isMoveFunctionId(name: string): boolean;
    /**
     * Sends and confirms a transaction with the given signer and payload.
     *
     * @param {Ed25519Account} signer - The signer of the transaction.
     * @param {InputEntryFunctionData} payload - The payload of the transaction.
     * @param {GasOptions} [gasOptions] - The gas options for the transaction.
     * @returns {Promise<CommittedTransactionResponse>} The response of the committed transaction.
     * @private
     */
    private sendAndConfirmTransaction_;
    /**
     * Handles errors and returns appropriate error instances based on the error type.
     *
     * @param {unknown} e - The error to handle.
     * @returns {unknown} The handled error, which could be an instance of MoveAbortError, MoveResourceNotFoundError, MoveTableItemNotFoundError, UnclassifiedError, or the original error.
     */
    handleError(e: unknown): unknown;
    /**
     * Executes a view function and returns the result.
     * @implements {MoveSdkImpl<Ed25519Account>}
     *
     * @param {Object} args - The arguments for the view function.
     * @param {MoveFunction} args.functionName - The name of the function.
     * @param {EntryFunctionArgumentTypes[]} args.functionArgs - The arguments for the function.
     * @param {string[]} [args.typeArgs] - The type arguments for the function.
     * @returns {Promise<MoveValue[]>} The result of the view function.
     */
    viewFunction(args: {
        functionName: MoveFunction;
        functionArgs: EntryFunctionArgumentTypes[];
        typeArgs?: string[];
    }): Promise<MoveValue[]>;
    /**
     * Normalizes the signer to an Ed25519Account.
     * @implements {MoveSdkImpl<Ed25519Account>}
     *
     * @param {Ed25519Account | PrivateKey | MnemonicAndPath} signer - The signer to normalize.
     * @returns {Ed25519Account} The normalized signer.
     * @throws {Error} If the signer is invalid.
     */
    normalizeSigner(signer: Ed25519Account | PrivateKey | MnemonicAndPath): Ed25519Account;
    /**
     * Converts an account to an address string.
     * @implements {MoveSdkImpl<Ed25519Account>}
     *
     * @param {Ed25519Account} account - The account to convert.
     * @returns {string} The address of the account.
     */
    accountToAddress(account: Ed25519Account): string;
    /**
     * Sends a transaction and waits for confirmation.
     * @implements {MoveSdkImpl<Ed25519Account>}
     *
     * @param {Ed25519Account | PrivateKey | MnemonicAndPath} signer - The signer of the transaction.
     * @param {MoveFunction} func - The function to call.
     * @param {EntryFunctionArgumentTypes[] | SimpleEntryFunctionArgumentTypes[]} args - The arguments for the function.
     * @param {string[]} [_] - Unused parameter.
     * @param {GasOptions} [gasOptions] - The gas options.
     * @param {string[]} [typeArguments] - The type arguments.
     * @returns {Promise<TransactionResponse>} The transaction response.
     */
    sendAndConfirmTransaction(signer: Ed25519Account | PrivateKey | MnemonicAndPath, func: MoveFunction | ByteCode, args: EntryFunctionArgumentTypes[], _?: string[], gasOptions?: GasOptions, typeArguments?: string[]): Promise<TransactionResponse>;
    /**
     * Asserts that the given gas options are valid.
     *
     * @param {GasOptions} [gasOptions] - The gas options to validate.
     * @throws {Error} If the gas options are invalid.
     */
    assertValidGasOptions(gasOptions?: GasOptions): void;
    /**
     * Estimates the gas required for a transaction.
     *
     * @param {Ed25519Account} signer - The signer of the transaction.
     * @param {InputGenerateTransactionPayloadData} payload - The payload of the transaction.
     * @returns {Promise<{ max_gas_amount: string; gas_unit_price: string }>} The estimated gas amount and gas unit price.
     */
    estimateGas(signer: Ed25519Account, payload: InputGenerateTransactionPayloadData): Promise<{
        max_gas_amount: string;
        gas_unit_price: string;
    }>;
    /**
     * Gets an account resource.
     * @implements {MoveSdkImpl<Ed25519Account>}
     *
     * @param {Object} args - The arguments for getting the account resource.
     * @param {AccountAddressInput} args.accountAddress - The account address.
     * @param {MoveStructId} args.resourceType - The type of the resource.
     * @param {LedgerVersionArg} [args.options] - The options for getting the resource.
     * @returns {Promise<T>} The account resource.
     * @template T - The type of the resource.
     * @throws {Error} If the request fails.
     */
    getAccountResource<T extends NonNullable<unknown> = any>(args: {
        accountAddress: AccountAddressInput;
        resourceType: MoveStructId;
        options?: LedgerVersionArg;
    }): Promise<T>;
    /**
     * Gets a table item.
     *
     * @param {Object} args - The arguments for getting the table item.
     * @param {string} args.handle - The table handle.
     * @param {TableItemRequest} args.data - The key of the item.
     * @param {LedgerVersionArg} [args.options] - The options for getting the item.
     * @returns {Promise<T>} The table item.
     * @template T - The type of the item.
     * @throws {Error} If the request fails.
     */
    getTableItem<T>(args: {
        handle: string;
        data: TableItemRequest;
        options?: LedgerVersionArg;
    }): Promise<T>;
    /**
     * Waits for a transaction to be confirmed and returns the transaction response.
     *
     * @param {string} txnHash - The hash of the transaction.
     * @returns {Promise<CommittedTransactionResponse>} The response of the committed transaction.
     * @throws {Error} If the transaction fails.
     * @private
     */
    private waitAndGetTransaction;
    /**
     * Normalizes an address to a string.
     * @implements {MoveSdkImpl<Ed25519Account>}
     *
     * @param {string} address - The address to normalize.
     * @returns {string} The normalized address.
     */
    normalizeAddress(address: string): string;
    /**
     * Checks if the SDK supports coins.
     * @implements {MoveSdkImpl<Ed25519Account>}
     *
     * @returns {boolean} True if the SDK supports coins, false otherwise.
     */
    supportsCoin(): boolean;
    /**
     * Checks if the given address is a valid object address.
     * @param address
     */
    isObjectAddress(address: string): Promise<boolean>;
}

export { COUNTER_V2_ADDRESS, DEPLOY_TO_OBJECT, DVN_301_ADDRESS, DVN_ADDRESS, DVN_FEE_LIB, DVN_UPGRADER_ADDRESS, ENDPOINT_V2_ADDRESS, ENDPOINT_V2_COMMON, EXECUTOR_ADDRESS, EXECUTOR_FEE_LIB, EXECUTOR_ULN301_ADDRESS, GAS_LIMIT_SAFETY_BPS, LAYERZERO_VIEWS_ADDRESS, OFT_ADDRESS, PRICE_FEED, SDK, SIMPLE_MESSAGE_LIB_ADDRESS, type SdkOptions, TREASURY_ADDRESS, ULN_MESSAGE_LIB_ADDRESS, WORKER_COMMON, applyGasLimitSafety, getSDKFromProvider };
