From 25e5d9d1d8cf9f323837104f7582770b24098cae Mon Sep 17 00:00:00 2001 From: livingrockrises <90545960+livingrockrises@users.noreply.github.com> Date: Wed, 23 Aug 2023 19:55:54 +0530 Subject: [PATCH] setters for validation modules + refactor --- .../account/src/BiconomySmartAccountV2.ts | 69 ++++++++----------- packages/account/src/utils/Types.ts | 2 +- rebuild.sh | 1 + 3 files changed, 30 insertions(+), 42 deletions(-) diff --git a/packages/account/src/BiconomySmartAccountV2.ts b/packages/account/src/BiconomySmartAccountV2.ts index 147adf8c1..4e483721a 100644 --- a/packages/account/src/BiconomySmartAccountV2.ts +++ b/packages/account/src/BiconomySmartAccountV2.ts @@ -29,7 +29,6 @@ import NodeClient from '@biconomy/node-client' import INodeClient from '@biconomy/node-client' import { IHybridPaymaster, BiconomyPaymaster, SponsorUserOperationDto } from '@biconomy/paymaster' import { - ISmartAccount, SupportedChainsResponse, BalancesResponse, BalancesDto, @@ -45,8 +44,9 @@ type UserOperationKey = keyof UserOperation export class BiconomySmartAccountV2 extends BaseSmartAccount { private nodeClient: INodeClient + // Review: Marked for deletion // private smartAccountInfo!: ISmartAccount - private _isInitialised!: boolean + // private _isInitialised!: boolean factoryAddress?: string @@ -60,8 +60,9 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { factory?: SmartAccountFactory_v200 + // Validation module responsible for account deployment initCode. This acts as a default authorization module. defaultValidationModule: BaseValidationModule - // Review: if it must be provided. default can be used as active + // Deployed Smart Account can have more than one module enabled. When sending a transaction activeValidationModule is used to prepare and validate userOp signature. activeValidationModule: BaseValidationModule constructor(readonly biconomySmartAccountConfig: BiconomySmartAccountV2Config) { @@ -70,9 +71,9 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { this.factoryAddress = biconomySmartAccountConfig.factoryAddress ?? DEFAULT_BICONOMY_FACTORY_ADDRESS // This would be fetched from V2 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.defaultValidationModule = biconomySmartAccountConfig.defaultValidationModule! + this.defaultValidationModule = biconomySmartAccountConfig.defaultValidationModule // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.activeValidationModule = biconomySmartAccountConfig.activeValidationModule! + this.activeValidationModule = biconomySmartAccountConfig.activeValidationModule ?? this.defaultValidationModule const { rpcUrl, nodeClientUrl } = biconomySmartAccountConfig @@ -93,50 +94,30 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { return this.accountContract } - /** - * @description This function will initialise BiconomyAccount class state - * @returns Promise - */ - /*async init(initilizationData?: InitializeV2Data): Promise { - try { - let _accountIndex - if (initilizationData) { - _accountIndex = initilizationData.accountIndex - } - - if (!_accountIndex) _accountIndex = 0 - this.isProviderDefined() + isActiveValidationModuleDefined(): boolean { + if (!this.activeValidationModule) throw new Error('Must provide an instance of active validation module.') + return true + } - await this._getAccountContract() + isDefaultValidationModuleDefined(): boolean { + if (!this.defaultValidationModule) throw new Error('Must provide an instance of default validation module.') + return true + } - this.chainId = await this.provider.getNetwork().then((net) => net.chainId) - await this.initializeAccountAtIndex(_accountIndex) - this._isInitialised = true - } catch (error) { - Logger.error(`Failed to call init: ${error}`) - throw error + setActiveValidationModule(validationModule: BaseValidationModule): BiconomySmartAccountV2 { + if(validationModule instanceof BaseValidationModule) { + this.activeValidationModule = validationModule } - return this } - async initializeAccountAtIndex(accountIndex: number): Promise { - this.index = accountIndex - // TODO // Review should use index - this.accountAddress = await this.getAccountAddress() - // May not need at all - // await this.setContractsState() + setDefaultValidationModule(validationModule: BaseValidationModule): BiconomySmartAccountV2 { + if(validationModule instanceof BaseValidationModule) { + this.defaultValidationModule = validationModule + } + return this } - private isInitialized(): boolean { - if (!this._isInitialised) - throw new Error( - 'BiconomySmartAccountV2 is not initialized. Please call init() on BiconomySmartAccountV2 instance before interacting with any other functions' - ) - return true - }*/ - - // TODO async getNonce(): Promise { if (await this.isAccountDeployed(await this.getAccountAddress())) { const accountContract = await this._getAccountContract() @@ -188,6 +169,8 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { } } + this.isDefaultValidationModuleDefined() + const populatedTransaction = await this.factory.populateTransaction.deployCounterFactualAccount( await this.defaultValidationModule.getAddress(), await this.defaultValidationModule.getInitData(), @@ -262,6 +245,7 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { // dummy signature depends on the validation module supplied. getDummySignature(): string { + this.isActiveValidationModuleDefined() return this.activeValidationModule.getDummySignature() } @@ -272,6 +256,7 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { } async signUserOp(userOp: Partial): Promise { + this.isActiveValidationModuleDefined() const requiredFields: UserOperationKey[] = [ 'sender', 'nonce', @@ -497,10 +482,12 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { } async signUserOpHash(userOpHash: string): Promise { + this.isActiveValidationModuleDefined() return await this.activeValidationModule.signMessage(arrayify(userOpHash)) } async signMessage(message: Bytes | string): Promise { + this.isActiveValidationModuleDefined() const dataHash = ethers.utils.arrayify(ethers.utils.hashMessage(message)) let signature = await this.activeValidationModule.signMessage(dataHash) diff --git a/packages/account/src/utils/Types.ts b/packages/account/src/utils/Types.ts index bf23284fb..1f6b6c2dd 100644 --- a/packages/account/src/utils/Types.ts +++ b/packages/account/src/utils/Types.ts @@ -69,7 +69,7 @@ export interface BiconomySmartAccountV2Config extends BaseSmartAccountConfig { rpcUrl?: string // as good as Provider nodeClientUrl?: string // very specific to Biconomy defaultValidationModule: BaseValidationModule - activeValidationModule: BaseValidationModule + activeValidationModule?: BaseValidationModule } export type Overrides = { diff --git a/rebuild.sh b/rebuild.sh index 0172d933b..8d555308d 100755 --- a/rebuild.sh +++ b/rebuild.sh @@ -29,6 +29,7 @@ rm -rf packages/signers/dist rm -rf packages/common/node_modules rm -rf packages/common/package-lock.json rm -rf packages/common/dist +rm -rf packages/common/src/typechain rm -rf packages/core-types/node_modules rm -rf packages/core-types/package-lock.json