import type { PrivateEventFilter } from '@aztec/aztec.js/wallet'; import { Fr } from '@aztec/foundation/curves/bn254'; import { type Logger } from '@aztec/foundation/log'; import { SerialQueue } from '@aztec/foundation/queue'; import { KeyStore } from '@aztec/key-store'; import type { AztecAsyncKVStore } from '@aztec/kv-store'; import { type ProtocolContractsProvider } from '@aztec/protocol-contracts'; import type { CircuitSimulator } from '@aztec/simulator/client'; import { type ContractArtifact, EventSelector, FunctionCall } from '@aztec/stdlib/abi'; import type { AuthWitness } from '@aztec/stdlib/auth-witness'; import type { AztecAddress } from '@aztec/stdlib/aztec-address'; import { CompleteAddress, type ContractInstanceWithAddress, type PartialAddress } from '@aztec/stdlib/contract'; import type { AztecNode, PrivateKernelProver } from '@aztec/stdlib/interfaces/client'; import { DirectionalAppTaggingSecret } from '@aztec/stdlib/logs'; import { BlockHeader, type InTx, SimulationOverrides, TxExecutionRequest, TxProfileResult, TxProvingResult, TxSimulationResult, UtilitySimulationResult } from '@aztec/stdlib/tx'; import type { AccessScopes } from './access_scopes.js'; import { BlockSynchronizer } from './block_synchronizer/index.js'; import type { PXEConfig } from './config/index.js'; import { ContractSyncService } from './contract_sync/contract_sync_service.js'; import { PXEDebugUtils } from './debug/pxe_debug_utils.js'; import { JobCoordinator } from './job_coordinator/job_coordinator.js'; import { AddressStore } from './storage/address_store/address_store.js'; import { AnchorBlockStore } from './storage/anchor_block_store/anchor_block_store.js'; import { CapsuleStore } from './storage/capsule_store/capsule_store.js'; import { ContractStore } from './storage/contract_store/contract_store.js'; import { NoteStore } from './storage/note_store/note_store.js'; import { PrivateEventStore } from './storage/private_event_store/private_event_store.js'; import { RecipientTaggingStore } from './storage/tagging_store/recipient_tagging_store.js'; import { SenderAddressBookStore } from './storage/tagging_store/sender_address_book_store.js'; import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store.js'; export type PackedPrivateEvent = InTx & { packedEvent: Fr[]; eventSelector: EventSelector; }; /** Options for PXE.profileTx. */ export type ProfileTxOpts = { /** The profiling mode to use. */ profileMode: 'full' | 'execution-steps' | 'gates'; /** If true, proof generation is skipped during profiling. Defaults to true. */ skipProofGeneration?: boolean; /** Addresses whose private state and keys are accessible during private execution. */ scopes: AccessScopes; }; /** Options for PXE.simulateTx. */ export type SimulateTxOpts = { /** Whether to simulate the public part of the transaction. */ simulatePublic: boolean; /** If false, this function throws if the transaction is unable to be included in a block at the current state. */ skipTxValidation?: boolean; /** If false, fees are enforced. */ skipFeeEnforcement?: boolean; /** State overrides for the simulation, such as contract instances and artifacts. */ overrides?: SimulationOverrides; /** Addresses whose private state and keys are accessible during private execution */ scopes: AccessScopes; }; /** Options for PXE.simulateUtility. */ export type SimulateUtilityOpts = { /** The authentication witnesses required for the function call. */ authwits?: AuthWitness[]; /** The accounts whose notes we can access in this call */ scopes: AccessScopes; }; /** Args for PXE.create. */ export type PXECreateArgs = { /** The Aztec node to connect to. */ node: AztecNode; /** The key-value store for persisting PXE state. */ store: AztecAsyncKVStore; /** The prover for generating private kernel proofs. */ proofCreator: PrivateKernelProver; /** The circuit simulator for executing ACIR circuits. */ simulator: CircuitSimulator; /** Provider for protocol contract artifacts and instances. */ protocolContractsProvider: ProtocolContractsProvider; /** PXE configuration options. */ config: PXEConfig; /** Optional logger instance or string suffix for the logger name. */ loggerOrSuffix?: string | Logger; }; /** * Private eXecution Environment (PXE) is a library used by wallets to simulate private phase of transactions and to * manage private state of users. */ export declare class PXE { #private; private node; private blockStateSynchronizer; protected keyStore: KeyStore; private contractStore; private noteStore; private capsuleStore; private anchorBlockStore; protected senderTaggingStore: SenderTaggingStore; private senderAddressBookStore; private recipientTaggingStore; protected addressStore: AddressStore; private privateEventStore; private contractSyncService; private simulator; private proverEnabled; private proofCreator; protected protocolContractsProvider: ProtocolContractsProvider; protected log: Logger; private jobQueue; private jobCoordinator; debug: PXEDebugUtils; protected constructor(node: AztecNode, blockStateSynchronizer: BlockSynchronizer, keyStore: KeyStore, contractStore: ContractStore, noteStore: NoteStore, capsuleStore: CapsuleStore, anchorBlockStore: AnchorBlockStore, senderTaggingStore: SenderTaggingStore, senderAddressBookStore: SenderAddressBookStore, recipientTaggingStore: RecipientTaggingStore, addressStore: AddressStore, privateEventStore: PrivateEventStore, contractSyncService: ContractSyncService, simulator: CircuitSimulator, proverEnabled: boolean, proofCreator: PrivateKernelProver, protocolContractsProvider: ProtocolContractsProvider, log: Logger, jobQueue: SerialQueue, jobCoordinator: JobCoordinator, debug: PXEDebugUtils); /** * Creates an instance of a PXE by instantiating all the necessary data providers and services. * Also triggers the registration of the protocol contracts and makes sure the provided node * can be contacted. * * @returns A promise that resolves PXE is ready to be used. */ static create({ node, store, proofCreator, simulator, protocolContractsProvider, config, loggerOrSuffix }: PXECreateArgs): Promise; protected registerProtocolContracts(): Promise; /** * Returns the block header up to which the PXE has synced. * @returns The synced block header */ getSyncedBlockHeader(): Promise; /** * Returns the contract instance for a given address, if it's registered in the PXE. * @param address - The contract address. * @returns The contract instance if found, undefined otherwise. */ getContractInstance(address: AztecAddress): Promise; /** * Returns the contract artifact for a given contract class id, if it's registered in the PXE. * @param id - Identifier of the contract class. * @returns The contract artifact if found, undefined otherwise. */ getContractArtifact(id: Fr): Promise; /** * Registers a user account in PXE given its master encryption private key. * Once a new account is registered, the PXE will trial-decrypt all published notes on * the chain and store those that correspond to the registered account. Will do nothing if the * account is already registered. * * @param secretKey - Secret key of the corresponding user master public key. * @param partialAddress - The partial address of the account contract corresponding to the account being registered. * @returns The complete address of the account. */ registerAccount(secretKey: Fr, partialAddress: PartialAddress): Promise; /** * Registers a sender in this PXE. * * After registering a new sender, the PXE will sync private logs that are tagged with this sender's address. * Will do nothing if the address is already registered. * * @param sender - Address of the sender to register. * @returns The address of the sender. * TODO: It's strange that we return the address here and I (benesjan) think we should drop the return value. */ registerSender(sender: AztecAddress): Promise; /** * Retrieves senders registered in this PXE. * @returns Senders registered in this PXE. */ getSenders(): Promise; /** * Removes a sender registered in this PXE. * @param sender - The address of the sender to remove. */ removeSender(sender: AztecAddress): Promise; /** * Retrieves the user accounts registered on this PXE. * @returns An array of the accounts registered on this PXE. */ getRegisteredAccounts(): Promise; /** * Registers a contract class in the PXE without registering any associated contract instance with it. * * @param artifact - The build artifact for the contract class. */ registerContractClass(artifact: ContractArtifact): Promise; /** * Adds deployed contracts to the PXE. Deployed contract information is used to access the * contract code when simulating local transactions. This is automatically called by aztec.js when * deploying a contract. Dapps that wish to interact with contracts already deployed should register * these contracts in their users' PXE through this method. * * @param contract - A contract instance to register, with an optional artifact which can be omitted if the contract class has already been registered. */ registerContract(contract: { instance: ContractInstanceWithAddress; artifact?: ContractArtifact; }): Promise; /** * Updates a deployed contract in the PXE. This is used to update the contract artifact when * an update has happened, so the new code can be used in the simulation of local transactions. * This is called by aztec.js when instantiating a contract in a given address with a mismatching artifact. * @param contractAddress - The address of the contract to update. * @param artifact - The updated artifact for the contract. * @throws If the artifact's contract class is not found in the PXE or if the contract class is different from * the current one (current one from the point of view of the node to which the PXE is connected). */ updateContract(contractAddress: AztecAddress, artifact: ContractArtifact): Promise; /** * Retrieves the addresses of contracts added to this PXE. * @returns An array of contracts addresses registered on this PXE. */ getContracts(): Promise; /** * Proves the private portion of a simulated transaction, ready to send to the network * (where validators prove the public portion). * * @param txRequest - An authenticated tx request ready for proving * @param scopes - Addresses whose private state and keys are accessible during private execution. * @returns A result containing the proof and public inputs of the tail circuit. * @throws If contract code not found, or public simulation reverts. * Also throws if simulatePublic is true and public simulation reverts. */ proveTx(txRequest: TxExecutionRequest, scopes: AztecAddress[]): Promise; /** * Profiles a transaction, reporting gate counts (unless disabled) and returns an execution trace. * @param txRequest - An authenticated tx request ready for simulation. * @returns A trace of the program execution with gate counts. * @throws If the code for the functions executed in this transaction have not been made available via `addContracts`. */ profileTx(txRequest: TxExecutionRequest, { profileMode, skipProofGeneration, scopes }: ProfileTxOpts): Promise; /** * Simulates a transaction based on the provided preauthenticated execution request. * This will run a local simulation of private execution (and optionally of public as well), run the * kernel circuits to ensure adherence to protocol rules (without generating a proof), and return the * simulation results . * * * Note that this is used with `ContractFunctionInteraction::simulateTx` to bypass certain checks. * In that case, the transaction returned is only potentially ready to be sent to the network for execution. * * * @param txRequest - An authenticated tx request ready for simulation. * @returns A simulated transaction result object that includes public and private return values. * @throws If the code for the functions executed in this transaction have not been made available via `addContracts`. * Also throws if simulatePublic is true and public simulation reverts. * * TODO(#7456) Prevent msgSender being defined here for the first call */ simulateTx(txRequest: TxExecutionRequest, { simulatePublic, skipTxValidation, skipFeeEnforcement, overrides, scopes }: SimulateTxOpts): Promise; /** * Simulates the execution of a contract utility function. * @param call - The function call containing the function details, arguments, and target contract address. */ simulateUtility(call: FunctionCall, { authwits, scopes }?: SimulateUtilityOpts): Promise; /** * Returns the private events given search parameters. * @param eventSelector - Event selector to search for. * @param filter * contractAddress - The address of the contract to get events from. Required. * scopes - One or more event scope addresses to filter by. Required. * fromBlock - The block number to search from (inclusive). Optional. If provided, it must be >= 0. * Defaults to 0. * If toBlock is defined but fromBlock is not, fromBlock defaults to toBlock - 1. * toBlock - The block number to search up to (exclusive). Optional. If provided, it must be > 0. * Defaults to the latest known block to PXE + 1. * @returns - The packed events with block and tx metadata. */ getPrivateEvents(eventSelector: EventSelector, filter: PrivateEventFilter): Promise; /** * Export tagging secrets for a given account and set of apps. * * These secrets allow an auditor to discover which notes belong to the user * without being able to decrypt them. * * @param account - The account to export secrets for * @param apps - Contract addresses to export secrets for * @param counterparties - Optional explicit list of counterparties. If not provided, * uses registered senders + own accounts. * @returns A serializable export containing all tagging secrets */ exportTaggingSecrets(account: AztecAddress, apps: AztecAddress[], counterparties?: AztecAddress[]): Promise; /** * Stops the PXE's job queue. */ stop(): Promise; } /** Direction of note flow relative to the user. */ export type NoteDirection = 'inbound' | 'outbound'; /** A tagging secret with metadata about its direction and counterparty. */ export interface TaggingSecretEntry { secret: DirectionalAppTaggingSecret; direction: NoteDirection; counterparty: AztecAddress; app: AztecAddress; label?: string; } /** Complete export of tagging secrets for an account. */ export interface TaggingSecretExport { account: AztecAddress; secrets: TaggingSecretEntry[]; exportedAt: number; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHhlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHhlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFakUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBcUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekQsT0FBTyxFQUFFLEtBQUsseUJBQXlCLEVBQXlCLE1BQU0sMkJBQTJCLENBQUM7QUFDbEcsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsS0FBSyxnQkFBZ0IsRUFDckIsYUFBYSxFQUNiLFlBQVksRUFHYixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFDTCxlQUFlLEVBQ2YsS0FBSywyQkFBMkIsRUFDaEMsS0FBSyxjQUFjLEVBR3BCLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFNdEYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakUsT0FBTyxFQUNMLFdBQVcsRUFFWCxLQUFLLElBQUksRUFLVCxtQkFBbUIsRUFHbkIsa0JBQWtCLEVBQ2xCLGVBQWUsRUFD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