From a36f69478d7131ad33c2aedce876c92c6cb12a67 Mon Sep 17 00:00:00 2001 From: CJ42 Date: Thu, 16 May 2024 20:54:56 +0100 Subject: [PATCH] test: add tests for encoding array index --- src/index.test.ts | 11 +++++++++++ src/lib/encodeKeyName.ts | 16 +++++++++++++--- src/lib/schemaParser.test.ts | 2 +- src/lib/utils.test.ts | 32 ++++++++++++++++---------------- src/types/dynamicKeys.ts | 2 +- 5 files changed, 42 insertions(+), 21 deletions(-) diff --git a/src/index.test.ts b/src/index.test.ts index 25e2c9ca..35e30eab 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -1880,6 +1880,17 @@ describe('encodeKeyName', () => { '0x31145577efe228036af40000a4fbbfe353124e6fa6bb7f8e088a9269df552ea2', ); }); + + it('works for Array keys with index as `dynamicKeyParts', () => { + assert.deepStrictEqual( + encodeKeyName('MusicPlaylist[]', 2), + '0x03573598507fc76d82171baa336b7fd700000000000000000000000000000002', + ); + assert.deepStrictEqual( + erc725Instance.encodeKeyName('MusicPlaylist[]', 2), + '0x03573598507fc76d82171baa336b7fd700000000000000000000000000000002', + ); + }); }); describe('supportsInterface', () => { diff --git a/src/lib/encodeKeyName.ts b/src/lib/encodeKeyName.ts index 7cf4c0da..68c8543d 100644 --- a/src/lib/encodeKeyName.ts +++ b/src/lib/encodeKeyName.ts @@ -26,7 +26,7 @@ import { padLeft, } from 'web3-utils'; -import { guessKeyTypeFromKeyName } from './utils'; +import { encodeArrayKey, guessKeyTypeFromKeyName } from './utils'; import { DynamicKeyParts } from '../types/dynamicKeys'; // https://github.com/lukso-network/LIPs/blob/main/LSPs/LSP-2-ERC725YJSONSchema.md#mapping @@ -248,9 +248,12 @@ function encodeDynamicKeyName( switch (keyType) { case 'Mapping': - return encodeDynamicMapping(name, dynamicKeyPartsArray); + return encodeDynamicMapping(name, dynamicKeyPartsArray as string[]); case 'MappingWithGrouping': - return encodeDynamicMappingWithGrouping(name, dynamicKeyPartsArray); + return encodeDynamicMappingWithGrouping( + name, + dynamicKeyPartsArray as string[], + ); default: throw new Error( `Could not encode dynamic key: ${name} of type: ${keyType}`, @@ -295,6 +298,13 @@ export function encodeKeyName(name: string, dynamicKeyParts?: DynamicKeyParts) { ]); } case 'Array': // Warning: this can not correctly encode subsequent keys of array, only the initial Array key will work + // encode for array index + if (dynamicKeyParts && typeof dynamicKeyParts == 'number') { + return encodeArrayKey(keccak256(name), dynamicKeyParts); + } + + // encode for array length + return keccak256(name); case 'Singleton': return keccak256(name); default: diff --git a/src/lib/schemaParser.test.ts b/src/lib/schemaParser.test.ts index 65bdfd0e..dcd8d60f 100644 --- a/src/lib/schemaParser.test.ts +++ b/src/lib/schemaParser.test.ts @@ -34,7 +34,7 @@ describe('schemaParser getSchema', () => { }); }); - describe.only('Array', () => { + describe('Array', () => { it('finds initial key of type Array correctly', () => { const schema = getSchema( '0x7c8c3416d6cda87cd42c71ea1843df28ac4850354f988d55ee2eaa47b6dc05cd', diff --git a/src/lib/utils.test.ts b/src/lib/utils.test.ts index a84a7772..50693904 100644 --- a/src/lib/utils.test.ts +++ b/src/lib/utils.test.ts @@ -65,11 +65,11 @@ describe('utils', () => { value: '0x00000000000000000000000000000002', }, { - key: '0x3a47ab5bd3a594c3a8995f8fa58d087600000000000000000000000000000000', + key: '0x7c8c3416d6cda87cd42c71ea1843df2800000000000000000000000000000000', value: '0xc444009d38d3046bb0cf81fa2cd295ce46a67c78', }, { - key: '0x3a47ab5bd3a594c3a8995f8fa58d087600000000000000000000000000000001', + key: '0x7c8c3416d6cda87cd42c71ea1843df2800000000000000000000000000000001', value: '0x4febc3491230571f6e1829e46602e3b110215a2e', }, ], @@ -560,7 +560,7 @@ describe('utils', () => { assert.deepStrictEqual(encodedDataWithMultipleKeys, { keys: [ '0x7c8c3416d6cda87cd42c71ea1843df28ac4850354f988d55ee2eaa47b6dc05cd', - '0x3a47ab5bd3a594c3a8995f8fa58d087600000000000000000000000000000000', + '0x7c8c3416d6cda87cd42c71ea1843df2800000000000000000000000000000000', ], values: [ '0x00000000000000000000000000000001', @@ -596,17 +596,17 @@ describe('utils', () => { assert.deepStrictEqual(encodedDataWithMultipleKeys, { keys: [ '0x7c8c3416d6cda87cd42c71ea1843df28ac4850354f988d55ee2eaa47b6dc05cd', - '0x3a47ab5bd3a594c3a8995f8fa58d087600000000000000000000000000000000', - '0x3a47ab5bd3a594c3a8995f8fa58d087600000000000000000000000000000001', - '0x3a47ab5bd3a594c3a8995f8fa58d087600000000000000000000000000000002', - '0x3a47ab5bd3a594c3a8995f8fa58d087600000000000000000000000000000003', - '0x3a47ab5bd3a594c3a8995f8fa58d087600000000000000000000000000000004', - '0x3a47ab5bd3a594c3a8995f8fa58d087600000000000000000000000000000005', - '0x3a47ab5bd3a594c3a8995f8fa58d087600000000000000000000000000000006', - '0x3a47ab5bd3a594c3a8995f8fa58d087600000000000000000000000000000007', - '0x3a47ab5bd3a594c3a8995f8fa58d087600000000000000000000000000000008', - '0x3a47ab5bd3a594c3a8995f8fa58d087600000000000000000000000000000009', - '0x3a47ab5bd3a594c3a8995f8fa58d08760000000000000000000000000000000a', + '0x7c8c3416d6cda87cd42c71ea1843df2800000000000000000000000000000000', + '0x7c8c3416d6cda87cd42c71ea1843df2800000000000000000000000000000001', + '0x7c8c3416d6cda87cd42c71ea1843df2800000000000000000000000000000002', + '0x7c8c3416d6cda87cd42c71ea1843df2800000000000000000000000000000003', + '0x7c8c3416d6cda87cd42c71ea1843df2800000000000000000000000000000004', + '0x7c8c3416d6cda87cd42c71ea1843df2800000000000000000000000000000005', + '0x7c8c3416d6cda87cd42c71ea1843df2800000000000000000000000000000006', + '0x7c8c3416d6cda87cd42c71ea1843df2800000000000000000000000000000007', + '0x7c8c3416d6cda87cd42c71ea1843df2800000000000000000000000000000008', + '0x7c8c3416d6cda87cd42c71ea1843df2800000000000000000000000000000009', + '0x7c8c3416d6cda87cd42c71ea1843df280000000000000000000000000000000a', ], values: ['0x0000000000000000000000000000000b', ...addressArray], }); @@ -665,8 +665,8 @@ describe('utils', () => { keys: [ '0x5ef83ad9559033e6e941db7d7c495acdce616347d28e90c7ce47cbfcfcad3bc5', '0x7c8c3416d6cda87cd42c71ea1843df28ac4850354f988d55ee2eaa47b6dc05cd', - '0x3a47ab5bd3a594c3a8995f8fa58d087600000000000000000000000000000000', - '0x3a47ab5bd3a594c3a8995f8fa58d087600000000000000000000000000000001', + '0x7c8c3416d6cda87cd42c71ea1843df2800000000000000000000000000000000', + '0x7c8c3416d6cda87cd42c71ea1843df2800000000000000000000000000000001', '0x0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47', ], values: [ diff --git a/src/types/dynamicKeys.ts b/src/types/dynamicKeys.ts index 19db626e..a2ab4b9f 100644 --- a/src/types/dynamicKeys.ts +++ b/src/types/dynamicKeys.ts @@ -2,7 +2,7 @@ import { EncodeDataType } from './encodeData/JSONURL'; -export type DynamicKeyParts = string | string[]; +export type DynamicKeyParts = string | string[] | number; export interface DynamicKeyPartInput { dynamicKeyParts: DynamicKeyParts;