From 51702dbd8dd3dcb0d6e7960b6b320c8c17afff1b Mon Sep 17 00:00:00 2001 From: Fricoben <78437165+fricoben@users.noreply.github.com> Date: Wed, 29 Jan 2025 11:01:50 +0000 Subject: [PATCH] fix: add starkid improvements (#1301) * fix: add starkid improvements * fix: test --- __tests__/account.starknetId.test.ts | 6 ++++++ src/provider/extensions/starknetId.ts | 9 ++++++++- src/utils/starknetId.ts | 18 ++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/__tests__/account.starknetId.test.ts b/__tests__/account.starknetId.test.ts index 17edd5da6..509f55229 100644 --- a/__tests__/account.starknetId.test.ts +++ b/__tests__/account.starknetId.test.ts @@ -85,6 +85,12 @@ describe('deploy and test Wallet', () => { expect(hexToDecimalString(address)).toEqual(hexToDecimalString(account.address)); }); + test('Should throw error when invalid stark domain is provided', async () => { + await expect(account.getAddressFromStarkName('invalid_domain', namingAddress)).rejects.toThrow( + 'Invalid domain, must be a valid .stark domain' + ); + }); + test('Get the account from a stark name of the account (using starknet.id)', async () => { const name = await account.getStarkName(undefined, namingAddress); expect(name).toEqual('fricoben.stark'); diff --git a/src/provider/extensions/starknetId.ts b/src/provider/extensions/starknetId.ts index af7847f6e..3fad1cea8 100644 --- a/src/provider/extensions/starknetId.ts +++ b/src/provider/extensions/starknetId.ts @@ -12,6 +12,7 @@ import { getStarknetIdPfpContract, getStarknetIdPopContract, getStarknetIdVerifierContract, + isStarkDomain, useDecoded, useEncoded, } from '../../utils/starknetId'; @@ -97,11 +98,17 @@ export class StarknetId { name: string, StarknetIdContract?: string ): Promise { + const starkName = name.endsWith('.stark') ? name : `${name}.stark`; + + if (!isStarkDomain(starkName)) { + throw new Error('Invalid domain, must be a valid .stark domain'); + } + const chainId = await provider.getChainId(); const contract = StarknetIdContract ?? getStarknetIdContract(chainId); try { - const encodedDomain = name + const encodedDomain = starkName .replace('.stark', '') .split('.') .map((part) => useEncoded(part).toString(10)); diff --git a/src/utils/starknetId.ts b/src/utils/starknetId.ts index 5df3ad48e..47a3375c1 100644 --- a/src/utils/starknetId.ts +++ b/src/utils/starknetId.ts @@ -393,3 +393,21 @@ export function dynamicCallData( ArrayReference: arrayReference ? tuple(arrayReference[0], arrayReference[1]) : undefined, }); } + +/** + * Check if a given string is a valid Starknet.id domain. + * + * @param {string} domain - The domain string to validate. + * @returns {boolean} - True if the domain is a valid Starknet.id domain, false otherwise. + * @example + * ```typescript + * const result = starknetId.isStarkDomain("example.stark"); + * // result = true + * + * const result2 = starknetId.isStarkDomain("invalid-domain"); + * // result2 = false + * ``` + */ +export function isStarkDomain(domain: string): boolean { + return /^(?:[a-z0-9-]{1,48}(?:[a-z0-9-]{1,48}[a-z0-9-])?\.)*[a-z0-9-]{1,48}\.stark$/.test(domain); +}