@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/CHANGELOG.md +622 -0
- package/package.json +12 -12
- package/src/ZeroDevConnector.cjs +103 -26
- package/src/ZeroDevConnector.d.ts +29 -10
- package/src/ZeroDevConnector.js +101 -24
- package/src/index.cjs +4 -4
- package/src/index.d.ts +3 -1
- package/src/index.js +4 -4
- package/src/utils/createEcsdaKernelAccountClient.cjs +10 -7
- package/src/utils/createEcsdaKernelAccountClient.d.ts +6 -1
- package/src/utils/createEcsdaKernelAccountClient.js +10 -7
- package/src/utils/fetchChain.cjs +3 -3
- package/src/utils/fetchChain.js +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynamic-labs/ethereum-aa",
|
|
3
|
-
"version": "3.0.0
|
|
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.
|
|
30
|
-
"@zerodev/ecdsa-validator": "5.
|
|
31
|
-
"@zerodev/
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"@dynamic-labs/
|
|
35
|
-
"@dynamic-labs/
|
|
36
|
-
"@dynamic-labs/
|
|
37
|
-
"@dynamic-labs/
|
|
38
|
-
"@dynamic-labs/wallet-book": "3.0.0
|
|
39
|
-
"@dynamic-labs/wallet-connector-core": "3.0.0
|
|
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"
|
package/src/ZeroDevConnector.cjs
CHANGED
|
@@ -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
|
|
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
|
-
|
|
44
|
-
|
|
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 (
|
|
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 =
|
|
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(
|
|
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 ?
|
|
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 =
|
|
277
|
-
|
|
278
|
-
if (!
|
|
279
|
-
|
|
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
|
|
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,
|
|
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<
|
|
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:
|
|
25
|
-
|
|
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
|
-
|
|
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
|
-
|
|
51
|
-
|
|
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:
|
|
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 {};
|
package/src/ZeroDevConnector.js
CHANGED
|
@@ -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 {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
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
|
-
|
|
40
|
-
|
|
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 =
|
|
273
|
-
|
|
274
|
-
if (!
|
|
275
|
-
|
|
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
|
-
|
|
12
|
-
|
|
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
|
-
|
|
8
|
-
|
|
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) => {
|