@alchemy/aa-core
Version:
viem based SDK that enables interactions with ERC-4337 Smart Accounts. ABIs are based off the definitions generated in @account-abstraction/contracts
412 lines (388 loc) • 16.9 kB
text/typescript
import {
type Address,
type Hash,
type Hex,
type StateOverride,
type TransactionReceipt,
} from "viem";
import type { z } from "zod";
import type {
UserOperationFeeOptionsFieldSchema,
UserOperationFeeOptionsSchema,
UserOperationFeeOptionsSchema_v6,
UserOperationFeeOptionsSchema_v7,
} from "./client/schema";
import type { EntryPointVersion } from "./entrypoint/types";
import type {
BigNumberishRangeSchema,
BigNumberishSchema,
MultiplierSchema,
NoUndefined,
} from "./utils";
export type EmptyHex = `0x`;
export type NullAddress = `0x0`;
// based on @account-abstraction/common
export type PromiseOrValue<T> = T | Promise<T>;
export type BytesLike = Uint8Array | Hex;
export type Multiplier = z.input<typeof MultiplierSchema>;
export type BigNumberish = z.input<typeof BigNumberishSchema>;
export type BigNumberishRange = z.input<typeof BigNumberishRangeSchema>;
// [!region UserOperationCallData]
export type UserOperationCallData =
| {
/* the target of the call */
target: Address;
/* the data passed to the target */
data: Hex;
/* the amount of native token to send to the target (default: 0) */
value?: bigint;
}
| Hex;
// [!endregion UserOperationCallData]
// [!region BatchUserOperationCallData]
export type BatchUserOperationCallData = Exclude<UserOperationCallData, Hex>[];
// [!endregion BatchUserOperationCallData]
export type UserOperationFeeOptionsField = z.input<
typeof UserOperationFeeOptionsFieldSchema
>;
export type UserOperationFeeOptions<
TEntryPointVersion extends EntryPointVersion = EntryPointVersion
> = TEntryPointVersion extends "0.6.0"
? z.input<typeof UserOperationFeeOptionsSchema_v6>
: TEntryPointVersion extends "0.7.0"
? z.input<typeof UserOperationFeeOptionsSchema_v7>
: z.input<typeof UserOperationFeeOptionsSchema>;
export type UserOperationOverridesParameter<
TEntryPointVersion extends EntryPointVersion = EntryPointVersion,
Required extends boolean = false
> = Required extends true
? { overrides: UserOperationOverrides<TEntryPointVersion> }
: { overrides?: UserOperationOverrides<TEntryPointVersion> };
// [!region UserOperationPaymasterOverrides]
export type UserOperationPaymasterOverrides<
TEntryPointVersion extends EntryPointVersion = EntryPointVersion
> = TEntryPointVersion extends "0.6.0"
? {
// paymasterData overrides to bypass paymaster middleware
paymasterAndData: Hex;
}
: TEntryPointVersion extends "0.7.0"
? {
// paymasterData overrides to bypass paymaster middleware
// if set to '0x', all paymaster related fields are omitted from the user op request
paymasterData: Hex;
paymaster: Address;
paymasterVerificationGasLimit:
| NoUndefined<
UserOperationStruct<"0.7.0">["paymasterVerificationGasLimit"]
>
| Multiplier;
paymasterPostOpGasLimit:
| NoUndefined<UserOperationStruct<"0.7.0">["paymasterPostOpGasLimit"]>
| Multiplier;
}
: {};
// [!endregion UserOperationOverridesParameter]
// [!region UserOperationOverrides]
export type UserOperationOverrides<
TEntryPointVersion extends EntryPointVersion = EntryPointVersion
> = Partial<
{
callGasLimit:
| UserOperationStruct<TEntryPointVersion>["callGasLimit"]
| Multiplier;
maxFeePerGas:
| UserOperationStruct<TEntryPointVersion>["maxFeePerGas"]
| Multiplier;
maxPriorityFeePerGas:
| UserOperationStruct<TEntryPointVersion>["maxPriorityFeePerGas"]
| Multiplier;
preVerificationGas:
| UserOperationStruct<TEntryPointVersion>["preVerificationGas"]
| Multiplier;
verificationGasLimit:
| UserOperationStruct<TEntryPointVersion>["verificationGasLimit"]
| Multiplier;
/**
* This can be used to override the key used when calling `entryPoint.getNonce`
* It is useful when you want to use parallel nonces for user operations
*
* NOTE: not all bundlers fully support this feature and it could be that your bundler will still only include
* one user operation for your account in a bundle
*/
nonceKey: bigint;
/**
* The same state overrides for
* [`eth_call`](https://geth.ethereum.org/docs/interacting-with-geth/rpc/ns-eth#eth-call) method.
* An address-to-state mapping, where each entry specifies some state to be ephemerally overridden
* prior to executing the call. State overrides allow you to customize the network state for
* the purpose of the simulation, so this feature is useful when you need to estimate gas
* for user operation scenarios under conditions that aren’t currently present on the live network.
*/
stateOverride: StateOverride;
} & UserOperationPaymasterOverrides<TEntryPointVersion>
>;
// [!endregion UserOperationOverrides]
// [!region UserOperationRequest_v6]
// represents the request as it needs to be formatted for v0.6 RPC requests
// Reference: https://github.com/ethereum/ERCs/blob/8dd085d159cb123f545c272c0d871a5339550e79/ERCS/erc-4337.md#definitions
export interface UserOperationRequest_v6 {
/* the origin of the request */
sender: Address;
/* nonce (as hex) of the transaction, returned from the entry point for this Address */
nonce: Hex;
/* the initCode for creating the sender if it does not exist yet, otherwise "0x" */
initCode: Hex | EmptyHex;
/* the callData passed to the target */
callData: Hex;
/* Gas value (as hex) used by inner account execution */
callGasLimit: Hex;
/* Actual gas (as hex) used by the validation of this UserOperation */
verificationGasLimit: Hex;
/* Gas overhead (as hex) of this UserOperation */
preVerificationGas: Hex;
/* Maximum fee per gas (similar to EIP-1559 max_fee_per_gas) (as hex)*/
maxFeePerGas: Hex;
/* Maximum priority fee per gas (similar to EIP-1559 max_priority_fee_per_gas) (as hex)*/
maxPriorityFeePerGas: Hex;
/* Address of paymaster sponsoring the transaction, followed by extra data to send to the paymaster ("0x" for self-sponsored transaction) */
paymasterAndData: Hex | EmptyHex;
/* Data passed into the account along with the nonce during the verification step */
signature: Hex;
}
// [!endregion UserOperationRequest_v6]
// [!region UserOperationRequest_v7]
// represents the request as it needs to be formatted for v0.7 RPC requests
// Reference: https://eips.ethereum.org/EIPS/eip-4337#definitions
export interface UserOperationRequest_v7 {
/* the account making the operation */
sender: Address;
/* anti-replay parameter. nonce of the transaction, returned from the entry point for this address */
nonce: Hex;
/* account factory, only for new accounts */
factory?: Address;
/* data for account factory (only if account factory exists) */
factoryData?: Hex;
/* the data to pass to the sender during the main execution call */
callData: Hex;
/* the amount of gas to allocate the main execution call */
callGasLimit: Hex;
/* the amount of gas to allocate for the verification step */
verificationGasLimit: Hex;
/* extra gas to pay the bunder */
preVerificationGas: Hex;
/* maximum fee per gas (similar to EIP-1559 max_fee_per_gas) */
maxFeePerGas: Hex;
/* maximum priority fee per gas (similar to EIP-1559 max_priority_fee_per_gas) */
maxPriorityFeePerGas: Hex;
/* address of paymaster contract, (or empty, if account pays for itself) */
paymaster?: Address;
/* the amount of gas to allocate for the paymaster validation code */
paymasterVerificationGasLimit?: Hex;
/* the amount of gas to allocate for the paymaster post-operation code */
paymasterPostOpGasLimit?: Hex;
/* data for paymaster (only if paymaster exists) */
paymasterData?: Hex;
/* data passed into the account to verify authorization */
signature: Hex;
}
// [!endregion UserOperationRequest_v7]
// [!region UserOperationRequest]
// Reference: https://eips.ethereum.org/EIPS/eip-4337#definitions
export type UserOperationRequest<
TEntryPointVersion extends EntryPointVersion = EntryPointVersion
> = TEntryPointVersion extends "0.6.0"
? UserOperationRequest_v6
: TEntryPointVersion extends "0.7.0"
? UserOperationRequest_v7
: never;
// [!endregion UserOperationRequest]
// [!region UserOperationEstimateGasResponse]
export interface UserOperationEstimateGasResponse<
TEntryPointVersion extends EntryPointVersion = EntryPointVersion
> {
/* Gas overhead of this UserOperation */
preVerificationGas: BigNumberish;
/* Actual gas used by the validation of this UserOperation */
verificationGasLimit: BigNumberish;
/* Value used by inner account execution */
callGasLimit: BigNumberish;
/*
* EntryPoint v0.7.0 operations only.
* The amount of gas to allocate for the paymaster validation code.
* Note: `eth_estimateUserOperationGas` does not return paymasterPostOpGasLimit.
*/
paymasterVerificationGasLimit: TEntryPointVersion extends "0.7.0"
? BigNumberish | undefined
: never;
}
// [!endregion UserOperationEstimateGasResponse]
// [!region UserOperationResponse]
export interface UserOperationResponse<
TEntryPointVersion extends EntryPointVersion = EntryPointVersion
> {
/* the User Operation */
userOperation: UserOperationRequest<TEntryPointVersion>;
/* the address of the entry point contract that executed the user operation */
entryPoint: Address;
/* the block number the user operation was included in */
blockNumber: BigNumberish;
/* the hash of the block the user operation was included in */
blockHash: Hash;
/* the hash of the transaction that included the user operation */
transactionHash: Hash;
}
// [!endregion UserOperationResponse]
// [!region UserOperationReceipt]
export interface UserOperationReceipt {
/* The request hash of the UserOperation. */
userOpHash: Hash;
/* The entry point address used for the UserOperation. */
entryPoint: Address;
/* The account initiating the UserOperation. */
sender: Address;
/* The nonce used in the UserOperation. */
nonce: BigNumberish;
/* The paymaster used for this UserOperation (or empty). */
paymaster?: Address;
/* The actual amount paid (by account or paymaster) for this UserOperation. */
actualGasCost: BigNumberish;
/* The total gas used by this UserOperation (including preVerification, creation, validation, and execution). */
actualGasUsed: BigNumberish;
/* Indicates whether the execution completed without reverting. */
success: boolean;
/* In case of revert, this is the revert reason. */
reason?: string;
/* The logs generated by this UserOperation (not including logs of other UserOperations in the same bundle). */
logs: string[];
/* The TransactionReceipt object for the entire bundle, not only for this UserOperation. */
receipt: TransactionReceipt;
}
// [!endregion UserOperationReceipt]
/** @deprecated use viem type TransactionReceipt instead */
export interface UserOperationReceiptObject {
/* 32 Bytes - hash of the block where this log was in. null when its pending. null when its pending log */
blockHash: Hash;
/* The block number where this log was in. null when its pending. null when its pending log. */
blockNumber: BigNumberish;
/* The index of the transaction within the block. */
transactionIndex: BigNumberish;
/* 32 Bytes - hash of the transaction. null when its pending. */
transactionHash: Hash;
/* 20 Bytes - address of the sender */
from: Address;
/* 20 Bytes - address of the receiver. null when its a contract creation transaction */
to: Address;
/* The total amount of gas used when this transaction was executed in the block. */
cumulativeGasUsed: BigNumberish;
/* The amount of gas used by this specific transaction alone */
gasUsed: BigNumberish;
/* 20 Bytes - The contract address created, if the transaction was a contract creation, otherwise null */
contractAddress: Address;
logs: UserOperationReceiptLog[];
/* 256 Bytes - Bloom filter for light clients to quickly retrieve related logs */
logsBloom: Hex;
/* 32 bytes of post-transaction stateroot. (pre Byzantium hard fork at block 4,370,000) */
root: Hex;
/* Either 1 (success) or 0 (failure). (post Byzantium hard fork at block 4,370,000) */
status: number;
/* The cumulative gas used in the block containing this UserOperation. */
effectiveGasPrice: BigNumberish;
/* The type of the recipt object */
type: string;
}
/** @deprecated use viem type Log instead */
/* https://github.com/wevm/viem/blob/6ef4ac131a878bf1dc4b335f5dc127e62618dda0/src/types/log.ts#L15 */
export interface UserOperationReceiptLog {
/* The hash of the block where the given transaction was included. */
blockHash: Hash;
/* The number of the block where the given transaction was included. */
blockNumber: BigNumberish;
/* The index of the transaction within the block. */
transactionIndex: BigNumberish;
/* 20 Bytes - address from which this log originated. */
address: Address;
/* Integer of the log index position in the block. null when its pending log. */
logIndex: BigNumberish;
/* Contains one or more 32 Bytes non-indexed arguments of the log. */
data: Hex;
/* true when the log was removed, due to a chain reorganization. false if its a valid log. */
removed: boolean;
/* Array of zero to four 32 Bytes DATA of indexed log arguments. */
topics: string[];
/* hash of the transaction */
transactionHash: Hash;
}
// [!region UserOperationStruct_v6]
// https://github.com/eth-infinitism/account-abstraction/blob/releases/v0.6/test/UserOperation.ts
// this is used for building requests for v0.6 entry point contract
export interface UserOperationStruct_v6 {
/* the origin of the request */
sender: string;
/* nonce of the transaction, returned from the entry point for this address */
nonce: BigNumberish;
/* the initCode for creating the sender if it does not exist yet, otherwise "0x" */
initCode: BytesLike | "0x";
/* the callData passed to the target */
callData: BytesLike;
/* Value used by inner account execution */
callGasLimit?: BigNumberish;
/* Actual gas used by the validation of this UserOperation */
verificationGasLimit?: BigNumberish;
/* Gas overhead of this UserOperation */
preVerificationGas?: BigNumberish;
/* Maximum fee per gas (similar to EIP-1559 max_fee_per_gas) */
maxFeePerGas?: BigNumberish;
/* Maximum priority fee per gas (similar to EIP-1559 max_priority_fee_per_gas) */
maxPriorityFeePerGas?: BigNumberish;
/* Address of paymaster sponsoring the transaction, followed by extra data to send to the paymaster ("0x" for self-sponsored transaction) */
paymasterAndData: BytesLike | "0x";
/* Data passed into the account along with the nonce during the verification step */
signature: BytesLike;
}
// [!endregion UserOperationStruct_v6]
// [!region UserOperationStruct_v7]
// based on https://github.com/eth-infinitism/account-abstraction/blob/releases/v0.7/test/UserOperation.ts
// this is used for building requests for v0.7 entry point contract
export interface UserOperationStruct_v7 {
/* the account making the operation */
sender: string;
/* anti-replay parameter. nonce of the transaction, returned from the entry point for this address */
nonce: BigNumberish;
/* account factory, only for new accounts */
factory?: string;
/* data for account factory (only if account factory exists) */
factoryData?: BytesLike;
/* the data to pass to the sender during the main execution call */
callData: BytesLike;
/* the amount of gas to allocate the main execution call */
callGasLimit?: BigNumberish;
/* the amount of gas to allocate for the verification step */
verificationGasLimit?: BigNumberish;
/* extra gas to pay the bunder */
preVerificationGas?: BigNumberish;
/* maximum fee per gas (similar to EIP-1559 max_fee_per_gas) */
maxFeePerGas?: BigNumberish;
/* maximum priority fee per gas (similar to EIP-1559 max_priority_fee_per_gas) */
maxPriorityFeePerGas?: BigNumberish;
/* address of paymaster contract, (or empty, if account pays for itself) */
paymaster?: string;
/* the amount of gas to allocate for the paymaster validation code */
paymasterVerificationGasLimit?: BigNumberish;
/* the amount of gas to allocate for the paymaster post-operation code */
paymasterPostOpGasLimit?: BigNumberish;
/* data for paymaster (only if paymaster exists) */
paymasterData?: BytesLike;
/* data passed into the account to verify authorization */
signature: BytesLike;
}
// [!endregion UserOperationStruct_v7]
// [!region UserOperationStruct]
export type UserOperationStruct<
TEntryPointVersion extends EntryPointVersion = EntryPointVersion
> = TEntryPointVersion extends "0.6.0"
? UserOperationStruct_v6
: TEntryPointVersion extends "0.7.0"
? UserOperationStruct_v7
: never;
// [!endregion UserOperationStruct]