diff --git a/__tests__/utils/ec.test.ts b/__tests__/utils/ec.test.ts deleted file mode 100644 index 7fb0389ec..000000000 --- a/__tests__/utils/ec.test.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ec } from '../../src'; - -describe.only('ec full public key', () => { - test('determine if value is a BigNumberish', () => { - const privateKey1 = '0x43b7240d227aa2fb8434350b3321c40ac1b88c7067982549e7609870621b535'; - expect(ec.getFullPublicKey(privateKey1)).toBe( - '0x0400b730bd22358612b5a67f8ad52ce80f9e8e893639ade263537e6ef35852e5d3057795f6b090f7c6985ee143f798608a53b3659222c06693c630857a10a92acf' - ); - }); -}); diff --git a/__tests__/utils/num.test.ts b/__tests__/utils/num.test.ts index 64ec9f28f..81f0e7bb1 100644 --- a/__tests__/utils/num.test.ts +++ b/__tests__/utils/num.test.ts @@ -217,7 +217,7 @@ describe('stringToSha256ToArrayBuff4', () => { }); }); -describe.only('isBigNumberish', () => { +describe('isBigNumberish', () => { test('determine if value is a BigNumberish', () => { expect(num.isBigNumberish(234)).toBe(true); expect(num.isBigNumberish(234n)).toBe(true); diff --git a/__tests__/utils/stark.test.ts b/__tests__/utils/stark.test.ts index 0252e45f1..04a82d456 100644 --- a/__tests__/utils/stark.test.ts +++ b/__tests__/utils/stark.test.ts @@ -116,3 +116,12 @@ describe('stark', () => { expect(stark.v3Details(detailsUndefined)).toEqual(expect.objectContaining(detailsAnything)); }); }); + +describe('ec full public key', () => { + test('determine if value is a BigNumberish', () => { + const privateKey1 = '0x43b7240d227aa2fb8434350b3321c40ac1b88c7067982549e7609870621b535'; + expect(stark.getFullPublicKey(privateKey1)).toBe( + '0x0400b730bd22358612b5a67f8ad52ce80f9e8e893639ade263537e6ef35852e5d3057795f6b090f7c6985ee143f798608a53b3659222c06693c630857a10a92acf' + ); + }); +}); diff --git a/__tests__/utils/typedData.test.ts b/__tests__/utils/typedData.test.ts index 88a09c10d..cb364efb6 100644 --- a/__tests__/utils/typedData.test.ts +++ b/__tests__/utils/typedData.test.ts @@ -11,7 +11,6 @@ import { Account, BigNumberish, StarknetDomain, - ec, num, stark, typedData, @@ -361,7 +360,7 @@ describe('typedData', () => { describe('verifyMessage', () => { const addr = '0x64b48806902a367c8598f4f95c305e8c1a1acba5f082d294a43793113115691'; const privK = '0x71d7bb07b9a64f6f78ac4c816aff4da9'; - const fullPubK = ec.getFullPublicKey(privK); + const fullPubK = stark.getFullPublicKey(privK); const myAccount = new Account({ nodeUrl: 'fake' }, addr, privK); let signedMessage: Signature; let hashedMessage: string; diff --git a/src/utils/ec.ts b/src/utils/ec.ts index 1cf6cadce..f6dadcae5 100644 --- a/src/utils/ec.ts +++ b/src/utils/ec.ts @@ -1,23 +1,3 @@ -import { getPublicKey } from '@scure/starknet'; -import type { BigNumberish } from '../types'; -import { addHexPrefix, buf2hex } from './encode'; - // TODO rename export * as starkCurve from '@scure/starknet'; export * as weierstrass from '@noble/curves/abstract/weierstrass'; - -/** - * get the hex string of the full public key related to a Starknet private key. - * @param {BigNumberish} privateKey a 252 bits private key. - * @returns {string} an hex string of a 520 bit number, representing the full public key related to `privateKey`. - * @example - * ```typescript - * const result = ec.getFullPublicKey("0x43b7240d227aa2fb8434350b3321c40ac1b88c7067982549e7609870621b535"); - * // result = "0x0400b730bd22358612b5a67f8ad52ce80f9e8e893639ade263537e6ef35852e5d3057795f6b090f7c6985ee143f798608a53b3659222c06693c630857a10a92acf" - * ``` - */ -export function getFullPublicKey(privateKey: BigNumberish): string { - const privKey = addHexPrefix(BigInt(privateKey).toString(16)); - const fullPrivKey = addHexPrefix(buf2hex(getPublicKey(privKey, false))); - return fullPrivKey; -} diff --git a/src/utils/num.ts b/src/utils/num.ts index 134090ce3..d9a097f11 100644 --- a/src/utils/num.ts +++ b/src/utils/num.ts @@ -413,6 +413,6 @@ export function isBigNumberish(input: unknown): input is BigNumberish { return ( isNumber(input) || isBigInt(input) || - (typeof input === 'string' && (isHex(input) || /^[0-9]*$/i.test(input))) + (typeof input === 'string' && (isHex(input) || isStringWholeNumber(input))) ); } diff --git a/src/utils/stark.ts b/src/utils/stark.ts index 5bf89bbb2..4add7ae6a 100644 --- a/src/utils/stark.ts +++ b/src/utils/stark.ts @@ -1,6 +1,6 @@ // eslint-disable-next-line @typescript-eslint/no-unused-vars import type { SPEC } from 'starknet-types-07'; -import { getStarkKey, utils } from '@scure/starknet'; +import { getPublicKey, getStarkKey, utils } from '@scure/starknet'; import { gzip, ungzip } from 'pako'; import { ZERO, FeeMarginPercentage } from '../constants'; @@ -14,7 +14,7 @@ import { } from '../types'; import { EDAMode, EDataAvailabilityMode, ETransactionVersion, ResourceBounds } from '../types/api'; import { FeeEstimate } from '../types/provider'; -import { addHexPrefix, arrayBufferToString, atobUniversal, btoaUniversal } from './encode'; +import { addHexPrefix, arrayBufferToString, atobUniversal, btoaUniversal, buf2hex } from './encode'; import { parse, stringify } from './json'; import { addPercent, @@ -351,3 +351,19 @@ export function reduceV2(providedVersion: ETransactionVersion): ETransactionVers if (providedVersion === ETransactionVersion.V2) return ETransactionVersion.V1; return providedVersion; } + +/** + * get the hex string of the full public key related to a Starknet private key. + * @param {BigNumberish} privateKey a 252 bits private key. + * @returns {string} an hex string of a 520 bit number, representing the full public key related to `privateKey`. + * @example + * ```typescript + * const result = ec.getFullPublicKey("0x43b7240d227aa2fb8434350b3321c40ac1b88c7067982549e7609870621b535"); + * // result = "0x0400b730bd22358612b5a67f8ad52ce80f9e8e893639ade263537e6ef35852e5d3057795f6b090f7c6985ee143f798608a53b3659222c06693c630857a10a92acf" + * ``` + */ +export function getFullPublicKey(privateKey: BigNumberish): string { + const privKey = toHex(privateKey); + const fullPrivKey = addHexPrefix(buf2hex(getPublicKey(privKey, false))); + return fullPrivKey; +} diff --git a/src/utils/typedData.ts b/src/utils/typedData.ts index d654ccc37..3caa93704 100644 --- a/src/utils/typedData.ts +++ b/src/utils/typedData.ts @@ -618,6 +618,23 @@ export function getMessageHash(typedData: TypedData, account: BigNumberish): str * // result1 = result2 = true * ``` */ +export function verifyMessage( + message: TypedData, + signature: Signature, + fullPublicKey: BigNumberish, + accountAddress: BigNumberish +): boolean; +export function verifyMessage( + message: BigNumberish, + signature: Signature, + fullPublicKey: BigNumberish +): boolean; +export function verifyMessage( + message: BigNumberish | TypedData, + signature: Signature, + fullPublicKey: BigNumberish, + accountAddress?: BigNumberish +): boolean; export function verifyMessage( message: BigNumberish | TypedData, signature: Signature, diff --git a/www/docs/guides/signature.md b/www/docs/guides/signature.md index 5cce38965..0c2044933 100644 --- a/www/docs/guides/signature.md +++ b/www/docs/guides/signature.md @@ -17,7 +17,7 @@ import { ec, hash, type BigNumberish, type WeierstrassSignatureType } from 'star const privateKey = '0x1234567890987654321'; const starknetPublicKey = ec.starkCurve.getStarkKey(privateKey); -const fullPublicKey = ec.getFullPublicKey(privateKey); +const fullPublicKey = stark.getFullPublicKey(privateKey); const message: BigNumberish[] = [1, 128, 18, 14]; const msgHash = hash.computeHashOnElements(message); @@ -143,7 +143,7 @@ const myTypedData: TypedData = { }; const account0 = new Account(myProvider, address, privateKey); -const fullPublicKey = ec.getFullPublicKey(privateKey); +const fullPublicKey = stark.getFullPublicKey(privateKey); const msgHash = await account0.hashMessage(myTypedData); const signature: Signature = (await account0.signMessage(myTypedData)) as WeierstrassSignatureType;