Skip to content

Commit

Permalink
Update hashDomain
Browse files Browse the repository at this point in the history
  • Loading branch information
sc0Vu committed Jul 10, 2024
1 parent 2c6df18 commit 7e39b50
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 6 deletions.
55 changes: 49 additions & 6 deletions src/TypedData.php
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,50 @@ public static function hashType($type, $types)
return Hash::getSelectorFromName($result);
}

/**
* encodeField
*
* @param array $types
* @param string $type
* @param mixed $value
* @return string
*/
protected static function encodeField($types, $type, $value)
{
if (substr($type, 0, 1) === '*') {
// pointer
$type = substr($type, 1);
if (array_key_exists($type)) {
// struct
$result = [];
foreach ($value as $data) {
$result[] = self::hashStruct(type, $data);
}
return '0x' . FastPedersenHash::computeHashOnElements($result)->toString(16);
}
}
return Utils::toHex($value, true);
}

/**
* encodeData
*
* @param string $type
* @param array $types
* @param array $data
* @return string
*/
public static function encodeData(string $type, array $types, array $data)
{
$encodedValues = [];
foreach ($types[$type] as $field) {
$value = self::encodeField($types, $field['type'], $data[$field['name']]);
$encodedValues[] = $value;
}

return $encodedValues;
}

/**
* hashStruct
*
Expand All @@ -87,10 +131,9 @@ public static function hashType($type, $types)
*/
public static function hashStruct($typeName, $messageTypes, $message)
{
return FastPedersenHash::computeHashOnElements(
self::hashType($typeName, $messageTypes),
0
);
return Utils::removeLeadingZero(FastPedersenHash::computeHashOnElements(array_merge([
self::hashType($typeName, $messageTypes)
], self::encodeData($typeName, $messageTypes, $message)))->toString(16));
}

/**
Expand Down Expand Up @@ -128,7 +171,7 @@ public static function hashDomain($domainData)
$domainTypes['StarkNetDomain'][] = $revision0Domain[$key];
}
}
return $this->hashStruct('StarkNetDomain', $domainTypes, $domainData);
return self::hashStruct('StarkNetDomain', $domainTypes, $domainData);
}

/**
Expand All @@ -147,6 +190,6 @@ public static function messageHash($domain, $messageTypes, $message, $address)
self::hashDomain($domain),
$address
];
return FastPedersenHash::computeHashOnElements($message);
return Utils::removeLeadingZero(FastPedersenHash::computeHashOnElements($message)->toString(16));
}
}
29 changes: 29 additions & 0 deletions test/unit/TypedDataTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,33 @@ public function testHashType()
$result = TypedData::hashType('StarkNetDomain', [ 'StarkNetDomain' => $revision0Domain ]);
$this->assertEquals('98d1932052fc5137543de5ed85b7a88555a4cd1ff5d5bfedb62ed9b9a1f0db', $result);
}

/**
* testHashDomain
*
* @return void
*/
public function testHashDomain()
{
$revision0Domain = [
'name' => [
'name' => 'name',
'type' => 'felt'
],
'chainId' => [
'name' => 'chainId',
'type' => 'felt'
],
'version' => [
'name' => 'version',
'type' => 'felt'
]
];
$result = TypedData::hashDomain([
'name' => 'Paradex',
'chainId' => 'PRIVATE_SN_POTC_SEPOLIA',
'version' => 1
]);
$this->assertEquals('38b9242cb46eb19ff458c80a8f0eda7e8e26d8d6d54a63d9b5ed89750e39ef2', $result);
}
}

0 comments on commit 7e39b50

Please sign in to comment.