import type { Bip44Account } from "@metamask/account-api";
import type { EntropySourceId, KeyringAccount } from "@metamask/keyring-api";
import type { MultichainAccountGroup } from "./MultichainAccountGroup.cjs";
import { MultichainAccountWallet } from "./MultichainAccountWallet.cjs";
import { EvmAccountProviderConfig, Bip44AccountProvider, EVM_ACCOUNT_PROVIDER_NAME, BtcAccountProviderConfig, TrxAccountProviderConfig, BTC_ACCOUNT_PROVIDER_NAME, TRX_ACCOUNT_PROVIDER_NAME } from "./providers/index.cjs";
import { SOL_ACCOUNT_PROVIDER_NAME, SolAccountProviderConfig } from "./providers/SolAccountProvider.cjs";
import type { MultichainAccountServiceConfig, MultichainAccountServiceMessenger } from "./types.cjs";
/**
 * Per-account failure detail attached to the aggregated Sentry report
 * produced by {@link MultichainAccountService.removeMultichainAccountWallet}.
 *
 * Names the on-the-wire shape so consumers reading the Sentry context (and
 * tests asserting on it) have one place to look.
 */
export type RemoveMultichainAccountWalletFailure = {
    provider: string;
    accountId?: Bip44Account<KeyringAccount>['id'];
    error: unknown;
};
/**
 * Aggregated context payload attached to the Sentry report produced by
 * {@link MultichainAccountService.removeMultichainAccountWallet} when one
 * or more per-account deletions fail.
 */
export type RemoveMultichainAccountWalletFailureContext = {
    failures: RemoveMultichainAccountWalletFailure[];
};
export declare const serviceName = "MultichainAccountService";
/**
 * The options that {@link MultichainAccountService} takes.
 */
export type MultichainAccountServiceOptions = {
    messenger: MultichainAccountServiceMessenger;
    providers?: Bip44AccountProvider[];
    providerConfigs?: {
        [EVM_ACCOUNT_PROVIDER_NAME]?: EvmAccountProviderConfig;
        [SOL_ACCOUNT_PROVIDER_NAME]?: SolAccountProviderConfig;
        [BTC_ACCOUNT_PROVIDER_NAME]?: BtcAccountProviderConfig;
        [TRX_ACCOUNT_PROVIDER_NAME]?: TrxAccountProviderConfig;
    };
    config?: MultichainAccountServiceConfig;
};
/**
 * The keys used to identify an account in the service state.
 */
export type StateKeys = {
    entropySource: EntropySourceId;
    groupIndex: number;
    providerName: string;
};
/**
 * The service state.
 */
export type ServiceState = {
    [entropySource: StateKeys['entropySource']]: {
        [groupIndex: string]: {
            [providerName: StateKeys['providerName']]: Bip44Account<KeyringAccount>['id'][];
        };
    };
};
export type CreateWalletParams = {
    type: 'restore';
    password: string;
    mnemonic: Uint8Array;
} | {
    type: 'import';
    mnemonic: Uint8Array;
} | {
    type: 'create';
    password: string;
};
/**
 * Service to expose multichain accounts capabilities.
 */
export declare class MultichainAccountService {
    #private;
    /**
     * The name of the service.
     */
    name: typeof serviceName;
    /**
     * Constructs a new MultichainAccountService.
     *
     * @param options - The options.
     * @param options.messenger - The messenger suited to this
     * MultichainAccountService.
     * @param options.providers - Optional list of account
     * @param options.providerConfigs - Optional provider configs
     * @param options.config - Optional config.
     */
    constructor({ messenger, providers, providerConfigs, config, }: MultichainAccountServiceOptions);
    /**
     * Initialize the service and constructs the internal reprensentation of
     * multichain accounts and wallets.
     */
    init(): Promise<void>;
    /**
     * Re-synchronize MetaMask accounts and the providers accounts if needed.
     *
     * NOTE: This is mostly required if one of the providers (keyrings or Snaps)
     * have different sets of accounts. This method would ensure that both are
     * in-sync and use the same accounts (and same IDs).
     *
     * READ THIS CAREFULLY (State inconsistency bugs/de-sync)
     * We've seen some problems were keyring accounts on some Snaps were not synchronized
     * with the accounts on MM side. This causes problems where we cannot interact with
     * those accounts because the Snap does know about them.
     * To "workaround" this de-sync problem for now, we make sure that both parties are
     * in-sync when the service boots up.
     * ----------------------------------------------------------------------------------
     */
    resyncAccounts(): Promise<void>;
    /**
     * Gets a reference to the multichain account wallet matching this entropy source.
     *
     * @param options - Options.
     * @param options.entropySource - The entropy source of the multichain account.
     * @throws If none multichain account match this entropy.
     * @returns A reference to the multichain account wallet.
     */
    getMultichainAccountWallet({ entropySource, }: {
        entropySource: EntropySourceId;
    }): MultichainAccountWallet<Bip44Account<KeyringAccount>>;
    /**
     * Gets an array of all multichain account wallets.
     *
     * @returns An array of all multichain account wallets.
     */
    getMultichainAccountWallets(): MultichainAccountWallet<Bip44Account<KeyringAccount>>[];
    /**
     * Creates a new multichain account wallet by either importing an existing mnemonic,
     * creating a new vault and keychain, or restoring a vault and keyring.
     *
     * NOTE: This method should only be called in client code where a mutex lock is acquired.
     * `discoverAccounts` should be called after this method to discover and create accounts.
     *
     * @param params - The parameters to use to create the new wallet.
     * @param params.mnemonic - The mnemonic to use to create the new wallet.
     * @param params.password - The password to encrypt the vault with.
     * @param params.type - The flow type to use to create the new wallet.
     * @throws If the mnemonic has already been imported.
     * @returns The new multichain account wallet.
     */
    createMultichainAccountWallet(params: CreateWalletParams): Promise<MultichainAccountWallet<Bip44Account<KeyringAccount>>>;
    /**
     * Removes a multichain account wallet, deleting all of its accounts across
     * every registered provider (EVM and snap-based).
     *
     * The deletion iterates providers (the source of truth for their own
     * account lists) and filters each provider's accounts to those matching
     * the wallet's entropy source. Cleanup is best-effort end-to-end: neither
     * a single account deletion failure nor a failure to enumerate a given
     * provider's accounts aborts cleanup of the remaining providers. If one or
     * more operations fail, a single aggregated error is reported via
     * `reportError` with all per-failure details in its context. The wallet is
     * always removed from the service's internal map at the end.
     *
     * @param entropySource - The entropy source of the multichain account wallet.
     */
    removeMultichainAccountWallet(entropySource: EntropySourceId): Promise<void>;
    /**
     * Gets a reference to the multichain account group matching this entropy source
     * and a group index.
     *
     * @param options - Options.
     * @param options.entropySource - The entropy source of the multichain account.
     * @param options.groupIndex - The group index of the multichain account.
     * @throws If none multichain account match this entropy source and group index.
     * @returns A reference to the multichain account.
     */
    getMultichainAccountGroup({ entropySource, groupIndex, }: {
        entropySource: EntropySourceId;
        groupIndex: number;
    }): MultichainAccountGroup<Bip44Account<KeyringAccount>>;
    /**
     * Gets all multichain account groups for a given entropy source.
     *
     * @param options - Options.
     * @param options.entropySource - The entropy source to query.
     * @throws If no multichain accounts match this entropy source.
     * @returns A list of all multichain accounts.
     */
    getMultichainAccountGroups({ entropySource, }: {
        entropySource: EntropySourceId;
    }): MultichainAccountGroup<Bip44Account<KeyringAccount>>[];
    /**
     * Creates the next multichain account group.
     *
     * @param options - Options.
     * @param options.entropySource - The wallet's entropy source.
     * @returns The next multichain account group.
     */
    createNextMultichainAccountGroup({ entropySource, }: {
        entropySource: EntropySourceId;
    }): Promise<MultichainAccountGroup<Bip44Account<KeyringAccount>>>;
    /**
     * Creates a multichain account group.
     *
     * @param options - Options.
     * @param options.groupIndex - The group index to use.
     * @param options.entropySource - The wallet's entropy source.
     * @returns The multichain account group for this group index.
     */
    createMultichainAccountGroup({ groupIndex, entropySource, }: {
        groupIndex: number;
        entropySource: EntropySourceId;
    }): Promise<MultichainAccountGroup<Bip44Account<KeyringAccount>>>;
    /**
     * Creates multiple multichain account groups up to maxGroupIndex.
     *
     * @param params - Parameters for creating account groups.
     * @param params.fromGroupIndex - Starting group index to create (inclusive) (defaults to 0).
     * @param params.toGroupIndex - Maximum group index to create (inclusive).
     * @param params.entropySource - The entropy source ID.
     * @returns Array of created multichain account groups.
     */
    createMultichainAccountGroups({ fromGroupIndex, toGroupIndex, entropySource, }: {
        fromGroupIndex?: number;
        toGroupIndex: number;
        entropySource: EntropySourceId;
    }): Promise<MultichainAccountGroup<Bip44Account<KeyringAccount>>[]>;
    /**
     * Set basic functionality state and trigger alignment if enabled.
     * When basic functionality is disabled, snap-based providers are disabled.
     * When enabled, all snap providers are enabled and wallet alignment is triggered.
     * EVM providers are never disabled as they're required for basic wallet functionality.
     *
     * @param enabled - Whether basic functionality is enabled.
     */
    setBasicFunctionality(enabled: boolean): Promise<void>;
    /**
     * Align all multichain account wallets.
     */
    alignWallets(): Promise<void>;
    /**
     * Align a specific multichain account wallet.
     *
     * @param entropySource - The entropy source of the multichain account wallet.
     */
    alignWallet(entropySource: EntropySourceId): Promise<void>;
}
//# sourceMappingURL=MultichainAccountService.d.cts.map