Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
e411755
Add DKGContract scaffold and wire it into deploy scripts
jannikluhn May 20, 2026
f323d62
Add DKG phase-arithmetic helpers (issue #002)
jannikluhn May 20, 2026
6c057ea
Add ECIESKeyRegistry contract (issue #005)
jannikluhn May 20, 2026
33ec3a5
Add DKG bulletin-board message functions (issue #003)
jannikluhn May 20, 2026
e05fff3
Add DKG success-voting mechanism (issue #004)
jannikluhn May 20, 2026
c79c637
Change submitDealing/DealingSubmitted polyEval to bytes[]
jannikluhn May 20, 2026
f0d8cac
Add dkgContract address field to KeyperSet
jannikluhn May 20, 2026
748f5aa
Add happy-path DKG gas benchmark
jannikluhn May 20, 2026
b21b311
Add worst-case DKG gas benchmark
jannikluhn May 20, 2026
892cb92
feat(scripts): deploy DKG/ECIES in service deployment; wire DKG into …
jannikluhn May 20, 2026
d7e14c7
feat(dkg): add WrongDKGContract guard to all submit functions
jannikluhn May 21, 2026
a79dc72
fix(benchmark): add missing setDKGContract call in DKGBenchmark._setup
jannikluhn May 22, 2026
c18cb30
fix(benchmark): exclude setup gas from Forge per-test gas reporting
jannikluhn May 26, 2026
8a3180f
chore: format
jannikluhn May 27, 2026
8c43092
feat(dkg): add IDKGContract interface and implement it on DKGContract
jannikluhn May 27, 2026
ef231f8
feat(keyper-set-manager): validate DKG contract pairing on addKeyperSet
jannikluhn May 27, 2026
4ea147c
feat(scripts): require DKG_CONTRACT_ADDRESS in AddKeyperSet
jannikluhn May 27, 2026
0c9a998
fix: set dkg contract for fake keyper set
jannikluhn Jun 3, 2026
c768ee9
feat: add zero/empty guards
jannikluhn Jun 3, 2026
f718cc1
feat: add go bindings for new contracts
jannikluhn Jul 8, 2026
960de20
chore: drop stale unversioned event-trigger binding
jannikluhn Jul 8, 2026
49bd96d
feat: add dkg deploy and status script
jannikluhn Jul 10, 2026
029404f
feat(dkg): bound DKG retries with MAX_RETRIES immutable
jannikluhn Jul 14, 2026
929d7e1
style(dkg-state): apply prettier formatting
jannikluhn Jul 14, 2026
80d0dd0
feat(dkg): expose winning retry counter for succeeded DKGs
jannikluhn Jul 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,467 changes: 1,467 additions & 0 deletions bindings/dkgcontract/dkgcontract.go

Large diffs are not rendered by default.

493 changes: 493 additions & 0 deletions bindings/ecieskeyregistry/ecieskeyregistry.go

Large diffs are not rendered by default.

56 changes: 54 additions & 2 deletions bindings/keyperset/keyperset.go

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions bindings/keypersetmanager/keypersetmanager.go

Large diffs are not rendered by default.

648 changes: 0 additions & 648 deletions bindings/shuttereventtriggerregistry/shuttereventtriggerregistry.go

This file was deleted.

Large diffs are not rendered by default.

18 changes: 9 additions & 9 deletions foundry.lock
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
{
"lib/openzeppelin-foundry-upgrades": {
"lib/forge-std": {
"tag": {
"name": "v0.4.0",
"rev": "cbce1e00305e943aa1661d43f41e5ac72c662b07"
"name": "v1.10.0",
"rev": "8bbcf6e3f8f62f419e5429a0bd89331c85c37824"
}
},
"lib/openzeppelin": {
"rev": "932fddf69a699a9a80fd2396fd1a2ab91cdda123"
},
"lib/openzeppelin-contracts-upgradeable": {
"tag": {
"name": "v5.4.0",
"rev": "e725abddf1e01cf05ace496e950fc8e243cc7cab"
}
},
"lib/openzeppelin": {
"rev": "932fddf69a699a9a80fd2396fd1a2ab91cdda123"
},
"lib/forge-std": {
"lib/openzeppelin-foundry-upgrades": {
"tag": {
"name": "v1.10.0",
"rev": "8bbcf6e3f8f62f419e5429a0bd89331c85c37824"
"name": "v0.4.0",
"rev": "cbce1e00305e943aa1661d43f41e5ac72c662b07"
}
}
}
2 changes: 2 additions & 0 deletions gen_bindings.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ CONTRACTS=(
"src/common/KeyperSet.sol:KeyperSet"
"src/common/EonKeyPublish.sol:EonKeyPublish"
"src/common/KeyBroadcastContract.sol:KeyBroadcastContract"
"src/common/DKGContract.sol:DKGContract"
"src/common/ECIESKeyRegistry.sol:ECIESKeyRegistry"
"src/shop/Inbox.sol:Inbox"
"src/shutter-service/ShutterRegistry.sol:ShutterRegistry"
"src/shutter-service/ShutterEventTriggerRegistry.sol:ShutterEventTriggerRegistryV1"
Expand Down
5 changes: 5 additions & 0 deletions script/AddKeyperSet.gnosh.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ contract AddKeyperSet is Script {
keyBroadcastContractAddress
);

address dkgContract = vm.envOr("DKG_CONTRACT_ADDRESS", address(0));

address[] memory keypers = vm.envAddress("KEYPER_ADDRESSES", ",");
uint256 threshold = vm.envUint("THRESHOLD");
if (threshold > keypers.length) {
Expand All @@ -57,6 +59,9 @@ contract AddKeyperSet is Script {
keyperSet.addMembers(keypers);
keyperSet.setThreshold(uint64(threshold));
keyperSet.setPublisher(address(eonKeyPublish));
if (dkgContract != address(0)) {
keyperSet.setDKGContract(dkgContract);
}
keyperSet.setFinalized();
console.log("keyperSet:", address(keyperSet));
console.log("eonKeyPublish:", address(eonKeyPublish));
Expand Down
3 changes: 3 additions & 0 deletions script/AddKeyperSet.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ contract AddKeyperSet is Script {
keyBroadcastContractAddress
);

address dkgContract = vm.envAddress("DKG_CONTRACT_ADDRESS");

address[] memory keypers = vm.envAddress("KEYPER_ADDRESSES", ",");
uint256 threshold = vm.envUint("THRESHOLD");
if (threshold > keypers.length) {
Expand All @@ -57,6 +59,7 @@ contract AddKeyperSet is Script {
keyperSet.addMembers(keypers);
keyperSet.setThreshold(uint64(threshold));
keyperSet.setPublisher(address(eonKeyPublish));
keyperSet.setDKGContract(dkgContract);
keyperSet.setFinalized();
console.log("keyperSet:", address(keyperSet));
console.log("eonKeyPublish:", address(eonKeyPublish));
Expand Down
81 changes: 81 additions & 0 deletions script/AddKeyperSet.v2.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.22;

import "forge-std/Script.sol";
import {KeyperSet} from "../src/common/KeyperSet.sol";
import {KeyperSetManager} from "../src/common/KeyperSetManager.sol";
import {KeyBroadcastContract} from "../src/common/KeyBroadcastContract.sol";

/// Variant of AddKeyperSet that wires the DKG contract itself as the
/// KeyBroadcastContract publisher. The old script deployed a separate
/// EonKeyPublish aggregator; with the current DKGContract this is
/// redundant, because submitSuccessVote already tallies votes and, on
/// crossing threshold, attempts KeyBroadcastContract.broadcastEonKey via
/// try/catch. Setting publisher = address(dkg) lets that broadcast succeed,
/// so the eon key ends up in KBC as a side effect of the last success vote
/// and no extra contract is needed.

error ActivationDeltaTooLow();
error ThresholdExceedsKeyperSetSize(uint256 threshold, uint256 keyperSetSize);
error UnexpectedKeyperSet(
uint256 index,
address expectedKeyperSet,
address actualKeyperSet
);

contract AddKeyperSetV2 is Script {
function run() public {
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
address deployerAddress = vm.addr(deployerPrivateKey);
console.log("deployer:", deployerAddress);
vm.startBroadcast(deployerPrivateKey);

uint256 activationDelta = vm.envOr("ACTIVATION_DELTA", uint256(1));
if (activationDelta < 1) {
revert ActivationDeltaTooLow();
}

address keyperSetManagerAddress = vm.envAddress(
"KEYPERSETMANAGER_ADDRESS"
);
KeyperSetManager keyperSetManager = KeyperSetManager(
keyperSetManagerAddress
);

address dkgContract = vm.envAddress("DKG_CONTRACT_ADDRESS");

address[] memory keypers = vm.envAddress("KEYPER_ADDRESSES", ",");
uint256 threshold = vm.envUint("THRESHOLD");
if (threshold > keypers.length) {
revert ThresholdExceedsKeyperSetSize(threshold, keypers.length);
}

uint64 keyperSetIndex = keyperSetManager.getNumKeyperSets();
KeyperSet keyperSet = new KeyperSet();
keyperSet.addMembers(keypers);
keyperSet.setThreshold(uint64(threshold));
keyperSet.setPublisher(dkgContract);
keyperSet.setDKGContract(dkgContract);
keyperSet.setFinalized();
console.log("keyperSet:", address(keyperSet));
console.log("publisher (= dkgContract):", dkgContract);

uint64 activationBlock = uint64(block.number + activationDelta);
keyperSetManager.addKeyperSet(activationBlock, address(keyperSet));
console.log("activationBlock:", activationBlock);
console.log("keyperSetIndex:", keyperSetIndex);

address actualKeyperSet = keyperSetManager.getKeyperSetAddress(
keyperSetIndex
);
if (actualKeyperSet != address(keyperSet)) {
revert UnexpectedKeyperSet(
keyperSetIndex,
address(keyperSet),
actualKeyperSet
);
}

vm.stopBroadcast();
}
}
Loading
Loading