@dynamic-labs/ethereum-aa 2.1.0-alpha.2 → 2.1.0-alpha.21

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.
@@ -1,18 +1,19 @@
1
1
  'use client'
2
2
  import { __awaiter } from '../_virtual/_tslib.js';
3
- import { createEcdsaKernelAccountClient } from '@zerodev/presets';
4
3
  import { publicActions, custom, createWalletClient, isHex, fromHex, formatEther } from 'viem';
5
- import { walletClientToSmartAccountSigner } from 'permissionless';
4
+ import { ENTRYPOINT_ADDRESS_V06, ENTRYPOINT_ADDRESS_V07, walletClientToSmartAccountSigner } from 'permissionless/utils';
5
+ import { ProviderEntryPointVersionEnum } from '@dynamic-labs/sdk-api-core';
6
6
  import { WalletConnectorBase } from '@dynamic-labs/wallet-connector-core';
7
7
  import { confirmationTransport, chainsMap, unFormatTransaction, createViemUiTransaction } from '@dynamic-labs/viem-utils';
8
8
  import { parseEvmNetworks, DynamicError, DeferredPromise, wrapMethodWithCallback, TransactionGasCannotBeSponsoredError, InsufficientFundsError } from '@dynamic-labs/utils';
9
9
  import { isEthWalletConnector } from '@dynamic-labs/ethereum';
10
10
  import { cachedChainIdKey, fetchChain } from './utils/fetchChain.js';
11
11
  import { logger } from './utils/logger.js';
12
+ import { createEcdsaKernelAccountClient } from './utils/createEcsdaKernelAccountClient.js';
12
13
 
13
14
  class ZeroDevConnector extends WalletConnectorBase {
14
15
  constructor(opts) {
15
- var _a;
16
+ var _a, _b;
16
17
  super(opts);
17
18
  this.connectedChain = 'EVM';
18
19
  this.supportedChains = ['ETH', 'EVM'];
@@ -34,6 +35,11 @@ class ZeroDevConnector extends WalletConnectorBase {
34
35
  this.projectId = zeroDevProjectId;
35
36
  this._walletUiUtils = opts.walletUiUtils;
36
37
  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;
37
43
  }
38
44
  getEOAConnector() {
39
45
  return this.eoaConnector;
@@ -65,6 +71,7 @@ class ZeroDevConnector extends WalletConnectorBase {
65
71
  }
66
72
  const kernelClient = yield createEcdsaKernelAccountClient({
67
73
  chain: yield fetchChain(this.projectId),
74
+ entryPointAddress: this.entryPoint,
68
75
  paymaster: 'NONE',
69
76
  projectId: this.projectId,
70
77
  provider: ZeroDevConnector.bundlerProvider,
@@ -102,6 +109,7 @@ class ZeroDevConnector extends WalletConnectorBase {
102
109
  const signer = yield eoaConnector.getSigner();
103
110
  this.kernelClientWithSponsorship = yield createEcdsaKernelAccountClient({
104
111
  chain: yield fetchChain(this.projectId),
112
+ entryPointAddress: this.entryPoint,
105
113
  paymaster: 'SPONSOR',
106
114
  projectId: this.projectId,
107
115
  provider: ZeroDevConnector.bundlerProvider,
@@ -139,6 +147,7 @@ class ZeroDevConnector extends WalletConnectorBase {
139
147
  }
140
148
  getTransport(provider) {
141
149
  const transport = confirmationTransport({
150
+ getAccounts: () => __awaiter(this, void 0, void 0, function* () { return [provider.account.address]; }),
142
151
  onPersonalSign: (_a) => __awaiter(this, [_a], void 0, function* ({ message }) {
143
152
  this._walletUiUtils.disabledConfirmationOnce();
144
153
  return provider.signMessage({
@@ -200,7 +209,8 @@ class ZeroDevConnector extends WalletConnectorBase {
200
209
  }
201
210
  getPublicClient() {
202
211
  return __awaiter(this, void 0, void 0, function* () {
203
- const provider = this.kernelClient.extend(publicActions);
212
+ var _a;
213
+ const provider = (_a = this.kernelClient) === null || _a === void 0 ? void 0 : _a.extend(publicActions);
204
214
  if (!provider)
205
215
  throw new DynamicError('No provider');
206
216
  return provider;
@@ -214,9 +224,9 @@ class ZeroDevConnector extends WalletConnectorBase {
214
224
  canSponsorTransactionGas(transaction) {
215
225
  return __awaiter(this, void 0, void 0, function* () {
216
226
  try {
217
- yield this.getKernelClientWithSponsorshipValidation();
227
+ const kernelClientWithSponsorship = yield this.getKernelClientWithSponsorshipValidation();
218
228
  const userOperation = {
219
- callData: yield this.kernelClientWithSponsorship.account.encodeCallData({
229
+ callData: yield kernelClientWithSponsorship.account.encodeCallData({
220
230
  data: transaction.data ? transaction.data : '0x',
221
231
  to: transaction.to,
222
232
  /**
@@ -225,11 +235,11 @@ class ZeroDevConnector extends WalletConnectorBase {
225
235
  */
226
236
  value: transaction.value && isHex(transaction.value)
227
237
  ? fromHex(transaction.value, 'bigint')
228
- : '0x0',
238
+ : fromHex('0x0', 'bigint'),
229
239
  }),
230
240
  };
231
- const result = yield this.kernelClientWithSponsorship.prepareUserOperationRequest({
232
- account: this.kernelClientWithSponsorship.account,
241
+ const result = yield kernelClientWithSponsorship.prepareUserOperationRequest({
242
+ account: kernelClientWithSponsorship.account,
233
243
  userOperation,
234
244
  });
235
245
  if (!result)
@@ -247,7 +257,8 @@ class ZeroDevConnector extends WalletConnectorBase {
247
257
  }
248
258
  getBalance() {
249
259
  return __awaiter(this, void 0, void 0, function* () {
250
- const rpcClient = this.kernelClient.extend(publicActions);
260
+ var _a;
261
+ const rpcClient = (_a = this.kernelClient) === null || _a === void 0 ? void 0 : _a.extend(publicActions);
251
262
  if (!rpcClient)
252
263
  throw new DynamicError('No RPC client');
253
264
  const address = yield this.getAddress();
package/src/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { Provider as BundlerProvider } from '@zerodev/presets';
2
1
  import { WalletConnectorConstructor } from '@dynamic-labs/wallet-connector-core';
2
+ import { BundlerProvider } from './utils';
3
3
  export * from './ethereum-aa';
4
4
  export { isZeroDevConnector } from './utils/isZeroDevConnector';
5
5
  export declare const ZeroDevSmartWalletConnectorsWithConfig: ({ bundlerProvider, }?: {
@@ -0,0 +1,76 @@
1
+ 'use client'
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ var _tslib = require('../../_virtual/_tslib.cjs');
7
+ var ecdsaValidator = require('@zerodev/ecdsa-validator');
8
+ var accounts = require('@zerodev/sdk/accounts');
9
+ var clients = require('@zerodev/sdk/clients');
10
+ var viem = require('viem');
11
+
12
+ const getZeroDevBundlerRPC = (projectId, provider) => {
13
+ let rpc = `https://rpc.zerodev.app/api/v2/bundler/${projectId}`;
14
+ if (provider) {
15
+ rpc += `?bundlerProvider=${provider}`;
16
+ }
17
+ return rpc;
18
+ };
19
+ const getZeroDevPaymasterRPC = (projectId, provider) => {
20
+ let rpc = `https://rpc.zerodev.app/api/v2/paymaster/${projectId}`;
21
+ if (provider) {
22
+ rpc += `?paymasterProvider=${provider}`;
23
+ }
24
+ return rpc;
25
+ };
26
+ const isERC20 = (value) => viem.isAddress(value);
27
+ const createEcdsaKernelAccountClient = (_a) => _tslib.__awaiter(void 0, [_a], void 0, function* ({ chain, projectId, signer, provider, index, paymaster = 'SPONSOR', entryPointAddress, }) {
28
+ const publicClient = viem.createPublicClient({
29
+ transport: viem.http(getZeroDevBundlerRPC(projectId, provider)),
30
+ });
31
+ const ecdsaValidator$1 = yield ecdsaValidator.signerToEcdsaValidator(publicClient, {
32
+ entryPoint: entryPointAddress,
33
+ signer,
34
+ });
35
+ const account = yield accounts.createKernelAccount(publicClient, {
36
+ entryPoint: entryPointAddress,
37
+ index,
38
+ plugins: {
39
+ sudo: ecdsaValidator$1,
40
+ },
41
+ });
42
+ const zerodevPaymaster = clients.createZeroDevPaymasterClient({
43
+ chain: chain,
44
+ entryPoint: entryPointAddress,
45
+ transport: viem.http(getZeroDevPaymasterRPC(projectId, provider)),
46
+ });
47
+ const kernelClient = clients.createKernelAccountClient({
48
+ account,
49
+ bundlerTransport: viem.http(getZeroDevBundlerRPC(projectId, provider)),
50
+ chain,
51
+ entryPoint: entryPointAddress,
52
+ middleware: paymaster !== 'NONE'
53
+ ? {
54
+ sponsorUserOperation: (_b) => _tslib.__awaiter(void 0, [_b], void 0, function* ({ userOperation }) {
55
+ const _userOperation = userOperation;
56
+ if (isERC20(paymaster)) {
57
+ return zerodevPaymaster.sponsorUserOperation({
58
+ entryPoint: entryPointAddress,
59
+ gasToken: paymaster,
60
+ userOperation: _userOperation,
61
+ });
62
+ }
63
+ return zerodevPaymaster.sponsorUserOperation({
64
+ entryPoint: entryPointAddress,
65
+ userOperation: _userOperation,
66
+ });
67
+ }),
68
+ }
69
+ : undefined,
70
+ });
71
+ return kernelClient;
72
+ });
73
+
74
+ exports.createEcdsaKernelAccountClient = createEcdsaKernelAccountClient;
75
+ exports.getZeroDevBundlerRPC = getZeroDevBundlerRPC;
76
+ exports.getZeroDevPaymasterRPC = getZeroDevPaymasterRPC;
@@ -0,0 +1,19 @@
1
+ import { KernelSmartAccount } from '@zerodev/sdk/accounts';
2
+ import { KernelAccountClient } from '@zerodev/sdk/clients';
3
+ import { SmartAccountSigner } from 'permissionless/accounts';
4
+ import { EntryPoint } from 'permissionless/types';
5
+ import { Address, HttpTransport, Chain } from 'viem';
6
+ export type BundlerProvider = 'STACKUP' | 'PIMLICO' | 'ALCHEMY' | 'GELATO';
7
+ export type ERC20Paymaster = Address;
8
+ export type PaymasterType = 'NONE' | 'SPONSOR' | ERC20Paymaster;
9
+ export declare const getZeroDevBundlerRPC: (projectId: string, provider?: BundlerProvider) => string;
10
+ export declare const getZeroDevPaymasterRPC: (projectId: string, provider?: BundlerProvider) => string;
11
+ export declare const createEcdsaKernelAccountClient: <entryPoint extends EntryPoint, TChain extends Chain | undefined = Chain | undefined, TSource extends string = "custom", TAddress extends `0x${string}` = `0x${string}`>({ chain, projectId, signer, provider, index, paymaster, entryPointAddress, }: {
12
+ chain: TChain;
13
+ projectId: string;
14
+ signer: SmartAccountSigner<TSource, TAddress>;
15
+ paymaster: PaymasterType;
16
+ entryPointAddress: entryPoint;
17
+ provider?: BundlerProvider;
18
+ index?: bigint;
19
+ }) => Promise<KernelAccountClient<entryPoint, HttpTransport, TChain, KernelSmartAccount<entryPoint, HttpTransport, TChain>>>;
@@ -0,0 +1,70 @@
1
+ 'use client'
2
+ import { __awaiter } from '../../_virtual/_tslib.js';
3
+ import { signerToEcdsaValidator } from '@zerodev/ecdsa-validator';
4
+ import { createKernelAccount } from '@zerodev/sdk/accounts';
5
+ import { createZeroDevPaymasterClient, createKernelAccountClient } from '@zerodev/sdk/clients';
6
+ import { createPublicClient, http, isAddress } from 'viem';
7
+
8
+ const getZeroDevBundlerRPC = (projectId, provider) => {
9
+ let rpc = `https://rpc.zerodev.app/api/v2/bundler/${projectId}`;
10
+ if (provider) {
11
+ rpc += `?bundlerProvider=${provider}`;
12
+ }
13
+ return rpc;
14
+ };
15
+ const getZeroDevPaymasterRPC = (projectId, provider) => {
16
+ let rpc = `https://rpc.zerodev.app/api/v2/paymaster/${projectId}`;
17
+ if (provider) {
18
+ rpc += `?paymasterProvider=${provider}`;
19
+ }
20
+ return rpc;
21
+ };
22
+ const isERC20 = (value) => isAddress(value);
23
+ const createEcdsaKernelAccountClient = (_a) => __awaiter(void 0, [_a], void 0, function* ({ chain, projectId, signer, provider, index, paymaster = 'SPONSOR', entryPointAddress, }) {
24
+ const publicClient = createPublicClient({
25
+ transport: http(getZeroDevBundlerRPC(projectId, provider)),
26
+ });
27
+ const ecdsaValidator = yield signerToEcdsaValidator(publicClient, {
28
+ entryPoint: entryPointAddress,
29
+ signer,
30
+ });
31
+ const account = yield createKernelAccount(publicClient, {
32
+ entryPoint: entryPointAddress,
33
+ index,
34
+ plugins: {
35
+ sudo: ecdsaValidator,
36
+ },
37
+ });
38
+ const zerodevPaymaster = createZeroDevPaymasterClient({
39
+ chain: chain,
40
+ entryPoint: entryPointAddress,
41
+ transport: http(getZeroDevPaymasterRPC(projectId, provider)),
42
+ });
43
+ const kernelClient = createKernelAccountClient({
44
+ account,
45
+ bundlerTransport: http(getZeroDevBundlerRPC(projectId, provider)),
46
+ chain,
47
+ entryPoint: entryPointAddress,
48
+ middleware: paymaster !== 'NONE'
49
+ ? {
50
+ sponsorUserOperation: (_b) => __awaiter(void 0, [_b], void 0, function* ({ userOperation }) {
51
+ const _userOperation = userOperation;
52
+ if (isERC20(paymaster)) {
53
+ return zerodevPaymaster.sponsorUserOperation({
54
+ entryPoint: entryPointAddress,
55
+ gasToken: paymaster,
56
+ userOperation: _userOperation,
57
+ });
58
+ }
59
+ return zerodevPaymaster.sponsorUserOperation({
60
+ entryPoint: entryPointAddress,
61
+ userOperation: _userOperation,
62
+ });
63
+ }),
64
+ }
65
+ : undefined,
66
+ });
67
+ return kernelClient;
68
+ });
69
+
70
+ export { createEcdsaKernelAccountClient, getZeroDevBundlerRPC, getZeroDevPaymasterRPC };
@@ -1,3 +1,4 @@
1
1
  export * from './fetchChain';
2
2
  export * from './logger';
3
3
  export * from './isZeroDevConnector';
4
+ export * from './createEcsdaKernelAccountClient';