@dynamic-labs/ethereum-aa 3.0.0-alpha.8 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dynamic-labs/ethereum-aa",
3
- "version": "3.0.0-alpha.8",
3
+ "version": "3.0.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/dynamic-labs/dynamic-auth.git",
@@ -26,17 +26,17 @@
26
26
  "./package.json": "./package.json"
27
27
  },
28
28
  "dependencies": {
29
- "@dynamic-labs/sdk-api-core": "0.0.470",
30
- "@zerodev/ecdsa-validator": "5.2.3",
31
- "@zerodev/sdk": "5.2.8",
32
- "permissionless": "0.1.20",
33
- "@dynamic-labs/ethereum": "3.0.0-alpha.8",
34
- "@dynamic-labs/logger": "3.0.0-alpha.8",
35
- "@dynamic-labs/types": "3.0.0-alpha.8",
36
- "@dynamic-labs/utils": "3.0.0-alpha.8",
37
- "@dynamic-labs/viem-utils": "3.0.0-alpha.8",
38
- "@dynamic-labs/wallet-book": "3.0.0-alpha.8",
39
- "@dynamic-labs/wallet-connector-core": "3.0.0-alpha.8"
29
+ "@dynamic-labs/sdk-api-core": "0.0.529",
30
+ "@zerodev/ecdsa-validator": "5.3.1",
31
+ "@zerodev/multi-chain-validator": "5.3.3",
32
+ "@zerodev/sdk": "5.3.4",
33
+ "permissionless": "^0.1.20",
34
+ "@dynamic-labs/ethereum-core": "3.0.0",
35
+ "@dynamic-labs/logger": "3.0.0",
36
+ "@dynamic-labs/types": "3.0.0",
37
+ "@dynamic-labs/utils": "3.0.0",
38
+ "@dynamic-labs/wallet-book": "3.0.0",
39
+ "@dynamic-labs/wallet-connector-core": "3.0.0"
40
40
  },
41
41
  "peerDependencies": {
42
42
  "viem": "^2.7.6"
@@ -4,21 +4,24 @@
4
4
  Object.defineProperty(exports, '__esModule', { value: true });
5
5
 
6
6
  var _tslib = require('../_virtual/_tslib.cjs');
7
+ var multiChainValidator = require('@zerodev/multi-chain-validator');
7
8
  var viem = require('viem');
8
9
  var utils$1 = require('permissionless/utils');
10
+ var constants = require('@zerodev/sdk/constants');
11
+ var ecdsaValidator = require('@zerodev/ecdsa-validator');
9
12
  var sdkApiCore = require('@dynamic-labs/sdk-api-core');
10
13
  var walletConnectorCore = require('@dynamic-labs/wallet-connector-core');
11
- var viemUtils = require('@dynamic-labs/viem-utils');
14
+ var ethereumCore = require('@dynamic-labs/ethereum-core');
12
15
  var utils = require('@dynamic-labs/utils');
13
- var ethereum = require('@dynamic-labs/ethereum');
14
16
  var fetchChain = require('./utils/fetchChain.cjs');
15
17
  var logger = require('./utils/logger.cjs');
16
18
  var createEcsdaKernelAccountClient = require('./utils/createEcsdaKernelAccountClient.cjs');
17
19
 
18
20
  class ZeroDevConnector extends walletConnectorCore.WalletConnectorBase {
19
21
  constructor(opts) {
20
- var _a, _b;
22
+ var _a, _b, _c, _d;
21
23
  super(opts);
24
+ this.ChainWallet = ethereumCore.EthereumWallet;
22
25
  this.connectedChain = 'EVM';
23
26
  this.supportedChains = ['ETH', 'EVM'];
24
27
  this.isGasSponsorshipDisabled = false;
@@ -39,16 +42,64 @@ class ZeroDevConnector extends walletConnectorCore.WalletConnectorBase {
39
42
  this.projectId = zeroDevProjectId;
40
43
  this._walletUiUtils = opts.walletUiUtils;
41
44
  this.evmNetworks = utils.parseEvmNetworks(opts.evmNetworks);
42
- this.entryPoint =
43
- ((_b = opts.apiProviders.zerodev) === null || _b === void 0 ? void 0 : _b.entryPointVersion) ===
44
- sdkApiCore.ProviderEntryPointVersionEnum.V6
45
- ? utils$1.ENTRYPOINT_ADDRESS_V06
46
- : utils$1.ENTRYPOINT_ADDRESS_V07;
45
+ this.entryPoint = this.getEntryPoint((_b = opts.apiProviders.zerodev) === null || _b === void 0 ? void 0 : _b.entryPointVersion);
46
+ this.kernelVersion = this.getKernelVersion((_c = opts.apiProviders.zerodev) === null || _c === void 0 ? void 0 : _c.kernelVersion);
47
+ this.ecdsaProviderType = (_d = opts.apiProviders.zerodev) === null || _d === void 0 ? void 0 : _d.ecdsaProviderType;
47
48
  }
49
+ getEntryPoint(entryPoint) {
50
+ if (entryPoint === undefined ||
51
+ entryPoint === sdkApiCore.ProviderEntryPointVersionEnum.V7) {
52
+ return utils$1.ENTRYPOINT_ADDRESS_V07;
53
+ }
54
+ else if (entryPoint === sdkApiCore.ProviderEntryPointVersionEnum.V6) {
55
+ return utils$1.ENTRYPOINT_ADDRESS_V06;
56
+ }
57
+ else {
58
+ logger.logger.error('Invalid entry point version', entryPoint);
59
+ return utils$1.ENTRYPOINT_ADDRESS_V07;
60
+ }
61
+ }
62
+ getKernelVersion(kernelVersion) {
63
+ if (kernelVersion === sdkApiCore.ProviderKernelVersionEnum.V31 ||
64
+ (kernelVersion === undefined &&
65
+ this.entryPoint === utils$1.ENTRYPOINT_ADDRESS_V07)) {
66
+ return constants.KERNEL_V3_1;
67
+ }
68
+ else if (kernelVersion === sdkApiCore.ProviderKernelVersionEnum.V30) {
69
+ return constants.KERNEL_V3_0;
70
+ }
71
+ else if (kernelVersion === sdkApiCore.ProviderKernelVersionEnum.V24 ||
72
+ this.entryPoint === utils$1.ENTRYPOINT_ADDRESS_V06 // v0.6 only supports v2.4
73
+ ) {
74
+ return constants.KERNEL_V2_4;
75
+ }
76
+ else {
77
+ logger.logger.error('Invalid kernel version', kernelVersion);
78
+ return constants.KERNEL_V3_1;
79
+ }
80
+ }
81
+ getEcdsaValidator(ecdsaProviderType) {
82
+ if (ecdsaProviderType === 'zerodev_signer_to_ecdsa') {
83
+ return ecdsaValidator.signerToEcdsaValidator;
84
+ }
85
+ else if (ecdsaProviderType === 'zerodev_multi_chain') {
86
+ return multiChainValidator.toMultiChainECDSAValidator;
87
+ }
88
+ else {
89
+ return ecdsaValidator.signerToEcdsaValidator;
90
+ }
91
+ }
92
+ /**
93
+ * @deprecated You should get the EOA connector by passing the SCW to getEOAConnector,
94
+ * from the useSmartWallet hook
95
+ */
48
96
  getEOAConnector() {
49
97
  return this.eoaConnector;
50
98
  }
51
- getAccountAbstractionProvider() {
99
+ getAccountAbstractionProvider({ withSponsorship, } = {}) {
100
+ if (withSponsorship && this.kernelClientWithSponsorship) {
101
+ return this.kernelClientWithSponsorship;
102
+ }
52
103
  return this.kernelClient;
53
104
  }
54
105
  endSession() {
@@ -64,7 +115,7 @@ class ZeroDevConnector extends walletConnectorCore.WalletConnectorBase {
64
115
  }
65
116
  this.kernelClientDeferredPromise = new utils.DeferredPromise();
66
117
  this.eoaConnector = connector;
67
- if (ethereum.isEthWalletConnector(this.eoaConnector) &&
118
+ if (ethereumCore.isEthWalletConnector(this.eoaConnector) &&
68
119
  !this.eoaConnector.getActiveAccount()) {
69
120
  yield this.eoaConnector.getConnectedAccounts();
70
121
  }
@@ -74,9 +125,13 @@ class ZeroDevConnector extends walletConnectorCore.WalletConnectorBase {
74
125
  return;
75
126
  }
76
127
  const kernelClient = yield createEcsdaKernelAccountClient.createEcdsaKernelAccountClient({
128
+ bundlerRpc: ZeroDevConnector.bundlerRpc,
77
129
  chain: yield fetchChain.fetchChain(this.projectId),
130
+ ecdsaValidator: this.getEcdsaValidator(this.ecdsaProviderType),
78
131
  entryPointAddress: this.entryPoint,
132
+ kernelVersion: this.kernelVersion,
79
133
  paymaster: 'NONE',
134
+ paymasterRpc: ZeroDevConnector.paymasterRpc,
80
135
  projectId: this.projectId,
81
136
  provider: ZeroDevConnector.bundlerProvider,
82
137
  signer: utils$1.walletClientToSmartAccountSigner(signer),
@@ -86,6 +141,8 @@ class ZeroDevConnector extends walletConnectorCore.WalletConnectorBase {
86
141
  return original(...args);
87
142
  });
88
143
  this.kernelClient = kernelClient;
144
+ // set the provider with sponsorship enabled
145
+ yield this.getKernelClientWithSponsorshipValidation();
89
146
  yield this.checkIsProjectChainEnabled();
90
147
  this.kernelClientDeferredPromise.resolve();
91
148
  });
@@ -112,9 +169,13 @@ class ZeroDevConnector extends walletConnectorCore.WalletConnectorBase {
112
169
  throw new utils.DynamicError('No EOA connector');
113
170
  const signer = yield eoaConnector.getSigner();
114
171
  this.kernelClientWithSponsorship = yield createEcsdaKernelAccountClient.createEcdsaKernelAccountClient({
172
+ bundlerRpc: ZeroDevConnector.bundlerRpc,
115
173
  chain: yield fetchChain.fetchChain(this.projectId),
174
+ ecdsaValidator: this.getEcdsaValidator(this.ecdsaProviderType),
116
175
  entryPointAddress: this.entryPoint,
176
+ kernelVersion: this.kernelVersion,
117
177
  paymaster: 'SPONSOR',
178
+ paymasterRpc: ZeroDevConnector.paymasterRpc,
118
179
  projectId: this.projectId,
119
180
  provider: ZeroDevConnector.bundlerProvider,
120
181
  signer: utils$1.walletClientToSmartAccountSigner(signer),
@@ -150,7 +211,7 @@ class ZeroDevConnector extends walletConnectorCore.WalletConnectorBase {
150
211
  });
151
212
  }
152
213
  getTransport(provider) {
153
- const transport = viemUtils.confirmationTransport({
214
+ const transport = ethereumCore.confirmationTransport({
154
215
  getAccounts: () => _tslib.__awaiter(this, void 0, void 0, function* () { return [provider.account.address]; }),
155
216
  onPersonalSign: (_a) => _tslib.__awaiter(this, [_a], void 0, function* ({ message }) {
156
217
  this._walletUiUtils.disabledConfirmationOnce();
@@ -165,7 +226,7 @@ class ZeroDevConnector extends walletConnectorCore.WalletConnectorBase {
165
226
  const effectiveProvider = this.isGasSponsorshipDisabled
166
227
  ? provider
167
228
  : yield this.getKernelClientWithSponsorshipValidation();
168
- const response = yield effectiveProvider.sendTransaction(viemUtils.unFormatTransaction(transaction));
229
+ const response = yield effectiveProvider.sendTransaction(ethereumCore.unFormatTransaction(transaction));
169
230
  return response;
170
231
  }
171
232
  catch (err) {
@@ -192,6 +253,7 @@ class ZeroDevConnector extends walletConnectorCore.WalletConnectorBase {
192
253
  }),
193
254
  provider: provider.extend(viem.publicActions),
194
255
  transport: viem.custom(provider),
256
+ // TODO: remove this. We should not be passing references to wallet connectors
195
257
  walletConnector: this,
196
258
  walletUiUtils: this._walletUiUtils,
197
259
  });
@@ -206,7 +268,7 @@ class ZeroDevConnector extends walletConnectorCore.WalletConnectorBase {
206
268
  const address = (_a = provider.account) === null || _a === void 0 ? void 0 : _a.address;
207
269
  const walletClient = viem.createWalletClient({
208
270
  account: address,
209
- chain: chainId ? viemUtils.chainsMap[chainId] : provider.chain,
271
+ chain: chainId ? ethereumCore.chainsMap[chainId] : provider.chain,
210
272
  transport,
211
273
  });
212
274
  return walletClient;
@@ -259,38 +321,53 @@ class ZeroDevConnector extends walletConnectorCore.WalletConnectorBase {
259
321
  disableGasSponsorshipOnce() {
260
322
  this.isGasSponsorshipDisabled = true;
261
323
  }
262
- getBalance() {
324
+ getBalance(address) {
263
325
  return _tslib.__awaiter(this, void 0, void 0, function* () {
264
326
  var _a;
265
327
  const rpcClient = (_a = this.kernelClient) === null || _a === void 0 ? void 0 : _a.extend(viem.publicActions);
266
328
  if (!rpcClient)
267
329
  throw new utils.DynamicError('No RPC client');
268
- const address = yield this.getAddress();
269
- if (!address)
270
- return;
271
330
  return viem.formatEther(yield rpcClient.getBalance({ address: address }));
272
331
  });
273
332
  }
274
333
  signMessage(messageToSign) {
275
334
  return _tslib.__awaiter(this, void 0, void 0, function* () {
276
- const client = yield this.getSigner();
277
- const account = yield this.getAddress();
278
- if (!account || !client)
279
- return;
280
- return client.signMessage({
281
- account: account,
282
- message: messageToSign,
283
- });
335
+ const client = this === null || this === void 0 ? void 0 : this.kernelClient;
336
+ // https://docs.zerodev.app/sdk/core-api/sign-and-verify#signing-messages
337
+ if (!client)
338
+ throw new Error('Error fetching signer');
339
+ return client.signMessage({ message: messageToSign });
284
340
  });
285
341
  }
286
342
  createUiTransaction(from) {
287
343
  return _tslib.__awaiter(this, void 0, void 0, function* () {
344
+ yield this.validateActiveWallet(from);
288
345
  const walletClient = this.getWalletClient();
289
346
  const publicClient = yield this.getPublicClient();
290
347
  if (!publicClient || !walletClient) {
291
348
  throw new utils.DynamicError('No public client available');
292
349
  }
293
- return viemUtils.createViemUiTransaction({ from, publicClient, walletClient });
350
+ return ethereumCore.createViemUiTransaction({ from, publicClient, walletClient });
351
+ });
352
+ }
353
+ validateActiveWallet(expectedAddress) {
354
+ const _super = Object.create(null, {
355
+ validateActiveWallet: { get: () => super.validateActiveWallet }
356
+ });
357
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
358
+ var _a;
359
+ const eoaConnector = this === null || this === void 0 ? void 0 : this.eoaConnector;
360
+ if (eoaConnector && walletConnectorCore.isTurnkeyWalletConnector(eoaConnector)) {
361
+ const verifiedCredentials = eoaConnector === null || eoaConnector === void 0 ? void 0 : eoaConnector.verifiedCredentials;
362
+ const expectedEoaAddress = (_a = verifiedCredentials === null || verifiedCredentials === void 0 ? void 0 : verifiedCredentials.find((vc) => vc.smartWalletRefAddress === expectedAddress)) === null || _a === void 0 ? void 0 : _a.address;
363
+ if (!expectedEoaAddress) {
364
+ throw new utils.DynamicError('No EOA connector');
365
+ }
366
+ yield (eoaConnector === null || eoaConnector === void 0 ? void 0 : eoaConnector.validateActiveWallet(expectedEoaAddress));
367
+ }
368
+ else {
369
+ yield _super.validateActiveWallet.call(this, expectedAddress);
370
+ }
294
371
  });
295
372
  }
296
373
  }
@@ -1,10 +1,14 @@
1
1
  import { KernelAccountClient } from '@zerodev/sdk/clients';
2
2
  import { KernelSmartAccount } from '@zerodev/sdk/accounts';
3
+ import { toMultiChainECDSAValidator } from '@zerodev/multi-chain-validator';
3
4
  import { Account, PublicClient, Transport, WalletClient } from 'viem';
4
5
  import { type Chain as ViemChain } from 'viem/chains';
5
6
  import { EntryPoint } from 'permissionless/types';
7
+ import { KERNEL_VERSION_TYPE } from '@zerodev/sdk/types';
8
+ import { signerToEcdsaValidator } from '@zerodev/ecdsa-validator';
6
9
  import { Provider, ProviderEnum } from '@dynamic-labs/sdk-api-core';
7
- import { Chain, IAccountAbstractionWalletConnector, ISendBalanceWalletConnector, WalletConnector, WalletConnectorBase } from '@dynamic-labs/wallet-connector-core';
10
+ import { Chain, IAccountAbstractionWalletConnector, ISendBalanceWalletConnector, InternalWalletConnector, WalletConnectorBase } from '@dynamic-labs/wallet-connector-core';
11
+ import { EthereumWallet } from '@dynamic-labs/ethereum-core';
8
12
  import { WalletBookSchema } from '@dynamic-labs/wallet-book';
9
13
  import { EvmNetwork, GenericNetwork, IUITransaction, WalletUiUtils } from '@dynamic-labs/types';
10
14
  import { BundlerProvider } from './utils';
@@ -14,22 +18,27 @@ type ZeroDevConnectorProps = {
14
18
  };
15
19
  evmNetworks: GenericNetwork[];
16
20
  walletBook: WalletBookSchema;
17
- walletUiUtils: WalletUiUtils<WalletConnector>;
21
+ walletUiUtils: WalletUiUtils<InternalWalletConnector>;
18
22
  bundlerProvider: BundlerProvider | undefined;
19
23
  };
20
24
  type IZeroDevConnector = IAccountAbstractionWalletConnector & ISendBalanceWalletConnector;
21
- export declare class ZeroDevConnector extends WalletConnectorBase implements IZeroDevConnector {
25
+ export declare class ZeroDevConnector extends WalletConnectorBase<typeof EthereumWallet> implements IZeroDevConnector {
22
26
  projectId: string;
23
27
  kernelClient: KernelAccountClient<EntryPoint, Transport, ViemChain, KernelSmartAccount<EntryPoint>> | undefined;
24
- eoaConnector: WalletConnector | undefined;
25
- private kernelClientWithSponsorship;
28
+ eoaConnector: InternalWalletConnector | undefined;
29
+ kernelClientWithSponsorship: KernelAccountClient<EntryPoint, Transport, ViemChain, KernelSmartAccount<EntryPoint>> | undefined;
30
+ ChainWallet: typeof EthereumWallet;
26
31
  connectedChain: Chain;
27
32
  supportedChains: Chain[];
28
33
  evmNetworks: EvmNetwork[];
29
34
  private isGasSponsorshipDisabled;
30
35
  isEmbeddedWallet: boolean;
31
- private entryPoint;
36
+ entryPoint: EntryPoint;
37
+ kernelVersion: KERNEL_VERSION_TYPE;
38
+ ecdsaProviderType: string | undefined;
32
39
  static bundlerProvider: BundlerProvider | undefined;
40
+ static bundlerRpc: string | undefined;
41
+ static paymasterRpc: string | undefined;
33
42
  /**
34
43
  * Deferred promise that resolves when the ZeroDev provider is set.
35
44
  * This is used to make sure that the provider is set before any other method is called.
@@ -47,10 +56,19 @@ export declare class ZeroDevConnector extends WalletConnectorBase implements IZe
47
56
  };
48
57
  private _walletUiUtils;
49
58
  constructor(opts: ZeroDevConnectorProps);
50
- getEOAConnector(): WalletConnector | undefined;
51
- getAccountAbstractionProvider(): KernelAccountClient<EntryPoint> | undefined;
59
+ getEntryPoint(entryPoint: string | undefined): "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" | "0x0000000071727De22E5E9d8BAf0edAc6f37da032";
60
+ getKernelVersion(kernelVersion: string | undefined): KERNEL_VERSION_TYPE;
61
+ getEcdsaValidator(ecdsaProviderType: string | undefined): typeof signerToEcdsaValidator | typeof toMultiChainECDSAValidator;
62
+ /**
63
+ * @deprecated You should get the EOA connector by passing the SCW to getEOAConnector,
64
+ * from the useSmartWallet hook
65
+ */
66
+ getEOAConnector(): InternalWalletConnector | undefined;
67
+ getAccountAbstractionProvider({ withSponsorship, }?: {
68
+ withSponsorship?: boolean;
69
+ }): KernelAccountClient<EntryPoint> | undefined;
52
70
  endSession(): Promise<void>;
53
- setEoaConnector(connector: WalletConnector): Promise<void>;
71
+ setEoaConnector(connector: InternalWalletConnector): Promise<void>;
54
72
  private checkIsProjectChainEnabled;
55
73
  private getKernelClientWithSponsorshipValidation;
56
74
  getAddress(): Promise<string | undefined>;
@@ -3099,8 +3117,9 @@ export declare class ZeroDevConnector extends WalletConnectorBase implements IZe
3099
3117
  } | undefined>;
3100
3118
  canSponsorTransactionGas(transaction: IUITransaction): Promise<boolean>;
3101
3119
  disableGasSponsorshipOnce(): void;
3102
- getBalance(): Promise<string | undefined>;
3120
+ getBalance(address: string): Promise<string | undefined>;
3103
3121
  signMessage(messageToSign: string): Promise<string | undefined>;
3104
3122
  createUiTransaction(from: string): Promise<IUITransaction>;
3123
+ validateActiveWallet(expectedAddress: string): Promise<void>;
3105
3124
  }
3106
3125
  export {};
@@ -1,20 +1,23 @@
1
1
  'use client'
2
2
  import { __awaiter } from '../_virtual/_tslib.js';
3
+ import { toMultiChainECDSAValidator } from '@zerodev/multi-chain-validator';
3
4
  import { publicActions, custom, createWalletClient, isHex, fromHex, formatEther } from 'viem';
4
- import { ENTRYPOINT_ADDRESS_V06, ENTRYPOINT_ADDRESS_V07, walletClientToSmartAccountSigner } from 'permissionless/utils';
5
- import { ProviderEntryPointVersionEnum } from '@dynamic-labs/sdk-api-core';
6
- import { WalletConnectorBase } from '@dynamic-labs/wallet-connector-core';
7
- import { confirmationTransport, chainsMap, unFormatTransaction, createViemUiTransaction } from '@dynamic-labs/viem-utils';
5
+ import { ENTRYPOINT_ADDRESS_V07, ENTRYPOINT_ADDRESS_V06, walletClientToSmartAccountSigner } from 'permissionless/utils';
6
+ import { KERNEL_V3_1, KERNEL_V3_0, KERNEL_V2_4 } from '@zerodev/sdk/constants';
7
+ import { signerToEcdsaValidator } from '@zerodev/ecdsa-validator';
8
+ import { ProviderEntryPointVersionEnum, ProviderKernelVersionEnum } from '@dynamic-labs/sdk-api-core';
9
+ import { WalletConnectorBase, isTurnkeyWalletConnector } from '@dynamic-labs/wallet-connector-core';
10
+ import { EthereumWallet, confirmationTransport, chainsMap, isEthWalletConnector, unFormatTransaction, createViemUiTransaction } from '@dynamic-labs/ethereum-core';
8
11
  import { parseEvmNetworks, DynamicError, DeferredPromise, wrapMethodWithCallback, TransactionGasCannotBeSponsoredError, InsufficientFundsError } from '@dynamic-labs/utils';
9
- import { isEthWalletConnector } from '@dynamic-labs/ethereum';
10
12
  import { cachedChainIdKey, fetchChain } from './utils/fetchChain.js';
11
13
  import { logger } from './utils/logger.js';
12
14
  import { createEcdsaKernelAccountClient } from './utils/createEcsdaKernelAccountClient.js';
13
15
 
14
16
  class ZeroDevConnector extends WalletConnectorBase {
15
17
  constructor(opts) {
16
- var _a, _b;
18
+ var _a, _b, _c, _d;
17
19
  super(opts);
20
+ this.ChainWallet = EthereumWallet;
18
21
  this.connectedChain = 'EVM';
19
22
  this.supportedChains = ['ETH', 'EVM'];
20
23
  this.isGasSponsorshipDisabled = false;
@@ -35,16 +38,64 @@ class ZeroDevConnector extends WalletConnectorBase {
35
38
  this.projectId = zeroDevProjectId;
36
39
  this._walletUiUtils = opts.walletUiUtils;
37
40
  this.evmNetworks = parseEvmNetworks(opts.evmNetworks);
38
- this.entryPoint =
39
- ((_b = opts.apiProviders.zerodev) === null || _b === void 0 ? void 0 : _b.entryPointVersion) ===
40
- ProviderEntryPointVersionEnum.V6
41
- ? ENTRYPOINT_ADDRESS_V06
42
- : ENTRYPOINT_ADDRESS_V07;
41
+ this.entryPoint = this.getEntryPoint((_b = opts.apiProviders.zerodev) === null || _b === void 0 ? void 0 : _b.entryPointVersion);
42
+ this.kernelVersion = this.getKernelVersion((_c = opts.apiProviders.zerodev) === null || _c === void 0 ? void 0 : _c.kernelVersion);
43
+ this.ecdsaProviderType = (_d = opts.apiProviders.zerodev) === null || _d === void 0 ? void 0 : _d.ecdsaProviderType;
43
44
  }
45
+ getEntryPoint(entryPoint) {
46
+ if (entryPoint === undefined ||
47
+ entryPoint === ProviderEntryPointVersionEnum.V7) {
48
+ return ENTRYPOINT_ADDRESS_V07;
49
+ }
50
+ else if (entryPoint === ProviderEntryPointVersionEnum.V6) {
51
+ return ENTRYPOINT_ADDRESS_V06;
52
+ }
53
+ else {
54
+ logger.error('Invalid entry point version', entryPoint);
55
+ return ENTRYPOINT_ADDRESS_V07;
56
+ }
57
+ }
58
+ getKernelVersion(kernelVersion) {
59
+ if (kernelVersion === ProviderKernelVersionEnum.V31 ||
60
+ (kernelVersion === undefined &&
61
+ this.entryPoint === ENTRYPOINT_ADDRESS_V07)) {
62
+ return KERNEL_V3_1;
63
+ }
64
+ else if (kernelVersion === ProviderKernelVersionEnum.V30) {
65
+ return KERNEL_V3_0;
66
+ }
67
+ else if (kernelVersion === ProviderKernelVersionEnum.V24 ||
68
+ this.entryPoint === ENTRYPOINT_ADDRESS_V06 // v0.6 only supports v2.4
69
+ ) {
70
+ return KERNEL_V2_4;
71
+ }
72
+ else {
73
+ logger.error('Invalid kernel version', kernelVersion);
74
+ return KERNEL_V3_1;
75
+ }
76
+ }
77
+ getEcdsaValidator(ecdsaProviderType) {
78
+ if (ecdsaProviderType === 'zerodev_signer_to_ecdsa') {
79
+ return signerToEcdsaValidator;
80
+ }
81
+ else if (ecdsaProviderType === 'zerodev_multi_chain') {
82
+ return toMultiChainECDSAValidator;
83
+ }
84
+ else {
85
+ return signerToEcdsaValidator;
86
+ }
87
+ }
88
+ /**
89
+ * @deprecated You should get the EOA connector by passing the SCW to getEOAConnector,
90
+ * from the useSmartWallet hook
91
+ */
44
92
  getEOAConnector() {
45
93
  return this.eoaConnector;
46
94
  }
47
- getAccountAbstractionProvider() {
95
+ getAccountAbstractionProvider({ withSponsorship, } = {}) {
96
+ if (withSponsorship && this.kernelClientWithSponsorship) {
97
+ return this.kernelClientWithSponsorship;
98
+ }
48
99
  return this.kernelClient;
49
100
  }
50
101
  endSession() {
@@ -70,9 +121,13 @@ class ZeroDevConnector extends WalletConnectorBase {
70
121
  return;
71
122
  }
72
123
  const kernelClient = yield createEcdsaKernelAccountClient({
124
+ bundlerRpc: ZeroDevConnector.bundlerRpc,
73
125
  chain: yield fetchChain(this.projectId),
126
+ ecdsaValidator: this.getEcdsaValidator(this.ecdsaProviderType),
74
127
  entryPointAddress: this.entryPoint,
128
+ kernelVersion: this.kernelVersion,
75
129
  paymaster: 'NONE',
130
+ paymasterRpc: ZeroDevConnector.paymasterRpc,
76
131
  projectId: this.projectId,
77
132
  provider: ZeroDevConnector.bundlerProvider,
78
133
  signer: walletClientToSmartAccountSigner(signer),
@@ -82,6 +137,8 @@ class ZeroDevConnector extends WalletConnectorBase {
82
137
  return original(...args);
83
138
  });
84
139
  this.kernelClient = kernelClient;
140
+ // set the provider with sponsorship enabled
141
+ yield this.getKernelClientWithSponsorshipValidation();
85
142
  yield this.checkIsProjectChainEnabled();
86
143
  this.kernelClientDeferredPromise.resolve();
87
144
  });
@@ -108,9 +165,13 @@ class ZeroDevConnector extends WalletConnectorBase {
108
165
  throw new DynamicError('No EOA connector');
109
166
  const signer = yield eoaConnector.getSigner();
110
167
  this.kernelClientWithSponsorship = yield createEcdsaKernelAccountClient({
168
+ bundlerRpc: ZeroDevConnector.bundlerRpc,
111
169
  chain: yield fetchChain(this.projectId),
170
+ ecdsaValidator: this.getEcdsaValidator(this.ecdsaProviderType),
112
171
  entryPointAddress: this.entryPoint,
172
+ kernelVersion: this.kernelVersion,
113
173
  paymaster: 'SPONSOR',
174
+ paymasterRpc: ZeroDevConnector.paymasterRpc,
114
175
  projectId: this.projectId,
115
176
  provider: ZeroDevConnector.bundlerProvider,
116
177
  signer: walletClientToSmartAccountSigner(signer),
@@ -188,6 +249,7 @@ class ZeroDevConnector extends WalletConnectorBase {
188
249
  }),
189
250
  provider: provider.extend(publicActions),
190
251
  transport: custom(provider),
252
+ // TODO: remove this. We should not be passing references to wallet connectors
191
253
  walletConnector: this,
192
254
  walletUiUtils: this._walletUiUtils,
193
255
  });
@@ -255,32 +317,27 @@ class ZeroDevConnector extends WalletConnectorBase {
255
317
  disableGasSponsorshipOnce() {
256
318
  this.isGasSponsorshipDisabled = true;
257
319
  }
258
- getBalance() {
320
+ getBalance(address) {
259
321
  return __awaiter(this, void 0, void 0, function* () {
260
322
  var _a;
261
323
  const rpcClient = (_a = this.kernelClient) === null || _a === void 0 ? void 0 : _a.extend(publicActions);
262
324
  if (!rpcClient)
263
325
  throw new DynamicError('No RPC client');
264
- const address = yield this.getAddress();
265
- if (!address)
266
- return;
267
326
  return formatEther(yield rpcClient.getBalance({ address: address }));
268
327
  });
269
328
  }
270
329
  signMessage(messageToSign) {
271
330
  return __awaiter(this, void 0, void 0, function* () {
272
- const client = yield this.getSigner();
273
- const account = yield this.getAddress();
274
- if (!account || !client)
275
- return;
276
- return client.signMessage({
277
- account: account,
278
- message: messageToSign,
279
- });
331
+ const client = this === null || this === void 0 ? void 0 : this.kernelClient;
332
+ // https://docs.zerodev.app/sdk/core-api/sign-and-verify#signing-messages
333
+ if (!client)
334
+ throw new Error('Error fetching signer');
335
+ return client.signMessage({ message: messageToSign });
280
336
  });
281
337
  }
282
338
  createUiTransaction(from) {
283
339
  return __awaiter(this, void 0, void 0, function* () {
340
+ yield this.validateActiveWallet(from);
284
341
  const walletClient = this.getWalletClient();
285
342
  const publicClient = yield this.getPublicClient();
286
343
  if (!publicClient || !walletClient) {
@@ -289,6 +346,26 @@ class ZeroDevConnector extends WalletConnectorBase {
289
346
  return createViemUiTransaction({ from, publicClient, walletClient });
290
347
  });
291
348
  }
349
+ validateActiveWallet(expectedAddress) {
350
+ const _super = Object.create(null, {
351
+ validateActiveWallet: { get: () => super.validateActiveWallet }
352
+ });
353
+ return __awaiter(this, void 0, void 0, function* () {
354
+ var _a;
355
+ const eoaConnector = this === null || this === void 0 ? void 0 : this.eoaConnector;
356
+ if (eoaConnector && isTurnkeyWalletConnector(eoaConnector)) {
357
+ const verifiedCredentials = eoaConnector === null || eoaConnector === void 0 ? void 0 : eoaConnector.verifiedCredentials;
358
+ const expectedEoaAddress = (_a = verifiedCredentials === null || verifiedCredentials === void 0 ? void 0 : verifiedCredentials.find((vc) => vc.smartWalletRefAddress === expectedAddress)) === null || _a === void 0 ? void 0 : _a.address;
359
+ if (!expectedEoaAddress) {
360
+ throw new DynamicError('No EOA connector');
361
+ }
362
+ yield (eoaConnector === null || eoaConnector === void 0 ? void 0 : eoaConnector.validateActiveWallet(expectedEoaAddress));
363
+ }
364
+ else {
365
+ yield _super.validateActiveWallet.call(this, expectedAddress);
366
+ }
367
+ });
368
+ }
292
369
  }
293
370
 
294
371
  export { ZeroDevConnector };
package/src/index.cjs CHANGED
@@ -7,10 +7,10 @@ var ZeroDevConnector = require('./ZeroDevConnector.cjs');
7
7
  var ethereumAa = require('./ethereum-aa.cjs');
8
8
  var isZeroDevConnector = require('./utils/isZeroDevConnector.cjs');
9
9
 
10
- const ZeroDevSmartWalletConnectorsWithConfig = ({ bundlerProvider, } = {}) => {
11
- if (bundlerProvider) {
12
- ZeroDevConnector.ZeroDevConnector.bundlerProvider = bundlerProvider;
13
- }
10
+ const ZeroDevSmartWalletConnectorsWithConfig = ({ bundlerProvider, bundlerRpc, paymasterRpc, } = {}) => {
11
+ ZeroDevConnector.ZeroDevConnector.bundlerProvider = bundlerProvider;
12
+ ZeroDevConnector.ZeroDevConnector.bundlerRpc = bundlerRpc;
13
+ ZeroDevConnector.ZeroDevConnector.paymasterRpc = paymasterRpc;
14
14
  return ZeroDevSmartWalletConnectors;
15
15
  };
16
16
  const ZeroDevSmartWalletConnectors = (props) => {
package/src/index.d.ts CHANGED
@@ -2,7 +2,9 @@ import { WalletConnectorConstructor } from '@dynamic-labs/wallet-connector-core'
2
2
  import { BundlerProvider } from './utils';
3
3
  export * from './ethereum-aa';
4
4
  export { isZeroDevConnector } from './utils/isZeroDevConnector';
5
- export declare const ZeroDevSmartWalletConnectorsWithConfig: ({ bundlerProvider, }?: {
5
+ export declare const ZeroDevSmartWalletConnectorsWithConfig: ({ bundlerProvider, bundlerRpc, paymasterRpc, }?: {
6
6
  bundlerProvider?: BundlerProvider;
7
+ bundlerRpc?: string;
8
+ paymasterRpc?: string;
7
9
  }) => (props: any) => WalletConnectorConstructor[];
8
10
  export declare const ZeroDevSmartWalletConnectors: (props: any) => WalletConnectorConstructor[];
package/src/index.js CHANGED
@@ -3,10 +3,10 @@ import { ZeroDevConnector } from './ZeroDevConnector.js';
3
3
  export { EthereumAaConnector } from './ethereum-aa.js';
4
4
  export { isZeroDevConnector } from './utils/isZeroDevConnector.js';
5
5
 
6
- const ZeroDevSmartWalletConnectorsWithConfig = ({ bundlerProvider, } = {}) => {
7
- if (bundlerProvider) {
8
- ZeroDevConnector.bundlerProvider = bundlerProvider;
9
- }
6
+ const ZeroDevSmartWalletConnectorsWithConfig = ({ bundlerProvider, bundlerRpc, paymasterRpc, } = {}) => {
7
+ ZeroDevConnector.bundlerProvider = bundlerProvider;
8
+ ZeroDevConnector.bundlerRpc = bundlerRpc;
9
+ ZeroDevConnector.paymasterRpc = paymasterRpc;
10
10
  return ZeroDevSmartWalletConnectors;
11
11
  };
12
12
  const ZeroDevSmartWalletConnectors = (props) => {