diff --git a/packages/sdk/src/BaseAccountAPI.ts b/packages/sdk/src/BaseAccountAPI.ts index 10094578..33a264d7 100644 --- a/packages/sdk/src/BaseAccountAPI.ts +++ b/packages/sdk/src/BaseAccountAPI.ts @@ -1,8 +1,6 @@ import { ethers, BigNumber, BigNumberish, BytesLike } from 'ethers' import { Provider } from '@ethersproject/providers' -import { - EntryPoint, EntryPoint__factory -} from '@account-abstraction/contracts' +import { IEntryPoint, IEntryPoint__factory } from '@account-abstraction/contracts' import { TransactionDetailsForUserOp } from './TransactionDetailsForUserOp' import { defaultAbiCoder } from 'ethers/lib/utils' @@ -45,7 +43,7 @@ export abstract class BaseAccountAPI { private senderAddress!: string private isPhantom = true // entryPoint connected to "zero" address. allowed to make static calls (e.g. to getSenderAddress) - private readonly entryPointView: EntryPoint + private readonly entryPointView: IEntryPoint provider: Provider overheads?: Partial @@ -65,7 +63,7 @@ export abstract class BaseAccountAPI { this.paymasterAPI = params.paymasterAPI // factory "connect" define the contract address. the contract "connect" defines the "from" address. - this.entryPointView = EntryPoint__factory.connect(params.entryPointAddress, params.provider).connect(ethers.constants.AddressZero) + this.entryPointView = IEntryPoint__factory.connect(params.entryPointAddress, params.provider).connect(ethers.constants.AddressZero) } async init (): Promise { @@ -254,7 +252,7 @@ export abstract class BaseAccountAPI { } } - const partialUserOp: Partial = { + let partialUserOp = { sender: await this.getAccountAddress(), nonce: info.nonce ?? await this.getNonce(), factory: factoryParams?.factory, @@ -262,23 +260,28 @@ export abstract class BaseAccountAPI { callData, callGasLimit, verificationGasLimit, - maxFeePerGas, - maxPriorityFeePerGas + maxFeePerGas: maxFeePerGas as any, + maxPriorityFeePerGas: maxPriorityFeePerGas as any } if (this.paymasterAPI != null) { // fill (partial) preVerificationGas (all except the cost of the generated paymasterAndData) const pmFields = await this.paymasterAPI.getTemporaryPaymasterData(partialUserOp) - partialUserOp.paymaster = pmFields?.paymaster - partialUserOp.paymasterVerificationGasLimit = pmFields?.paymasterVerificationGasLimit - partialUserOp.paymasterPostOpGasLimit = pmFields?.paymasterPostOpGasLimit - partialUserOp.paymasterData = pmFields?.paymasterData + if (pmFields != null) { + partialUserOp = { + ...partialUserOp, + paymaster: pmFields?.paymaster, + paymasterPostOpGasLimit: pmFields?.paymasterPostOpGasLimit, + paymasterVerificationGasLimit: pmFields?.paymasterVerificationGasLimit, + paymasterData: pmFields?.paymasterData + } as any + } } return { ...partialUserOp, preVerificationGas: await this.getPreVerificationGas(partialUserOp), signature: '' - } as any + } } /** diff --git a/packages/sdk/src/ERC4337EthersProvider.ts b/packages/sdk/src/ERC4337EthersProvider.ts index 04e84c0a..29294f48 100644 --- a/packages/sdk/src/ERC4337EthersProvider.ts +++ b/packages/sdk/src/ERC4337EthersProvider.ts @@ -7,7 +7,7 @@ import { ClientConfig } from './ClientConfig' import { ERC4337EthersSigner } from './ERC4337EthersSigner' import { UserOperationEventListener } from './UserOperationEventListener' import { HttpRpcClient } from './HttpRpcClient' -import { EntryPoint } from '@account-abstraction/contracts' +import { IEntryPoint } from '@account-abstraction/contracts' import { getUserOpHash, packUserOp, UserOperation } from '@account-abstraction/utils' import { BaseAccountAPI } from './BaseAccountAPI' import Debug from 'debug' @@ -24,7 +24,7 @@ export class ERC4337EthersProvider extends BaseProvider { readonly originalSigner: Signer, readonly originalProvider: BaseProvider, readonly httpRpcClient: HttpRpcClient, - readonly entryPoint: EntryPoint, + readonly entryPoint: IEntryPoint, readonly smartAccountAPI: BaseAccountAPI ) { super({ diff --git a/packages/sdk/src/Provider.ts b/packages/sdk/src/Provider.ts index d8acf955..a60ab37b 100644 --- a/packages/sdk/src/Provider.ts +++ b/packages/sdk/src/Provider.ts @@ -1,6 +1,6 @@ import { JsonRpcProvider } from '@ethersproject/providers' -import { EntryPoint__factory, SimpleAccountFactory__factory } from '@account-abstraction/contracts' +import { IEntryPoint__factory, SimpleAccountFactory__factory } from '@account-abstraction/contracts' import { ClientConfig } from './ClientConfig' import { SimpleAccountAPI } from './SimpleAccountAPI' @@ -20,7 +20,7 @@ export async function wrapProvider ( config: ClientConfig, originalSigner: Signer = originalProvider.getSigner() ): Promise { - const entryPoint = EntryPoint__factory.connect(config.entryPointAddress, originalProvider) + const entryPoint = IEntryPoint__factory.connect(config.entryPointAddress, originalProvider) // Initial SimpleAccount instance is not deployed and exists just for the interface const detDeployer = new DeterministicDeployer(originalProvider) const SimpleAccountFactory = await detDeployer.deterministicDeploy(new SimpleAccountFactory__factory(), 0, [entryPoint.address]) diff --git a/packages/sdk/src/UserOperationEventListener.ts b/packages/sdk/src/UserOperationEventListener.ts index 61a2c657..bb773274 100644 --- a/packages/sdk/src/UserOperationEventListener.ts +++ b/packages/sdk/src/UserOperationEventListener.ts @@ -1,6 +1,6 @@ import { BigNumberish, Event } from 'ethers' import { TransactionReceipt } from '@ethersproject/providers' -import { EntryPoint } from '@account-abstraction/contracts' +import { IEntryPoint } from '@account-abstraction/contracts' import { defaultAbiCoder } from 'ethers/lib/utils' import Debug from 'debug' @@ -19,7 +19,7 @@ export class UserOperationEventListener { constructor ( readonly resolve: (t: TransactionReceipt) => void, readonly reject: (reason?: any) => void, - readonly entryPoint: EntryPoint, + readonly entryPoint: IEntryPoint, readonly sender: string, readonly userOpHash: string, readonly nonce?: BigNumberish, diff --git a/packages/sdk/test/1-SimpleAccountAPI.test.ts b/packages/sdk/test/1-SimpleAccountAPI.test.ts index 7ffc07af..1a889d49 100644 --- a/packages/sdk/test/1-SimpleAccountAPI.test.ts +++ b/packages/sdk/test/1-SimpleAccountAPI.test.ts @@ -1,7 +1,5 @@ import { - EntryPoint, - EntryPoint__factory, - SimpleAccountFactory__factory + EntryPoint__factory, IEntryPoint, SimpleAccountFactory__factory } from '@account-abstraction/contracts' import { Wallet } from 'ethers' import { parseEther } from 'ethers/lib/utils' @@ -10,10 +8,8 @@ import { anyValue } from '@nomicfoundation/hardhat-chai-matchers/withArgs' import { ethers } from 'hardhat' import { DeterministicDeployer, SimpleAccountAPI } from '../src' import { - SampleRecipient, - SampleRecipient__factory, UserOperation, - packUserOp, decodeErrorReason + packUserOp, decodeErrorReason, SampleRecipient, SampleRecipient__factory } from '@account-abstraction/utils' const provider = ethers.provider @@ -22,7 +18,7 @@ const signer = provider.getSigner() describe('SimpleAccountAPI', () => { let owner: Wallet let api: SimpleAccountAPI - let entryPoint: EntryPoint + let entryPoint: IEntryPoint let beneficiary: string let recipient: SampleRecipient let accountAddress: string diff --git a/packages/utils/src/ERC4337Utils.ts b/packages/utils/src/ERC4337Utils.ts index 8441c3b3..0303c34a 100644 --- a/packages/utils/src/ERC4337Utils.ts +++ b/packages/utils/src/ERC4337Utils.ts @@ -222,10 +222,10 @@ export function unpackUserOp (packed: PackedUserOperation): UserOperation { export function encodeUserOp (op1: NotPromise | UserOperation, forSignature = true): string { // if "op" is unpacked UserOperation, then pack it first, before we ABI-encode it. let op: NotPromise - if ((op1 as any).callGasLimit != null) { - op = packUserOp(op1 as UserOperation) + if ('callGasLimit' in op1) { + op = packUserOp(op1) } else { - op = op1 as NotPromise + op = op1 } if (forSignature) { return defaultAbiCoder.encode( diff --git a/packages/utils/src/postExecCheck.ts b/packages/utils/src/postExecCheck.ts index 6225c7f5..06351bc2 100644 --- a/packages/utils/src/postExecCheck.ts +++ b/packages/utils/src/postExecCheck.ts @@ -1,11 +1,11 @@ import { resolveProperties } from 'ethers/lib/utils' import { NotPromise } from './ERC4337Utils' -import { EntryPoint, PackedUserOperationStruct } from '@account-abstraction/contracts' import Debug from 'debug' +import { IEntryPoint, PackedUserOperationStruct } from '@account-abstraction/contracts' const debug = Debug('aa.postExec') -export async function postExecutionDump (entryPoint: EntryPoint, userOpHash: string): Promise { +export async function postExecutionDump (entryPoint: IEntryPoint, userOpHash: string): Promise { const { gasPaid, gasUsed, success, userOp } = await postExecutionCheck(entryPoint, userOpHash) /// / debug dump: debug('==== used=', gasUsed, 'paid', gasPaid, 'over=', gasPaid - gasUsed, @@ -20,7 +20,7 @@ export async function postExecutionDump (entryPoint: EntryPoint, userOpHash: str * @param entryPoint * @param userOpHash */ -export async function postExecutionCheck (entryPoint: EntryPoint, userOpHash: string): Promise<{ +export async function postExecutionCheck (entryPoint: IEntryPoint, userOpHash: string): Promise<{ gasUsed: number gasPaid: number success: boolean