Skip to content

Commit

Permalink
feat: include also dynamicKeyPart in the schema return by getSchema
Browse files Browse the repository at this point in the history
  • Loading branch information
CJ42 committed Apr 30, 2024
1 parent 12d34d2 commit 30dda33
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 12 deletions.
14 changes: 10 additions & 4 deletions src/lib/schemaParser.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ describe('schemaParser getSchema', () => {
'0xeafec4d89fa9619884b60000f4d7faed14a1ab658d46d385bc29fb1eeaa56d0b',
);

console.log('schema ', schema);

assert.deepStrictEqual(schema, {
name: 'SupportedStandards:??????',
key: '0xeafec4d89fa9619884b60000f4d7faed14a1ab658d46d385bc29fb1eeaa56d0b',
Expand All @@ -113,13 +115,14 @@ describe('schemaParser getSchema', () => {
it('finds Known Mapping:<address> ', () => {
const address = 'af3bf2ffb025098b79caddfbdd113b3681817744';
const name = 'MyCoolAddress:<address>';
const dynamicName = `MyCoolAddress:${address}`;
const dynamicName = `MyCoolAddress:0x${address}`;
const key = `0x22496f48a493035f00000000${address}`;

const extraSchema: DynamicNameSchema = {
name,
dynamicName,
key,
dynamicKeyPart: `0x${address}`,
keyType: 'Mapping',
valueContent: 'Address',
valueType: 'address',
Expand All @@ -134,13 +137,14 @@ describe('schemaParser getSchema', () => {
const bytes32Value =
'1111222233334444555566667777888899990000aaaabbbbccccddddeeeeffff';
const name = `SomeBytes32Mapping:<bytes32>`;
const dynamicName = `SomeBytes32Mapping:${bytes32Value}`;
const dynamicName = `SomeBytes32Mapping:0x${bytes32Value}`;
const key = `0x0cfc51aec37c55a4d0b10000${bytes32Value.slice(0, 42)}`;

const extraSchema: DynamicNameSchema = {
name,
dynamicName,
key,
dynamicKeyPart: `0x${bytes32Value}`,
keyType: 'Mapping',
valueContent: 'Address',
valueType: 'address',
Expand All @@ -154,13 +158,14 @@ describe('schemaParser getSchema', () => {
it('finds known SomeSelectorMap:<bytes4>', () => {
const bytes4Value = 'beefbeef';
const name = `SomeSelectorMap:<bytes4>`;
const dynamicName = `SomeSelectorMap:${bytes4Value}`;
const dynamicName = `SomeSelectorMap:0x${bytes4Value}`;
const key = `0x0cfc51aec37c55a4d0b10000${bytes4Value}00000000000000000000000000000000`;

const extraSchema: DynamicNameSchema = {
name,
dynamicName,
key,
dynamicKeyPart: `0x${bytes4Value}`,
keyType: 'Mapping',
valueContent: '(Address,bool)',
valueType: '(address,bool)',
Expand All @@ -176,14 +181,15 @@ describe('schemaParser getSchema', () => {
it('finds MappingWithGrouping', () => {
const address = 'af3bf2ffb025098b79caddfbdd113b3681817744';
const name = `AddressPermissions:Permissions:<address>`;
const dynamicName = `AddressPermissions:Permissions:${address}`;
const dynamicName = `AddressPermissions:Permissions:0x${address}`;
const key = `0x4b80742de2bf82acb3630000${address}`;
const schema = getSchema(key);

assert.deepStrictEqual(schema, {
name,
dynamicName,
key,
dynamicKeyPart: `0x${address}`,
keyType: 'MappingWithGrouping',
valueContent: 'BitArray',
valueType: 'bytes32',
Expand Down
23 changes: 15 additions & 8 deletions src/lib/schemaParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,16 +121,18 @@ const findMappingSchemaForKey = (
key,
};

// 3. mappings with dynamic key part
// replace dynamic placeholder in the map part (e.g: <address>, <bytes32>) with the hex value
if (isDynamicKeyName(keySchema.name)) {
dynamicPartName = secondWordHex;
result['dynamicName'] = `${keyNameParts[0]}:${dynamicPartName}`;
result['dynamicName'] = `${keyNameParts[0]}:0x${dynamicPartName}`;
result['dynamicKeyPart'] = `0x${secondWordHex}`;
}

// if first 20 bytes of the hash of second word in schema match,
// display the map part as plain word
if (keccak256(keyNameParts[1]).substring(0, 26) === secondWordHex) {
[, dynamicPartName] = keyNameParts;
[, dynamicPartName] = `0x${keyNameParts}`;
}

return result;
Expand All @@ -145,16 +147,21 @@ const findMappingWithGroupingSchemaForKey = (
(schema) => schema.key.substring(0, 26) === key.substring(0, 26),
) || null;

const address = key.substring(26);

if (keySchema) {
const keyNameParts = keySchema.name.split(':');

const dynamicKeyPart = key.substring(26);

if (isDynamicKeyName(keySchema.name)) {
keySchema[
'dynamicName'
] = `${keyNameParts[0]}:${keyNameParts[1]}:0x${dynamicKeyPart}`;
keySchema['dynamicKeyPart'] = `0x${dynamicKeyPart}`;
}

return {
...keySchema,
key,
dynamicName: `${keySchema.name.substring(
0,
keySchema.name.lastIndexOf(':'),
)}:${address}`,
};
}

Expand Down
1 change: 1 addition & 0 deletions src/types/ERC725JSONSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,4 +168,5 @@ export interface ERC725JSONSchema {
// of a hex data key got retrieved via `getSchema(...)`.
export interface DynamicNameSchema extends ERC725JSONSchema {
dynamicName: string; // Describes the name of the key where the dynamic part (<address>, <bytes32) is replaced by the actual mapped value.
dynamicKeyPart: string;
}

0 comments on commit 30dda33

Please sign in to comment.