11import type { CoreApi } from '@/core/core-api/core-api.interface' ;
2+ import type { KeyResolverService } from '@/core/services/key-resolver/key-resolver-service.interface' ;
23import type { HederaMirrornodeService } from '@/core/services/mirrornode/hedera-mirrornode-service.interface' ;
34import type { TransactionResult } from '@/core/services/tx-execution/tx-execution-service.interface' ;
45
56import '@/core/utils/json-serialize' ;
67
78import {
8- ECDSA_EVM_ADDRESS ,
9+ ACCOUNT_ID_EVM_ADDRESS_8888 ,
10+ ACCOUNT_ID_EVM_ADDRESS_9999 ,
11+ ECDSA_HEX_PRIVATE_KEY ,
912 ECDSA_HEX_PUBLIC_KEY ,
1013 ED25519_HEX_PUBLIC_KEY ,
1114} from '@/__tests__/mocks/fixtures' ;
@@ -77,7 +80,6 @@ describe('account plugin - create command (ADR-003)', () => {
7780 balanceRaw : 500000000000n ,
7881 maxAutoAssociations : 3 ,
7982 publicKey : 'pub-key-test' ,
80- keyType : KeyAlgorithm . ECDSA ,
8183 } ) ;
8284 expect ( signing . signAndExecute ) . toHaveBeenCalled ( ) ;
8385 expect ( alias . register ) . toHaveBeenCalledWith (
@@ -98,7 +100,7 @@ describe('account plugin - create command (ADR-003)', () => {
98100 type : KeyAlgorithm . ECDSA ,
99101 network : 'testnet' ,
100102 keyRefId : 'kr_test123' ,
101- evmAddress : ECDSA_EVM_ADDRESS ,
103+ evmAddress : ACCOUNT_ID_EVM_ADDRESS_9999 ,
102104 } ) ,
103105 ) ;
104106
@@ -109,7 +111,7 @@ describe('account plugin - create command (ADR-003)', () => {
109111 expect ( output . type ) . toBe ( KeyAlgorithm . ECDSA ) ;
110112 expect ( output . network ) . toBe ( 'testnet' ) ;
111113 expect ( output . transactionId ) . toBe ( '0.0.1234@1234567890.000000000' ) ;
112- expect ( output . evmAddress ) . toBe ( ECDSA_EVM_ADDRESS ) ;
114+ expect ( output . evmAddress ) . toBe ( ACCOUNT_ID_EVM_ADDRESS_9999 ) ;
113115 expect ( output . publicKey ) . toBe ( ECDSA_HEX_PUBLIC_KEY ) ;
114116 } ) ;
115117
@@ -218,16 +220,171 @@ describe('account plugin - create command (ADR-003)', () => {
218220 ) ;
219221 expect ( account . createAccount ) . toHaveBeenCalledWith (
220222 expect . objectContaining ( {
221- keyType : KeyAlgorithm . ECDSA ,
223+ publicKey : 'pub-key-test' ,
222224 } ) ,
223225 ) ;
224226
225227 const output = assertOutput ( result . result , CreateAccountOutputSchema ) ;
226228 expect ( output . type ) . toBe ( KeyAlgorithm . ECDSA ) ;
227- expect ( output . evmAddress ) . toBe ( ECDSA_EVM_ADDRESS ) ;
229+ expect ( output . evmAddress ) . toBe ( ACCOUNT_ID_EVM_ADDRESS_8888 ) ;
228230 expect ( output . publicKey ) . toBe ( ECDSA_HEX_PUBLIC_KEY ) ;
229231 } ) ;
230232
233+ test ( 'creates account with provided private key (--key ecdsa:private:xxx)' , async ( ) => {
234+ const logger = makeLogger ( ) ;
235+ const saveAccountMock = jest . fn ( ) ;
236+ MockedHelper . mockImplementation ( ( ) => ( { saveAccount : saveAccountMock } ) ) ;
237+
238+ const { account, signing, networkMock, kms, alias, mirror, keyResolver } =
239+ makeApiMocksForAccountCreate ( {
240+ createAccountImpl : jest . fn ( ) . mockReturnValue ( {
241+ transaction : { } ,
242+ publicKey : ECDSA_HEX_PUBLIC_KEY ,
243+ } ) ,
244+ signAndExecuteImpl : jest . fn ( ) . mockResolvedValue ( {
245+ transactionId : '0.0.1234@1234567890.000000004' ,
246+ success : true ,
247+ accountId : '0.0.6666' ,
248+ receipt : { status : { status : 'success' } } ,
249+ } ) ,
250+ keyResolverGetPublicKeyImpl : jest . fn ( ) . mockResolvedValue ( {
251+ keyRefId : 'kr_provided123' ,
252+ publicKey : ECDSA_HEX_PUBLIC_KEY ,
253+ } ) ,
254+ } ) ;
255+
256+ kms . get = jest . fn ( ) . mockReturnValue ( {
257+ keyRefId : 'kr_provided123' ,
258+ publicKey : ECDSA_HEX_PUBLIC_KEY ,
259+ keyAlgorithm : KeyAlgorithm . ECDSA ,
260+ keyManager : 'local' ,
261+ labels : [ ] ,
262+ createdAt : '' ,
263+ updatedAt : '' ,
264+ } ) ;
265+
266+ const api : Partial < CoreApi > = {
267+ account,
268+ txExecution : signing ,
269+ network : networkMock ,
270+ kms,
271+ alias,
272+ mirror : mirror as HederaMirrornodeService ,
273+ keyResolver : keyResolver as KeyResolverService ,
274+ logger,
275+ } ;
276+
277+ const args = makeArgs ( api , logger , {
278+ balance : '1000' ,
279+ key : `ecdsa:private:${ ECDSA_HEX_PRIVATE_KEY } ` ,
280+ } ) ;
281+
282+ const result = await createAccount ( args ) ;
283+
284+ expect ( kms . createLocalPrivateKey ) . not . toHaveBeenCalled ( ) ;
285+ expect ( keyResolver . getPublicKey ) . toHaveBeenCalled ( ) ;
286+ expect ( account . createAccount ) . toHaveBeenCalledWith (
287+ expect . objectContaining ( {
288+ publicKey : ECDSA_HEX_PUBLIC_KEY ,
289+ } ) ,
290+ ) ;
291+
292+ const output = assertOutput ( result . result , CreateAccountOutputSchema ) ;
293+ expect ( output . accountId ) . toBe ( '0.0.6666' ) ;
294+ expect ( output . type ) . toBe ( KeyAlgorithm . ECDSA ) ;
295+ expect ( output . publicKey ) . toBe ( ECDSA_HEX_PUBLIC_KEY ) ;
296+ } ) ;
297+
298+ test ( 'creates account with key reference (--key kr_xxx)' , async ( ) => {
299+ const logger = makeLogger ( ) ;
300+ const saveAccountMock = jest . fn ( ) ;
301+ MockedHelper . mockImplementation ( ( ) => ( { saveAccount : saveAccountMock } ) ) ;
302+
303+ const { account, signing, networkMock, kms, alias, mirror, keyResolver } =
304+ makeApiMocksForAccountCreate ( {
305+ createAccountImpl : jest . fn ( ) . mockReturnValue ( {
306+ transaction : { } ,
307+ publicKey : ECDSA_HEX_PUBLIC_KEY ,
308+ } ) ,
309+ signAndExecuteImpl : jest . fn ( ) . mockResolvedValue ( {
310+ transactionId : '0.0.1234@1234567890.000000005' ,
311+ success : true ,
312+ accountId : '0.0.5555' ,
313+ receipt : { status : { status : 'success' } } ,
314+ } ) ,
315+ keyResolverGetPublicKeyImpl : jest . fn ( ) . mockResolvedValue ( {
316+ keyRefId : 'kr_test123' ,
317+ publicKey : ECDSA_HEX_PUBLIC_KEY ,
318+ } ) ,
319+ } ) ;
320+
321+ kms . get = jest . fn ( ) . mockReturnValue ( {
322+ keyRefId : 'kr_test123' ,
323+ publicKey : ECDSA_HEX_PUBLIC_KEY ,
324+ keyAlgorithm : KeyAlgorithm . ECDSA ,
325+ keyManager : 'local' ,
326+ labels : [ ] ,
327+ createdAt : '' ,
328+ updatedAt : '' ,
329+ } ) ;
330+
331+ const api : Partial < CoreApi > = {
332+ account,
333+ txExecution : signing ,
334+ network : networkMock ,
335+ kms,
336+ alias,
337+ mirror : mirror as HederaMirrornodeService ,
338+ keyResolver : keyResolver as KeyResolverService ,
339+ logger,
340+ } ;
341+
342+ const args = makeArgs ( api , logger , {
343+ balance : '1000' ,
344+ key : 'kr_test123' ,
345+ } ) ;
346+
347+ const result = await createAccount ( args ) ;
348+
349+ expect ( kms . createLocalPrivateKey ) . not . toHaveBeenCalled ( ) ;
350+ expect ( keyResolver . getPublicKey ) . toHaveBeenCalled ( ) ;
351+ expect ( account . createAccount ) . toHaveBeenCalledWith (
352+ expect . objectContaining ( {
353+ publicKey : ECDSA_HEX_PUBLIC_KEY ,
354+ } ) ,
355+ ) ;
356+
357+ const output = assertOutput ( result . result , CreateAccountOutputSchema ) ;
358+ expect ( output . accountId ) . toBe ( '0.0.5555' ) ;
359+ } ) ;
360+
361+ test ( 'throws ValidationError when both --key and --key-type are provided' , async ( ) => {
362+ const logger = makeLogger ( ) ;
363+ MockedHelper . mockImplementation ( ( ) => ( { saveAccount : jest . fn ( ) } ) ) ;
364+
365+ const { account, signing, networkMock, kms, alias, mirror, keyResolver } =
366+ makeApiMocksForAccountCreate ( { } ) ;
367+
368+ const api : Partial < CoreApi > = {
369+ account,
370+ txExecution : signing ,
371+ network : networkMock ,
372+ kms,
373+ alias,
374+ mirror : mirror as HederaMirrornodeService ,
375+ keyResolver : keyResolver as KeyResolverService ,
376+ logger,
377+ } ;
378+
379+ const args = makeArgs ( api , logger , {
380+ balance : '1000' ,
381+ key : `ecdsa:private:${ ECDSA_HEX_PRIVATE_KEY } ` ,
382+ keyType : KeyAlgorithm . ECDSA ,
383+ } ) ;
384+
385+ await expect ( createAccount ( args ) ) . rejects . toThrow ( ) ;
386+ } ) ;
387+
231388 test ( 'creates account with ED25519 key type' , async ( ) => {
232389 const logger = makeLogger ( ) ;
233390 const saveAccountMock = jest . fn ( ) ;
@@ -272,7 +429,7 @@ describe('account plugin - create command (ADR-003)', () => {
272429 ) ;
273430 expect ( account . createAccount ) . toHaveBeenCalledWith (
274431 expect . objectContaining ( {
275- keyType : KeyAlgorithm . ED25519 ,
432+ publicKey : 'pub-key-test' ,
276433 } ) ,
277434 ) ;
278435
0 commit comments