-
Notifications
You must be signed in to change notification settings - Fork 4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add tasks for activating E3, removing ciphernodes and generating sibling data #146
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,5 +1,7 @@ | ||||||||||||||||||||||||||||||||||||
import { LeanIMT } from "@zk-kit/lean-imt"; | ||||||||||||||||||||||||||||||||||||
import { task } from "hardhat/config"; | ||||||||||||||||||||||||||||||||||||
import type { TaskArguments } from "hardhat/types"; | ||||||||||||||||||||||||||||||||||||
import { poseidon2 } from "poseidon-lite"; | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
task("ciphernode:add", "Register a ciphernode to the registry") | ||||||||||||||||||||||||||||||||||||
.addParam("ciphernodeAddress", "address of ciphernode to register") | ||||||||||||||||||||||||||||||||||||
|
@@ -18,3 +20,49 @@ task("ciphernode:add", "Register a ciphernode to the registry") | |||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
console.log(`Ciphernode ${taskArguments.ciphernodeAddress} registered`); | ||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
task("ciphernode:remove", "Remove a ciphernode from the registry") | ||||||||||||||||||||||||||||||||||||
.addParam("ciphernodeAddress", "address of ciphernode to remove") | ||||||||||||||||||||||||||||||||||||
.addParam("siblings", "comma separated siblings from tree proof") | ||||||||||||||||||||||||||||||||||||
.setAction(async function (taskArguments: TaskArguments, hre) { | ||||||||||||||||||||||||||||||||||||
const registry = await hre.deployments.get("CiphernodeRegistryOwnable"); | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
const registryContract = await hre.ethers.getContractAt( | ||||||||||||||||||||||||||||||||||||
"CiphernodeRegistryOwnable", | ||||||||||||||||||||||||||||||||||||
registry.address, | ||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
const siblings = taskArguments.siblings | ||||||||||||||||||||||||||||||||||||
.split(",") | ||||||||||||||||||||||||||||||||||||
.map((s: string) => BigInt(s)); | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
const tx = await registryContract.removeCiphernode( | ||||||||||||||||||||||||||||||||||||
taskArguments.ciphernodeAddress, | ||||||||||||||||||||||||||||||||||||
siblings, | ||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||
await tx.wait(); | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
console.log(`Ciphernode ${taskArguments.ciphernodeAddress} removed`); | ||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
task("ciphernode:siblings", "Get the sibling of a ciphernode in the registry") | ||||||||||||||||||||||||||||||||||||
.addParam("ciphernodeAddress", "address of ciphernode to get siblings for") | ||||||||||||||||||||||||||||||||||||
.addParam( | ||||||||||||||||||||||||||||||||||||
"ciphernodeAddresses", | ||||||||||||||||||||||||||||||||||||
"comma separated addresses of ciphernodes in the order they were added to the registry", | ||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||
.setAction(async function (taskArguments: TaskArguments) { | ||||||||||||||||||||||||||||||||||||
const hash = (a: bigint, b: bigint) => poseidon2([a, b]); | ||||||||||||||||||||||||||||||||||||
const tree = new LeanIMT(hash); | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
const addresses = taskArguments.ciphernodeAddresses.split(","); | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
for (const address of addresses) { | ||||||||||||||||||||||||||||||||||||
tree.insert(BigInt(address)); | ||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||
Comment on lines
+58
to
+62
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Validate 'ciphernodeAddresses' input before processing When processing user-provided inputs like Here's how you might add input validation: const addresses = taskArguments.ciphernodeAddresses.split(",");
for (const address of addresses) {
+ let addressBigInt;
+ try {
+ addressBigInt = BigInt(address);
+ } catch (e) {
+ console.error(`Invalid address: ${address}`);
+ return;
+ }
tree.insert(addressBigInt);
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
const index = tree.indexOf(BigInt(taskArguments.ciphernodeAddress)); | ||||||||||||||||||||||||||||||||||||
const { siblings } = tree.generateProof(index); | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
Comment on lines
+64
to
+66
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add error handling for missing ciphernode address in the tree The code currently assumes that the Apply this diff to handle cases where the ciphernode address is not found: const index = tree.indexOf(BigInt(taskArguments.ciphernodeAddress));
+ if (index === -1) {
+ console.error(`Ciphernode address ${taskArguments.ciphernodeAddress} not found in the tree.`);
+ return;
+ }
const { siblings } = tree.generateProof(index); 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||
console.log(`Siblings for ${taskArguments.ciphernodeAddress}: ${siblings}`); | ||||||||||||||||||||||||||||||||||||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add validation for 'siblings' input
Similar to
ciphernodeAddresses
, thesiblings
input is parsed and converted toBigInt
without validation. Malformed inputs could cause exceptions. It's recommended to validate or handle potential errors when parsingsiblings
.Example of adding input validation:
📝 Committable suggestion