</main>
<script type="module">
- // From noble-hashes v1.3.0
- import { keccak256 } from '/keccak256.js';
- const encoder = new TextEncoder();
-
// Normalize and extract the function name and parameter types
function splitFunction(fn) {
// Clean all characters that definitely do not affect the signature
return { name, parametersTypes };
}
- function validate(functionName, minimum) {
- const byteArray = keccak256(encoder.encode(functionName)).slice(0, 4);
- for (let i = 0; i < minimum; i++) {
- if (byteArray[i] === 0) {
- if (i + 1 === minimum) {
- const hash = `0x${[...byteArray].map(b => b.toString(16).padStart(2, '0')).join('')}`;
- return hash;
- }
- }
- else {
- return false;
- }
- }
- }
-
- function calculateOptimizedName(name, parametersTypes, minimum) {
- let counter = 0n;
- let functionName = `${name}_${counter}(${parametersTypes})`;
- let hash = validate(functionName, minimum);
- while (!hash) {
- counter++;
- functionName = `${name}_${counter.toString(36)}(${parametersTypes})`;
- hash = validate(functionName, minimum);
- }
- return { functionName, hash };
- }
-
document.querySelector('form').addEventListener('submit', e => {
e.preventDefault();
continue;
}
const { name, parametersTypes } = splitFunction(fn);
- const { functionName, hash } = calculateOptimizedName(name, parametersTypes, minimum);
- console.log(functionName, hash);
+
+ const worker = new Worker('/worker.js', { type: 'module' });
+ worker.postMessage({ name, parametersTypes, minimum });
+ worker.addEventListener('message', e => {
+ const { functionName, hash } = e.data;
+ console.log(functionName, hash);
+ });
}
})
</script>
--- /dev/null
+// From noble-hashes v1.3.0
+import { keccak256 } from '/keccak256.js';
+const encoder = new TextEncoder();
+
+function validate(functionName, minimum) {
+ const byteArray = keccak256(encoder.encode(functionName)).slice(0, 4);
+ for (let i = 0; i < minimum; i++) {
+ if (byteArray[i] === 0) {
+ if (i + 1 === minimum) {
+ const hash = `0x${[...byteArray].map(b => b.toString(16).padStart(2, '0')).join('')}`;
+ return hash;
+ }
+ }
+ else {
+ return false;
+ }
+ }
+}
+
+function calculateOptimizedName(name, parametersTypes, minimum) {
+ let counter = 0n;
+ let functionName = `${name}_${counter}(${parametersTypes})`;
+ let hash = validate(functionName, minimum);
+ while (!hash) {
+ counter++;
+ functionName = `${name}_${counter.toString(36)}(${parametersTypes})`;
+ hash = validate(functionName, minimum);
+ }
+ return { functionName, hash };
+}
+
+addEventListener('message', e => {
+ const { name, parametersTypes, minimum } = e.data;
+ const { functionName, hash } = calculateOptimizedName(name, parametersTypes, minimum);
+ postMessage({ functionName, hash });
+});