@dynamic-labs-wallet/node-evm 0.0.0-beta-191.1

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/index.cjs.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "./src/index";
package/index.cjs.js ADDED
@@ -0,0 +1,281 @@
1
+ 'use strict';
2
+
3
+ var node = require('@dynamic-labs-wallet/node');
4
+ var viem = require('viem');
5
+ var chains = require('viem/chains');
6
+
7
+ function _extends() {
8
+ _extends = Object.assign || function assign(target) {
9
+ for(var i = 1; i < arguments.length; i++){
10
+ var source = arguments[i];
11
+ for(var key in source)if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];
12
+ }
13
+ return target;
14
+ };
15
+ return _extends.apply(this, arguments);
16
+ }
17
+
18
+ const EVM_SIGN_MESSAGE_PREFIX = `\x19Ethereum Signed Message:\n`;
19
+ // Error messages
20
+ const ERROR_KEYGEN_FAILED = 'Error with keygen';
21
+ const ERROR_CREATE_WALLET_ACCOUNT = 'Error creating evm wallet account';
22
+ const ERROR_SIGN_MESSAGE = 'Error signing message';
23
+ const ERROR_ACCOUNT_ADDRESS_REQUIRED = 'Account address is required';
24
+ const ERROR_VERIFY_MESSAGE_SIGNATURE = 'Error verifying message signature';
25
+
26
+ const formatEVMMessage = (message)=>{
27
+ return `${EVM_SIGN_MESSAGE_PREFIX}${message.length}${message}`;
28
+ };
29
+ const serializeECDSASignature = (signature)=>{
30
+ return viem.serializeSignature({
31
+ r: `0x${Buffer.from(signature.r).toString('hex')}`,
32
+ s: `0x${Buffer.from(signature.s).toString('hex')}`,
33
+ v: BigInt(signature.v)
34
+ });
35
+ };
36
+ const deriveAccountAddress = ({ rawPublicKey })=>{
37
+ const serializedUncompressed = rawPublicKey.serializeUncompressed();
38
+ const firstByteRemoved = serializedUncompressed.slice(1);
39
+ const hashed = node.MessageHash.keccak256(firstByteRemoved).bytes;
40
+ const lastTwentyBytes = hashed.slice(-20);
41
+ const accountAddress = '0x' + Buffer.from(lastTwentyBytes).toString('hex');
42
+ const publicKeyHex = rawPublicKey.pubKeyAsHex();
43
+ return {
44
+ accountAddress: viem.getAddress(accountAddress),
45
+ publicKeyHex
46
+ };
47
+ };
48
+
49
+ class DynamicEvmWalletClient extends node.DynamicWalletClient {
50
+ createViemPublicClient({ chain, rpcUrl }) {
51
+ return viem.createPublicClient({
52
+ chain,
53
+ transport: viem.http(rpcUrl)
54
+ });
55
+ }
56
+ async createWalletAccount({ thresholdSignatureScheme, password = undefined, onError }) {
57
+ try {
58
+ let ceremonyCeremonyCompleteResolver;
59
+ const ceremonyCompletePromise = new Promise((resolve)=>{
60
+ ceremonyCeremonyCompleteResolver = resolve;
61
+ });
62
+ // Generate key shares for given threshold signature scheme (TSS)
63
+ const { rawPublicKey, externalServerKeyShares } = await this.keyGen({
64
+ chainName: this.chainName,
65
+ thresholdSignatureScheme,
66
+ onError,
67
+ onCeremonyComplete: (accountAddress, walletId)=>{
68
+ // update wallet map
69
+ const checksumAddress = viem.getAddress(accountAddress);
70
+ this.walletMap[checksumAddress] = _extends({}, this.walletMap[checksumAddress] || {}, {
71
+ accountAddress: checksumAddress,
72
+ walletId,
73
+ chainName: this.chainName,
74
+ thresholdSignatureScheme,
75
+ externalServerKeySharesBackupInfo: node.getExternalServerKeyShareBackupInfo()
76
+ });
77
+ this.logger.debug('walletMap updated for wallet', {
78
+ context: {
79
+ accountAddress,
80
+ walletId,
81
+ walletMap: this.walletMap
82
+ }
83
+ });
84
+ ceremonyCeremonyCompleteResolver(undefined);
85
+ }
86
+ });
87
+ // Wait for the ceremony to complete before proceeding
88
+ await ceremonyCompletePromise;
89
+ if (!rawPublicKey || !externalServerKeyShares) {
90
+ throw new Error(ERROR_KEYGEN_FAILED);
91
+ }
92
+ // Get EVM address from public key
93
+ const { accountAddress, publicKeyHex } = deriveAccountAddress({
94
+ rawPublicKey: rawPublicKey
95
+ });
96
+ await this.storeEncryptedBackupByWalletWithRetry({
97
+ accountAddress,
98
+ externalServerKeyShares,
99
+ password
100
+ });
101
+ return {
102
+ accountAddress,
103
+ rawPublicKey,
104
+ publicKeyHex,
105
+ externalServerKeyShares
106
+ };
107
+ } catch (error) {
108
+ // this.logger.error(ERROR_CREATE_WALLET_ACCOUNT, error);
109
+ throw new Error(ERROR_CREATE_WALLET_ACCOUNT);
110
+ }
111
+ }
112
+ async signMessage({ message, accountAddress, password = undefined }) {
113
+ await this.verifyPassword({
114
+ accountAddress,
115
+ password,
116
+ walletOperation: node.WalletOperation.SIGN_MESSAGE
117
+ });
118
+ await this.getWallet({
119
+ accountAddress,
120
+ walletOperation: node.WalletOperation.SIGN_MESSAGE
121
+ });
122
+ try {
123
+ if (!accountAddress) {
124
+ throw new Error(ERROR_ACCOUNT_ADDRESS_REQUIRED);
125
+ }
126
+ // Format the message for EVM signing
127
+ const formattedMessage = formatEVMMessage(message);
128
+ // Sign the message using MPC
129
+ const signatureEcdsa = await this.sign({
130
+ message: formattedMessage,
131
+ accountAddress: accountAddress,
132
+ chainName: this.chainName,
133
+ password
134
+ });
135
+ // Serialize the signature
136
+ const serializedSignature = serializeECDSASignature(signatureEcdsa);
137
+ return serializedSignature;
138
+ } catch (error) {
139
+ this.logger.error(ERROR_SIGN_MESSAGE, error);
140
+ throw new Error(ERROR_SIGN_MESSAGE);
141
+ }
142
+ }
143
+ async verifyMessageSignature({ accountAddress, message, signature }) {
144
+ try {
145
+ // Verify the signature using the public client
146
+ const publicClient = this.createViemPublicClient({
147
+ chain: chains.mainnet
148
+ });
149
+ const verified = await publicClient.verifyMessage({
150
+ address: accountAddress,
151
+ message,
152
+ signature: signature
153
+ });
154
+ return verified;
155
+ } catch (error) {
156
+ this.logger.error(ERROR_VERIFY_MESSAGE_SIGNATURE, error);
157
+ throw new Error(ERROR_VERIFY_MESSAGE_SIGNATURE);
158
+ }
159
+ }
160
+ async signTransaction({ senderAddress, transaction, password = undefined }) {
161
+ await this.verifyPassword({
162
+ accountAddress: senderAddress,
163
+ password,
164
+ walletOperation: node.WalletOperation.SIGN_TRANSACTION
165
+ });
166
+ const serializedTx = viem.serializeTransaction(transaction);
167
+ const serializedTxBytes = Uint8Array.from(Buffer.from(serializedTx.slice(2), 'hex'));
168
+ if (!(serializedTxBytes instanceof Uint8Array)) {
169
+ throw new Error('Invalid serializedTxBytes');
170
+ }
171
+ // Get signature using MPC (this will coordinate with server party)
172
+ const signatureEcdsa = await this.sign({
173
+ message: serializedTxBytes,
174
+ accountAddress: senderAddress,
175
+ chainName: this.chainName,
176
+ password
177
+ });
178
+ if (!('r' in signatureEcdsa && 's' in signatureEcdsa && 'v' in signatureEcdsa)) {
179
+ throw new Error('Invalid signature format returned from MPC signing');
180
+ }
181
+ try {
182
+ const r = `0x${Buffer.from(signatureEcdsa.r).toString('hex')}`;
183
+ const s = `0x${Buffer.from(signatureEcdsa.s).toString('hex')}`;
184
+ const v = BigInt(signatureEcdsa.v);
185
+ const signedTx = _extends({}, transaction, {
186
+ r: r,
187
+ s: s,
188
+ v: v
189
+ });
190
+ const serializedSignedTx = viem.serializeTransaction(signedTx);
191
+ return serializedSignedTx;
192
+ } catch (error) {
193
+ this.logger.error('Error signing transaction:', error);
194
+ throw error;
195
+ }
196
+ }
197
+ async exportPrivateKey({ accountAddress, password = undefined }) {
198
+ await this.verifyPassword({
199
+ accountAddress,
200
+ password,
201
+ walletOperation: node.WalletOperation.EXPORT_PRIVATE_KEY
202
+ });
203
+ const { derivedPrivateKey } = await this.exportKey({
204
+ accountAddress,
205
+ chainName: this.chainName,
206
+ password
207
+ });
208
+ return {
209
+ derivedPrivateKey
210
+ };
211
+ }
212
+ async offlineExportPrivateKey({ keyShares, derivationPath }) {
213
+ const { derivedPrivateKey } = await this.offlineExportKey({
214
+ chainName: this.chainName,
215
+ keyShares,
216
+ derivationPath
217
+ });
218
+ return {
219
+ derivedPrivateKey
220
+ };
221
+ }
222
+ async importPrivateKey({ privateKey, chainName, thresholdSignatureScheme, password = undefined, onError }) {
223
+ let ceremonyCeremonyCompleteResolver;
224
+ const ceremonyCompletePromise = new Promise((resolve)=>{
225
+ ceremonyCeremonyCompleteResolver = resolve;
226
+ });
227
+ // TODO: validate private key for EVM
228
+ const { rawPublicKey, externalServerKeyShares } = await this.importRawPrivateKey({
229
+ chainName,
230
+ privateKey,
231
+ thresholdSignatureScheme,
232
+ onError,
233
+ onCeremonyComplete: (accountAddress, walletId)=>{
234
+ // update wallet map
235
+ const checksumAddress = viem.getAddress(accountAddress);
236
+ this.walletMap[checksumAddress] = _extends({}, this.walletMap[checksumAddress] || {}, {
237
+ accountAddress: checksumAddress,
238
+ walletId,
239
+ chainName: this.chainName,
240
+ thresholdSignatureScheme,
241
+ externalServerKeySharesBackupInfo: node.getExternalServerKeyShareBackupInfo()
242
+ });
243
+ ceremonyCeremonyCompleteResolver(undefined);
244
+ }
245
+ });
246
+ // Wait for the ceremony to complete before proceeding
247
+ await ceremonyCompletePromise;
248
+ if (!rawPublicKey || !externalServerKeyShares) {
249
+ throw new Error('Error creating wallet account');
250
+ }
251
+ const { accountAddress, publicKeyHex } = deriveAccountAddress({
252
+ rawPublicKey: rawPublicKey
253
+ });
254
+ await this.storeEncryptedBackupByWalletWithRetry({
255
+ accountAddress,
256
+ externalServerKeyShares,
257
+ password
258
+ });
259
+ return {
260
+ accountAddress,
261
+ rawPublicKey,
262
+ publicKeyHex,
263
+ externalServerKeyShares
264
+ };
265
+ }
266
+ async getEvmWallets() {
267
+ const wallets = await this.getWallets();
268
+ const evmWallets = wallets.filter((wallet)=>wallet.chainName === 'eip155');
269
+ return evmWallets;
270
+ }
271
+ constructor({ environmentId, baseApiUrl, baseMPCRelayApiUrl, debug }){
272
+ super({
273
+ environmentId,
274
+ baseApiUrl,
275
+ baseMPCRelayApiUrl,
276
+ debug
277
+ }), this.chainName = 'EVM';
278
+ }
279
+ }
280
+
281
+ exports.DynamicEvmWalletClient = DynamicEvmWalletClient;
package/index.esm.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "./src/index";
package/index.esm.js ADDED
@@ -0,0 +1,279 @@
1
+ import { MessageHash, DynamicWalletClient, getExternalServerKeyShareBackupInfo, WalletOperation } from '@dynamic-labs-wallet/node';
2
+ import { getAddress, serializeSignature, createPublicClient, http, serializeTransaction } from 'viem';
3
+ import { mainnet } from 'viem/chains';
4
+
5
+ function _extends() {
6
+ _extends = Object.assign || function assign(target) {
7
+ for(var i = 1; i < arguments.length; i++){
8
+ var source = arguments[i];
9
+ for(var key in source)if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];
10
+ }
11
+ return target;
12
+ };
13
+ return _extends.apply(this, arguments);
14
+ }
15
+
16
+ const EVM_SIGN_MESSAGE_PREFIX = `\x19Ethereum Signed Message:\n`;
17
+ // Error messages
18
+ const ERROR_KEYGEN_FAILED = 'Error with keygen';
19
+ const ERROR_CREATE_WALLET_ACCOUNT = 'Error creating evm wallet account';
20
+ const ERROR_SIGN_MESSAGE = 'Error signing message';
21
+ const ERROR_ACCOUNT_ADDRESS_REQUIRED = 'Account address is required';
22
+ const ERROR_VERIFY_MESSAGE_SIGNATURE = 'Error verifying message signature';
23
+
24
+ const formatEVMMessage = (message)=>{
25
+ return `${EVM_SIGN_MESSAGE_PREFIX}${message.length}${message}`;
26
+ };
27
+ const serializeECDSASignature = (signature)=>{
28
+ return serializeSignature({
29
+ r: `0x${Buffer.from(signature.r).toString('hex')}`,
30
+ s: `0x${Buffer.from(signature.s).toString('hex')}`,
31
+ v: BigInt(signature.v)
32
+ });
33
+ };
34
+ const deriveAccountAddress = ({ rawPublicKey })=>{
35
+ const serializedUncompressed = rawPublicKey.serializeUncompressed();
36
+ const firstByteRemoved = serializedUncompressed.slice(1);
37
+ const hashed = MessageHash.keccak256(firstByteRemoved).bytes;
38
+ const lastTwentyBytes = hashed.slice(-20);
39
+ const accountAddress = '0x' + Buffer.from(lastTwentyBytes).toString('hex');
40
+ const publicKeyHex = rawPublicKey.pubKeyAsHex();
41
+ return {
42
+ accountAddress: getAddress(accountAddress),
43
+ publicKeyHex
44
+ };
45
+ };
46
+
47
+ class DynamicEvmWalletClient extends DynamicWalletClient {
48
+ createViemPublicClient({ chain, rpcUrl }) {
49
+ return createPublicClient({
50
+ chain,
51
+ transport: http(rpcUrl)
52
+ });
53
+ }
54
+ async createWalletAccount({ thresholdSignatureScheme, password = undefined, onError }) {
55
+ try {
56
+ let ceremonyCeremonyCompleteResolver;
57
+ const ceremonyCompletePromise = new Promise((resolve)=>{
58
+ ceremonyCeremonyCompleteResolver = resolve;
59
+ });
60
+ // Generate key shares for given threshold signature scheme (TSS)
61
+ const { rawPublicKey, externalServerKeyShares } = await this.keyGen({
62
+ chainName: this.chainName,
63
+ thresholdSignatureScheme,
64
+ onError,
65
+ onCeremonyComplete: (accountAddress, walletId)=>{
66
+ // update wallet map
67
+ const checksumAddress = getAddress(accountAddress);
68
+ this.walletMap[checksumAddress] = _extends({}, this.walletMap[checksumAddress] || {}, {
69
+ accountAddress: checksumAddress,
70
+ walletId,
71
+ chainName: this.chainName,
72
+ thresholdSignatureScheme,
73
+ externalServerKeySharesBackupInfo: getExternalServerKeyShareBackupInfo()
74
+ });
75
+ this.logger.debug('walletMap updated for wallet', {
76
+ context: {
77
+ accountAddress,
78
+ walletId,
79
+ walletMap: this.walletMap
80
+ }
81
+ });
82
+ ceremonyCeremonyCompleteResolver(undefined);
83
+ }
84
+ });
85
+ // Wait for the ceremony to complete before proceeding
86
+ await ceremonyCompletePromise;
87
+ if (!rawPublicKey || !externalServerKeyShares) {
88
+ throw new Error(ERROR_KEYGEN_FAILED);
89
+ }
90
+ // Get EVM address from public key
91
+ const { accountAddress, publicKeyHex } = deriveAccountAddress({
92
+ rawPublicKey: rawPublicKey
93
+ });
94
+ await this.storeEncryptedBackupByWalletWithRetry({
95
+ accountAddress,
96
+ externalServerKeyShares,
97
+ password
98
+ });
99
+ return {
100
+ accountAddress,
101
+ rawPublicKey,
102
+ publicKeyHex,
103
+ externalServerKeyShares
104
+ };
105
+ } catch (error) {
106
+ // this.logger.error(ERROR_CREATE_WALLET_ACCOUNT, error);
107
+ throw new Error(ERROR_CREATE_WALLET_ACCOUNT);
108
+ }
109
+ }
110
+ async signMessage({ message, accountAddress, password = undefined }) {
111
+ await this.verifyPassword({
112
+ accountAddress,
113
+ password,
114
+ walletOperation: WalletOperation.SIGN_MESSAGE
115
+ });
116
+ await this.getWallet({
117
+ accountAddress,
118
+ walletOperation: WalletOperation.SIGN_MESSAGE
119
+ });
120
+ try {
121
+ if (!accountAddress) {
122
+ throw new Error(ERROR_ACCOUNT_ADDRESS_REQUIRED);
123
+ }
124
+ // Format the message for EVM signing
125
+ const formattedMessage = formatEVMMessage(message);
126
+ // Sign the message using MPC
127
+ const signatureEcdsa = await this.sign({
128
+ message: formattedMessage,
129
+ accountAddress: accountAddress,
130
+ chainName: this.chainName,
131
+ password
132
+ });
133
+ // Serialize the signature
134
+ const serializedSignature = serializeECDSASignature(signatureEcdsa);
135
+ return serializedSignature;
136
+ } catch (error) {
137
+ this.logger.error(ERROR_SIGN_MESSAGE, error);
138
+ throw new Error(ERROR_SIGN_MESSAGE);
139
+ }
140
+ }
141
+ async verifyMessageSignature({ accountAddress, message, signature }) {
142
+ try {
143
+ // Verify the signature using the public client
144
+ const publicClient = this.createViemPublicClient({
145
+ chain: mainnet
146
+ });
147
+ const verified = await publicClient.verifyMessage({
148
+ address: accountAddress,
149
+ message,
150
+ signature: signature
151
+ });
152
+ return verified;
153
+ } catch (error) {
154
+ this.logger.error(ERROR_VERIFY_MESSAGE_SIGNATURE, error);
155
+ throw new Error(ERROR_VERIFY_MESSAGE_SIGNATURE);
156
+ }
157
+ }
158
+ async signTransaction({ senderAddress, transaction, password = undefined }) {
159
+ await this.verifyPassword({
160
+ accountAddress: senderAddress,
161
+ password,
162
+ walletOperation: WalletOperation.SIGN_TRANSACTION
163
+ });
164
+ const serializedTx = serializeTransaction(transaction);
165
+ const serializedTxBytes = Uint8Array.from(Buffer.from(serializedTx.slice(2), 'hex'));
166
+ if (!(serializedTxBytes instanceof Uint8Array)) {
167
+ throw new Error('Invalid serializedTxBytes');
168
+ }
169
+ // Get signature using MPC (this will coordinate with server party)
170
+ const signatureEcdsa = await this.sign({
171
+ message: serializedTxBytes,
172
+ accountAddress: senderAddress,
173
+ chainName: this.chainName,
174
+ password
175
+ });
176
+ if (!('r' in signatureEcdsa && 's' in signatureEcdsa && 'v' in signatureEcdsa)) {
177
+ throw new Error('Invalid signature format returned from MPC signing');
178
+ }
179
+ try {
180
+ const r = `0x${Buffer.from(signatureEcdsa.r).toString('hex')}`;
181
+ const s = `0x${Buffer.from(signatureEcdsa.s).toString('hex')}`;
182
+ const v = BigInt(signatureEcdsa.v);
183
+ const signedTx = _extends({}, transaction, {
184
+ r: r,
185
+ s: s,
186
+ v: v
187
+ });
188
+ const serializedSignedTx = serializeTransaction(signedTx);
189
+ return serializedSignedTx;
190
+ } catch (error) {
191
+ this.logger.error('Error signing transaction:', error);
192
+ throw error;
193
+ }
194
+ }
195
+ async exportPrivateKey({ accountAddress, password = undefined }) {
196
+ await this.verifyPassword({
197
+ accountAddress,
198
+ password,
199
+ walletOperation: WalletOperation.EXPORT_PRIVATE_KEY
200
+ });
201
+ const { derivedPrivateKey } = await this.exportKey({
202
+ accountAddress,
203
+ chainName: this.chainName,
204
+ password
205
+ });
206
+ return {
207
+ derivedPrivateKey
208
+ };
209
+ }
210
+ async offlineExportPrivateKey({ keyShares, derivationPath }) {
211
+ const { derivedPrivateKey } = await this.offlineExportKey({
212
+ chainName: this.chainName,
213
+ keyShares,
214
+ derivationPath
215
+ });
216
+ return {
217
+ derivedPrivateKey
218
+ };
219
+ }
220
+ async importPrivateKey({ privateKey, chainName, thresholdSignatureScheme, password = undefined, onError }) {
221
+ let ceremonyCeremonyCompleteResolver;
222
+ const ceremonyCompletePromise = new Promise((resolve)=>{
223
+ ceremonyCeremonyCompleteResolver = resolve;
224
+ });
225
+ // TODO: validate private key for EVM
226
+ const { rawPublicKey, externalServerKeyShares } = await this.importRawPrivateKey({
227
+ chainName,
228
+ privateKey,
229
+ thresholdSignatureScheme,
230
+ onError,
231
+ onCeremonyComplete: (accountAddress, walletId)=>{
232
+ // update wallet map
233
+ const checksumAddress = getAddress(accountAddress);
234
+ this.walletMap[checksumAddress] = _extends({}, this.walletMap[checksumAddress] || {}, {
235
+ accountAddress: checksumAddress,
236
+ walletId,
237
+ chainName: this.chainName,
238
+ thresholdSignatureScheme,
239
+ externalServerKeySharesBackupInfo: getExternalServerKeyShareBackupInfo()
240
+ });
241
+ ceremonyCeremonyCompleteResolver(undefined);
242
+ }
243
+ });
244
+ // Wait for the ceremony to complete before proceeding
245
+ await ceremonyCompletePromise;
246
+ if (!rawPublicKey || !externalServerKeyShares) {
247
+ throw new Error('Error creating wallet account');
248
+ }
249
+ const { accountAddress, publicKeyHex } = deriveAccountAddress({
250
+ rawPublicKey: rawPublicKey
251
+ });
252
+ await this.storeEncryptedBackupByWalletWithRetry({
253
+ accountAddress,
254
+ externalServerKeyShares,
255
+ password
256
+ });
257
+ return {
258
+ accountAddress,
259
+ rawPublicKey,
260
+ publicKeyHex,
261
+ externalServerKeyShares
262
+ };
263
+ }
264
+ async getEvmWallets() {
265
+ const wallets = await this.getWallets();
266
+ const evmWallets = wallets.filter((wallet)=>wallet.chainName === 'eip155');
267
+ return evmWallets;
268
+ }
269
+ constructor({ environmentId, baseApiUrl, baseMPCRelayApiUrl, debug }){
270
+ super({
271
+ environmentId,
272
+ baseApiUrl,
273
+ baseMPCRelayApiUrl,
274
+ debug
275
+ }), this.chainName = 'EVM';
276
+ }
277
+ }
278
+
279
+ export { DynamicEvmWalletClient };
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@dynamic-labs-wallet/node-evm",
3
+ "version": "0.0.0-beta-191.1",
4
+ "license": "MIT",
5
+ "dependencies": {
6
+ "@dynamic-labs-wallet/node": "0.0.0-beta-191.1"
7
+ },
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "peerDependencies": {
12
+ "viem": "^2.22.1"
13
+ },
14
+ "devDependencies": {
15
+ "typescript": "^5.0.0",
16
+ "@types/node": "^20.0.0"
17
+ },
18
+ "nx": {
19
+ "sourceRoot": "packages/node-evm/src",
20
+ "projectType": "library",
21
+ "name": "node-evm",
22
+ "targets": {
23
+ "build": {}
24
+ }
25
+ },
26
+ "main": "./index.cjs.js",
27
+ "module": "./index.esm.js",
28
+ "types": "./index.esm.d.ts",
29
+ "exports": {
30
+ "./package.json": "./package.json",
31
+ ".": {
32
+ "types": "./index.esm.d.ts",
33
+ "import": "./index.esm.js",
34
+ "require": "./index.cjs.js",
35
+ "default": "./index.cjs.js"
36
+ }
37
+ }
38
+ }
@@ -0,0 +1,61 @@
1
+ import { ServerKeyShare, DynamicWalletClient, EcdsaKeygenResult, EcdsaPublicKey, Ed25519KeygenResult, ThresholdSignatureScheme, DynamicWalletClientProps } from '@dynamic-labs-wallet/node';
2
+ import { type PublicClient, type Chain, type SignableMessage, type TransactionSerializable } from 'viem';
3
+ export declare class DynamicEvmWalletClient extends DynamicWalletClient {
4
+ readonly chainName = "EVM";
5
+ constructor({ environmentId, baseApiUrl, baseMPCRelayApiUrl, debug, }: DynamicWalletClientProps);
6
+ createViemPublicClient({ chain, rpcUrl, }: {
7
+ chain: Chain;
8
+ rpcUrl?: string;
9
+ }): PublicClient;
10
+ createWalletAccount({ thresholdSignatureScheme, password, onError, }: {
11
+ thresholdSignatureScheme: ThresholdSignatureScheme;
12
+ password?: string;
13
+ onError?: (error: Error) => void;
14
+ }): Promise<{
15
+ accountAddress: string;
16
+ publicKeyHex: string;
17
+ rawPublicKey: EcdsaPublicKey | Uint8Array | undefined;
18
+ externalServerKeyShares: ServerKeyShare[];
19
+ }>;
20
+ signMessage({ message, accountAddress, password, }: {
21
+ message: string;
22
+ accountAddress: string;
23
+ password?: string;
24
+ }): Promise<`0x${string}`>;
25
+ verifyMessageSignature({ accountAddress, message, signature, }: {
26
+ accountAddress: string;
27
+ message: SignableMessage;
28
+ signature: any;
29
+ }): Promise<boolean>;
30
+ signTransaction({ senderAddress, transaction, password, }: {
31
+ senderAddress: string;
32
+ transaction: TransactionSerializable;
33
+ password?: string;
34
+ }): Promise<string>;
35
+ exportPrivateKey({ accountAddress, password, }: {
36
+ accountAddress: string;
37
+ password?: string;
38
+ }): Promise<{
39
+ derivedPrivateKey: string | undefined;
40
+ }>;
41
+ offlineExportPrivateKey({ keyShares, derivationPath, }: {
42
+ keyShares: (EcdsaKeygenResult | Ed25519KeygenResult)[];
43
+ derivationPath?: string;
44
+ }): Promise<{
45
+ derivedPrivateKey: string | undefined;
46
+ }>;
47
+ importPrivateKey({ privateKey, chainName, thresholdSignatureScheme, password, onError, }: {
48
+ privateKey: string;
49
+ chainName: string;
50
+ thresholdSignatureScheme: ThresholdSignatureScheme;
51
+ password?: string;
52
+ onError?: (error: Error) => void;
53
+ }): Promise<{
54
+ accountAddress: string;
55
+ publicKeyHex: string;
56
+ rawPublicKey: EcdsaPublicKey | Uint8Array | undefined;
57
+ externalServerKeyShares: ServerKeyShare[];
58
+ }>;
59
+ getEvmWallets(): Promise<any>;
60
+ }
61
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EAEd,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EAGzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,KAAK,EAEV,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAE7B,MAAM,MAAM,CAAC;AAed,qBAAa,sBAAuB,SAAQ,mBAAmB;IAC7D,QAAQ,CAAC,SAAS,SAAS;gBAEf,EACV,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,KAAK,GACN,EAAE,wBAAwB;IAS3B,sBAAsB,CAAC,EACrB,KAAK,EACL,MAAM,GACP,EAAE;QACD,KAAK,EAAE,KAAK,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,YAAY;IAOV,mBAAmB,CAAC,EACxB,wBAAwB,EACxB,QAAoB,EACpB,OAAO,GACR,EAAE;QACD,wBAAwB,EAAE,wBAAwB,CAAC;QACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;KAClC,GAAG,OAAO,CAAC;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,cAAc,GAAG,UAAU,GAAG,SAAS,CAAC;QACtD,uBAAuB,EAAE,cAAc,EAAE,CAAC;KAC3C,CAAC;IAiEI,WAAW,CAAC,EAChB,OAAO,EACP,cAAc,EACd,QAAoB,GACrB,EAAE;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IAqCK,sBAAsB,CAAC,EAC3B,cAAc,EACd,OAAO,EACP,SAAS,GACV,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,eAAe,CAAC;QACzB,SAAS,EAAE,GAAG,CAAC;KAChB;IAmBK,eAAe,CAAC,EACpB,aAAa,EACb,WAAW,EACX,QAAoB,GACrB,EAAE;QACD,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,uBAAuB,CAAC;QACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,MAAM,CAAC;IAmDb,gBAAgB,CAAC,EACrB,cAAc,EACd,QAAoB,GACrB,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;;;IAeK,uBAAuB,CAAC,EAC5B,SAAS,EACT,cAAc,GACf,EAAE;QACD,SAAS,EAAE,CAAC,iBAAiB,GAAG,mBAAmB,CAAC,EAAE,CAAC;QACvD,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB;;;IASK,gBAAgB,CAAC,EACrB,UAAU,EACV,SAAS,EACT,wBAAwB,EACxB,QAAoB,EACpB,OAAO,GACR,EAAE;QACD,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,wBAAwB,EAAE,wBAAwB,CAAC;QACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;KAClC,GAAG,OAAO,CAAC;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,cAAc,GAAG,UAAU,GAAG,SAAS,CAAC;QACtD,uBAAuB,EAAE,cAAc,EAAE,CAAC;KAC3C,CAAC;IAqDI,aAAa;CAOpB"}
@@ -0,0 +1,7 @@
1
+ export declare const EVM_SIGN_MESSAGE_PREFIX = "\u0019Ethereum Signed Message:\n";
2
+ export declare const ERROR_KEYGEN_FAILED = "Error with keygen";
3
+ export declare const ERROR_CREATE_WALLET_ACCOUNT = "Error creating evm wallet account";
4
+ export declare const ERROR_SIGN_MESSAGE = "Error signing message";
5
+ export declare const ERROR_ACCOUNT_ADDRESS_REQUIRED = "Account address is required";
6
+ export declare const ERROR_VERIFY_MESSAGE_SIGNATURE = "Error verifying message signature";
7
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/client/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,qCAAmC,CAAC;AAGxE,eAAO,MAAM,mBAAmB,sBAAsB,CAAC;AAEvD,eAAO,MAAM,2BAA2B,sCAAsC,CAAC;AAE/E,eAAO,MAAM,kBAAkB,0BAA0B,CAAC;AAE1D,eAAO,MAAM,8BAA8B,gCAAgC,CAAC;AAE5E,eAAO,MAAM,8BAA8B,sCAAsC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './client';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
package/src/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './client';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC"}
package/src/utils.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import { EcdsaSignature, EcdsaPublicKey } from '@dynamic-labs-wallet/node';
2
+ export declare const formatEVMMessage: (message: string) => string;
3
+ export declare const serializeECDSASignature: (signature: EcdsaSignature) => `0x${string}`;
4
+ export declare const deriveAccountAddress: ({ rawPublicKey, }: {
5
+ rawPublicKey: EcdsaPublicKey;
6
+ }) => {
7
+ accountAddress: `0x${string}`;
8
+ publicKeyHex: any;
9
+ };
10
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../packages/src/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,cAAc,EAEf,MAAM,2BAA2B,CAAC;AAEnC,eAAO,MAAM,gBAAgB,YAAa,MAAM,WAE/C,CAAC;AAEF,eAAO,MAAM,uBAAuB,cAAe,cAAc,kBAMhE,CAAC;AAEF,eAAO,MAAM,oBAAoB,sBAE9B;IACD,YAAY,EAAE,cAAc,CAAC;CAC9B;;;CAQA,CAAC"}