From 392a3f872cdc6d30028a712cc13f3f7569035808 Mon Sep 17 00:00:00 2001 From: Tomek Marciniak Date: Thu, 12 Sep 2024 14:26:19 +0200 Subject: [PATCH] feat(accounts): move to single argument functions --- .../src/pages/accounts/getting-started.mdx | 18 ++++++------- .../src/accounts/generate-mnemonic.spec.ts | 2 +- .../src/accounts/generate-mnemonic.ts | 13 +++++++--- .../src/accounts/hd-key-to-account.spec.ts | 14 +++++----- .../src/accounts/hd-key-to-account.ts | 26 +++++++++---------- .../src/accounts/mnemonic-to-account.spec.ts | 2 +- .../src/accounts/mnemonic-to-account.ts | 17 +++++++----- 7 files changed, 51 insertions(+), 41 deletions(-) diff --git a/apps/docs/src/pages/accounts/getting-started.mdx b/apps/docs/src/pages/accounts/getting-started.mdx index a6d95b6..3acac4f 100644 --- a/apps/docs/src/pages/accounts/getting-started.mdx +++ b/apps/docs/src/pages/accounts/getting-started.mdx @@ -19,7 +19,7 @@ $ npm install @mina-js/accounts ```ts twoslash import { generateMnemonic, english } from '@mina-js/accounts' -const mnemonic = generateMnemonic(english); +const mnemonic = generateMnemonic({ wordlist: english }); ``` ### generatePrivateKey @@ -35,7 +35,7 @@ const privateKey = generatePrivateKey(); ```ts twoslash import { mnemonicToAccount } from '@mina-js/accounts' -const account = mnemonicToAccount('your mnemonic here'); +const account = mnemonicToAccount({ mnemonic: 'your mnemonic here' }); ``` ### privateKeyToAccount @@ -59,9 +59,9 @@ import { hdKeyToAccount, hex, HDKey } from '@mina-js/accounts' const hdKey = HDKey.fromMasterSeed(hex.decode("59eabf9e9...")); -const addressIndexAccount = hdKeyToAccount(hdKey, { addressIndex: 5 }); -const accountIndexAccount = hdKeyToAccount(hdKey, { accountIndex: 5 }); -const customPathAccount = hdKeyToAccount(hdKey, { path: "m/44'/12586'/0'/0/5" }); +const addressIndexAccount = hdKeyToAccount({ hdKey, addressIndex: 5 }); +const accountIndexAccount = hdKeyToAccount({ hdKey, accountIndex: 5 }); +const customPathAccount = hdKeyToAccount({ hdKey, path: "m/44'/12586'/0'/0/5" }); ``` ### hex @@ -79,7 +79,7 @@ Exported from `@scure/bip32`. ```ts twoslash import { mnemonicToAccount } from '@mina-js/accounts' -const account = mnemonicToAccount('your mnemonic here'); +const account = mnemonicToAccount({ mnemonic: 'your mnemonic here' }); const signedMessage = await account.signMessage({ message: 'your message here' }); ``` @@ -89,7 +89,7 @@ const signedMessage = await account.signMessage({ message: 'your message here' } ```ts twoslash import { mnemonicToAccount } from '@mina-js/accounts' -const account = mnemonicToAccount('your mnemonic here'); +const account = mnemonicToAccount({ mnemonic: 'your mnemonic here' }); const signedTransaction = await account.signTransaction({ transaction: { @@ -107,7 +107,7 @@ const signedTransaction = await account.signTransaction({ ```ts twoslash import { mnemonicToAccount } from '@mina-js/accounts' -const account = mnemonicToAccount('your mnemonic here'); +const account = mnemonicToAccount({ mnemonic: 'your mnemonic here' }); const signedFields = await account.signFields({ fields: [1n, 2n, 3n] }); ``` @@ -117,7 +117,7 @@ const signedFields = await account.signFields({ fields: [1n, 2n, 3n] }); ```ts twoslash import { mnemonicToAccount } from '@mina-js/accounts' -const account = mnemonicToAccount('your mnemonic here'); +const account = mnemonicToAccount({ mnemonic: 'your mnemonic here' }); const nullifier = await account.createNullifier({ message: [1n, 2n, 3n] }); ``` diff --git a/packages/accounts/src/accounts/generate-mnemonic.spec.ts b/packages/accounts/src/accounts/generate-mnemonic.spec.ts index 8617f6d..eef3c70 100644 --- a/packages/accounts/src/accounts/generate-mnemonic.spec.ts +++ b/packages/accounts/src/accounts/generate-mnemonic.spec.ts @@ -3,6 +3,6 @@ import { english } from "../"; import { generateMnemonic } from "./generate-mnemonic"; it("generates 12 word mnemonic", () => { - const mnemonic = generateMnemonic(english); + const mnemonic = generateMnemonic({ wordlist: english }); expect(mnemonic.split(" ").length).toBe(12); }); diff --git a/packages/accounts/src/accounts/generate-mnemonic.ts b/packages/accounts/src/accounts/generate-mnemonic.ts index 9ed1305..163a375 100644 --- a/packages/accounts/src/accounts/generate-mnemonic.ts +++ b/packages/accounts/src/accounts/generate-mnemonic.ts @@ -1,5 +1,10 @@ import { generateMnemonic as generateMnemonic_ } from "@scure/bip39"; +type GenerateMnemonicOptions = { + wordlist: string[]; + strength?: number | undefined; +}; + /** * @description Generates a random mnemonic phrase with a given wordlist. * @@ -8,9 +13,9 @@ import { generateMnemonic as generateMnemonic_ } from "@scure/bip39"; * * @returns A randomly generated mnemonic phrase. */ -export function generateMnemonic( - wordlist: string[], - strength?: number | undefined, -): string { +export function generateMnemonic({ + wordlist, + strength, +}: GenerateMnemonicOptions): string { return generateMnemonic_(wordlist, strength); } diff --git a/packages/accounts/src/accounts/hd-key-to-account.spec.ts b/packages/accounts/src/accounts/hd-key-to-account.spec.ts index a55747a..7656d01 100644 --- a/packages/accounts/src/accounts/hd-key-to-account.spec.ts +++ b/packages/accounts/src/accounts/hd-key-to-account.spec.ts @@ -10,14 +10,15 @@ const hdKey = HDKey.fromMasterSeed( ); it("matches the snapshot", () => { - const hdAccount = hdKeyToAccount(hdKey); + const hdAccount = hdKeyToAccount({ hdKey }); expect(hdAccount).toMatchSnapshot(); }); describe("args: addressIndex", () => { Array.from({ length: 10 }).forEach((_, index) => { it(`derives addressIndex: ${index}`, () => { - const account = hdKeyToAccount(hdKey, { + const account = hdKeyToAccount({ + hdKey, addressIndex: index, }); expect(account.publicKey.length).toEqual(55); @@ -29,7 +30,8 @@ describe("args: addressIndex", () => { describe("args: path", () => { Array.from({ length: 10 }).forEach((_, index) => { it(`derives path: m/44'/12586'/0'/0/${index}`, () => { - const account = hdKeyToAccount(hdKey, { + const account = hdKeyToAccount({ + hdKey, path: `m/44'/12586'/0'/0/${index}`, }); expect(account.publicKey.length).toEqual(55); @@ -39,17 +41,17 @@ describe("args: path", () => { }); it("derives with accountIndex", () => { - const hdAccount = hdKeyToAccount(hdKey, { accountIndex: 1 }).publicKey; + const hdAccount = hdKeyToAccount({ hdKey, accountIndex: 1 }).publicKey; expect(hdAccount).toMatchSnapshot(); }); it("derives with changeIndex", () => { - const hdAccount = hdKeyToAccount(hdKey, { changeIndex: 1 }).publicKey; + const hdAccount = hdKeyToAccount({ hdKey, changeIndex: 1 }).publicKey; expect(hdAccount).toMatchSnapshot(); }); it("signs a message", async () => { - const account = hdKeyToAccount(hdKey); + const account = hdKeyToAccount({ hdKey }); const signature = await account.signMessage({ message: "hello word" }); expect(signature).toMatchSnapshot(); }); diff --git a/packages/accounts/src/accounts/hd-key-to-account.ts b/packages/accounts/src/accounts/hd-key-to-account.ts index 4ff67c5..589c210 100644 --- a/packages/accounts/src/accounts/hd-key-to-account.ts +++ b/packages/accounts/src/accounts/hd-key-to-account.ts @@ -1,6 +1,7 @@ import { sha256 } from "@noble/hashes/sha256"; import { bytesToHex } from "@noble/hashes/utils"; import { base58check } from "@scure/base"; +import type { Simplify } from "type-fest"; import { type HDAccount, type HDKey, @@ -12,25 +13,24 @@ import { privateKeyToAccount, } from "./private-key-to-account"; -export type HDKeyToAccountOptions = HDOptions & - Partial; +export type HDKeyToAccountOptions = Simplify< + { hdKey: HDKey } & HDOptions & Partial +>; /** * @description Creates an Account from a HD Key. * * @returns A HD Account. */ -export function hdKeyToAccount( - hdKey_: HDKey, - { - accountIndex = 0, - addressIndex = 0, - changeIndex = 0, - path, - ...options - }: HDKeyToAccountOptions = {}, -): HDAccount { - const childNode = hdKey_.derive( +export function hdKeyToAccount({ + hdKey, + accountIndex = 0, + addressIndex = 0, + changeIndex = 0, + path, + ...options +}: HDKeyToAccountOptions): HDAccount { + const childNode = hdKey.derive( path || `m/${MinaKeyConst.PURPOSE}'/${MinaKeyConst.MINA_COIN_TYPE}'/${accountIndex}'/${changeIndex}/${addressIndex}`, ); diff --git a/packages/accounts/src/accounts/mnemonic-to-account.spec.ts b/packages/accounts/src/accounts/mnemonic-to-account.spec.ts index 63f66c0..bdc21f5 100644 --- a/packages/accounts/src/accounts/mnemonic-to-account.spec.ts +++ b/packages/accounts/src/accounts/mnemonic-to-account.spec.ts @@ -3,6 +3,6 @@ import { mnemonic } from "../test/constants"; import { mnemonicToAccount } from "./mnemonic-to-account"; it("matches the snapshot", () => { - const mnemonicAccount = mnemonicToAccount(mnemonic); + const mnemonicAccount = mnemonicToAccount({ mnemonic }); expect(mnemonicAccount).toMatchSnapshot(); }); diff --git a/packages/accounts/src/accounts/mnemonic-to-account.ts b/packages/accounts/src/accounts/mnemonic-to-account.ts index 9535710..fa6f14b 100644 --- a/packages/accounts/src/accounts/mnemonic-to-account.ts +++ b/packages/accounts/src/accounts/mnemonic-to-account.ts @@ -1,23 +1,26 @@ import { HDKey } from "@scure/bip32"; import { mnemonicToSeedSync } from "@scure/bip39"; -import type { HDAccount, HDOptions } from "../types"; +import type { Simplify } from "type-fest"; +import type { HDAccount } from "../types"; import { type HDKeyToAccountOptions, hdKeyToAccount, } from "./hd-key-to-account.js"; -export type MnemonicToAccountOptions = HDKeyToAccountOptions; +export type MnemonicToAccountOptions = Simplify< + { mnemonic: string } & Partial +>; /** * @description Creates an Account from a mnemonic phrase. * * @returns A HD Account. */ -export function mnemonicToAccount( - mnemonic: string, - opts: HDOptions = {}, -): HDAccount { +export function mnemonicToAccount({ + mnemonic, + ...opts +}: MnemonicToAccountOptions): HDAccount { const seed = mnemonicToSeedSync(mnemonic); - return hdKeyToAccount(HDKey.fromMasterSeed(seed), opts); + return hdKeyToAccount({ ...opts, hdKey: HDKey.fromMasterSeed(seed) }); }