From 711267135ef050e4293e2242215d22b02c0b46cf Mon Sep 17 00:00:00 2001 From: PhilippeR26 Date: Wed, 13 Mar 2024 16:30:51 +0100 Subject: [PATCH 1/2] fix: byteArray encoding for less than 31 chars --- __tests__/cairo1v2.test.ts | 2 +- __tests__/cairo1v2_typed.test.ts | 2 +- __tests__/utils/shortString.test.ts | 8 ++++---- src/utils/calldata/byteArray.ts | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/__tests__/cairo1v2.test.ts b/__tests__/cairo1v2.test.ts index 5e532dbaa..5520fc876 100644 --- a/__tests__/cairo1v2.test.ts +++ b/__tests__/cairo1v2.test.ts @@ -1031,7 +1031,7 @@ describe('Cairo 1', () => { const callD2 = CallData.compile({ mess: message }); expect(callD2).toEqual(expectedResult); const callD3 = CallData.compile({ mess: byteArray.byteArrayFromString('Take care.') }); - expect(callD3).toEqual(['1', '0', '398475857363345939260718', '10']); + expect(callD3).toEqual(['0', '398475857363345939260718', '10']); const str1 = await stringContract.get_string(); expect(str1).toBe( "Cairo has become the most popular language for developers + charizards !@#$%^&*_+|:'<>?~`" diff --git a/__tests__/cairo1v2_typed.test.ts b/__tests__/cairo1v2_typed.test.ts index 732d77748..ae31a39f3 100644 --- a/__tests__/cairo1v2_typed.test.ts +++ b/__tests__/cairo1v2_typed.test.ts @@ -973,7 +973,7 @@ describe('Cairo 1', () => { const callD2 = CallData.compile({ mess: message }); expect(callD2).toEqual(expectedResult); const callD3 = CallData.compile({ mess: byteArray.byteArrayFromString('Take care.') }); - expect(callD3).toEqual(['1', '0', '398475857363345939260718', '10']); + expect(callD3).toEqual(['0', '398475857363345939260718', '10']); const str1 = await stringContract.get_string(); expect(str1).toBe( "Cairo has become the most popular language for developers + charizards !@#$%^&*_+|:'<>?~`" diff --git a/__tests__/utils/shortString.test.ts b/__tests__/utils/shortString.test.ts index ee2201d00..650d2efc7 100644 --- a/__tests__/utils/shortString.test.ts +++ b/__tests__/utils/shortString.test.ts @@ -65,12 +65,12 @@ describe('shortString', () => { pending_word_len: 0, }); expect(byteArray.byteArrayFromString('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234')).toEqual({ - data: ['0x00'], + data: [], pending_word: '0x4142434445464748494a4b4c4d4e4f505152535455565758595a31323334', pending_word_len: 30, }); expect(byteArray.byteArrayFromString('')).toEqual({ - data: ['0x00'], + data: [], pending_word: '0x00', pending_word_len: 0, }); @@ -90,14 +90,14 @@ describe('shortString', () => { }); expect( byteArray.stringFromByteArray({ - data: ['0x00'], + data: [], pending_word: '0x4142434445464748494a4b4c4d4e4f505152535455565758595a31323334', pending_word_len: 30, }) ).toBe('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234'); expect( byteArray.stringFromByteArray({ - data: ['0x00'], + data: [], pending_word: '0x00', pending_word_len: 0, }) diff --git a/src/utils/calldata/byteArray.ts b/src/utils/calldata/byteArray.ts index bf49e33b0..04e541e31 100644 --- a/src/utils/calldata/byteArray.ts +++ b/src/utils/calldata/byteArray.ts @@ -9,7 +9,7 @@ import { decodeShortString, encodeShortString, splitLongString } from '../shortS * @example * ```typescript * const myByteArray = { - * data: [ '0x00' ], + * data: [], * pending_word: '0x414243444546474849', * pending_word_len: 9 * } @@ -40,7 +40,7 @@ export function stringFromByteArray(myByteArray: ByteArray): string { * ``` * Result is : * { - * data: [ '0x00' ], + * data: [], * pending_word: '0x414243444546474849', * pending_word_len: 9 * } @@ -48,7 +48,7 @@ export function stringFromByteArray(myByteArray: ByteArray): string { export function byteArrayFromString(myString: string): ByteArray { if (myString.length === 0) { return { - data: ['0x00'], + data: [], pending_word: '0x00', pending_word_len: 0, } as ByteArray; @@ -67,7 +67,7 @@ export function byteArrayFromString(myString: string): ByteArray { } const pendingEncodedWord: BigNumberish = myShortStringsEncoded.pop()!; return { - data: myShortStringsEncoded.length === 0 ? ['0x00'] : myShortStringsEncoded, + data: myShortStringsEncoded.length === 0 ? [] : myShortStringsEncoded, pending_word: pendingEncodedWord, pending_word_len: remains.length, } as ByteArray; From 03bb20f6c3ded1f45511fbda0d6f3867ba32b120 Mon Sep 17 00:00:00 2001 From: Petar Penovic Date: Thu, 14 Mar 2024 07:30:44 +0100 Subject: [PATCH 2/2] refactor: reuse byteArray utility for typed data hashing --- src/utils/calldata/byteArray.ts | 41 ++++++++++++--------------------- src/utils/typedData.ts | 21 ++--------------- 2 files changed, 17 insertions(+), 45 deletions(-) diff --git a/src/utils/calldata/byteArray.ts b/src/utils/calldata/byteArray.ts index 04e541e31..288848259 100644 --- a/src/utils/calldata/byteArray.ts +++ b/src/utils/calldata/byteArray.ts @@ -36,7 +36,7 @@ export function stringFromByteArray(myByteArray: ByteArray): string { * @returns Cairo representation of a LongString * @example * ```typescript - * const myByteArray: ByteArray = byteArrayFromStr("ABCDEFGHI"); + * const myByteArray: ByteArray = byteArrayFromString("ABCDEFGHI"); * ``` * Result is : * { @@ -45,30 +45,19 @@ export function stringFromByteArray(myByteArray: ByteArray): string { * pending_word_len: 9 * } */ -export function byteArrayFromString(myString: string): ByteArray { - if (myString.length === 0) { - return { - data: [], - pending_word: '0x00', - pending_word_len: 0, - } as ByteArray; - } - const myShortStrings: string[] = splitLongString(myString); - const remains: string = myShortStrings[myShortStrings.length - 1]; - const myShortStringsEncoded: BigNumberish[] = myShortStrings.map((shortStr) => - encodeShortString(shortStr) - ); - if (remains.length === 31) { - return { - data: myShortStringsEncoded, - pending_word: '0x00', - pending_word_len: 0, - } as ByteArray; - } - const pendingEncodedWord: BigNumberish = myShortStringsEncoded.pop()!; +export function byteArrayFromString(targetString: string): ByteArray { + const shortStrings: string[] = splitLongString(targetString); + const remainder: string = shortStrings[shortStrings.length - 1]; + const shortStringsEncoded: BigNumberish[] = shortStrings.map(encodeShortString); + + const [pendingWord, pendingWordLength] = + remainder === undefined || remainder.length === 31 + ? ['0x00', 0] + : [shortStringsEncoded.pop()!, remainder.length]; + return { - data: myShortStringsEncoded.length === 0 ? [] : myShortStringsEncoded, - pending_word: pendingEncodedWord, - pending_word_len: remains.length, - } as ByteArray; + data: shortStringsEncoded.length === 0 ? [] : shortStringsEncoded, + pending_word: pendingWord, + pending_word_len: pendingWordLength, + }; } diff --git a/src/utils/typedData.ts b/src/utils/typedData.ts index d1193b29c..16413f0c2 100644 --- a/src/utils/typedData.ts +++ b/src/utils/typedData.ts @@ -7,6 +7,7 @@ import { StarkNetType, TypedData, } from '../types'; +import { byteArrayFromString } from './calldata/byteArray'; import { computePedersenHash, computePedersenHashOnElements, @@ -16,7 +17,7 @@ import { } from './hash'; import { MerkleTree } from './merkle'; import { isHex, toHex } from './num'; -import { encodeShortString, splitLongString } from './shortString'; +import { encodeShortString } from './shortString'; /** @deprecated prefer importing from 'types' over 'typedData' */ export * from '../types/typedData'; @@ -61,24 +62,6 @@ const revisionConfiguration: Record = { }, }; -// TODO: replace with utils byteArrayFromString from PR#891 once it is available -export function byteArrayFromString(targetString: string) { - const shortStrings: string[] = splitLongString(targetString); - const remainder: string = shortStrings[shortStrings.length - 1]; - const shortStringsEncoded: BigNumberish[] = shortStrings.map(encodeShortString); - - const [pendingWord, pendingWordLength] = - remainder === undefined || remainder.length === 31 - ? ['0x00', 0] - : [shortStringsEncoded.pop()!, remainder.length]; - - return { - data: shortStringsEncoded.length === 0 ? ['0x00'] : shortStringsEncoded, - pending_word: pendingWord, - pending_word_len: pendingWordLength, - }; -} - function identifyRevision({ types, domain }: TypedData) { if (revisionConfiguration[Revision.Active].domain in types && domain.revision === Revision.Active) return Revision.Active;