Repository navigation
[NF-06] [CONTRACT] On-Chain Guardian Multisig Contract #81
Copy link
Copy link
Closed
Labels
GrantFox OSSIssue tracked in GrantFox OSSIssue tracked in GrantFox OSSMaybe RewardedIssue may be eligible for a GrantFox rewardIssue may be eligible for a GrantFox rewardOfficial Campaign | FWC26Campaign: Official Campaign | FWC26Campaign: Official Campaign | FWC26contract
Description
Overview
Governance assumes a Guardian Multisig exists to veto Strategist proposals, but no multisig contract exists anywhere in this repository. This issue builds an actual on-chain N-of-M threshold signer contract to fill that role.
Problem
In contracts/governance/src/lib.rs, the Guardian is stored as a single plain Address:
env.storage().instance().set(&DataKey::Guardian, &guardian);
...
guardian.require_auth();veto() just requires standard auth from whatever address was registered as Guardian at initialize time. The README describes a "4-of-7 multisig" but that threshold/signer-list logic does not exist in this codebase at all — it is assumed to live in some externally-deployed contract supplied as a single Address. There is no way to verify, from this repo alone, that the deployed Guardian address actually enforces a 4-of-7 threshold.
Proposed Solution
- New contract
contracts/guardian_multisig/: stores a fixed set ofsigners: Vec<Address>and athreshold: u32(e.g. 4-of-7) atinitialize. propose_veto(proposal_id: u32) -> u32(returns a multisig-internal action id),approve(action_id: u32)(any signer,require_auth),execute_veto(action_id: u32, governance: Address)— onceapprovecount reachesthreshold, callsGovernance.veto(proposal_id)on behalf of the multisig contract's own address (which is what's registered asGuardianinGovernance).- Add
signers() -> Vec<Address>,threshold() -> u32,approvals(action_id) -> Vec<Address>read-only functions for the frontend signing console. Governanceitself needs no changes — it already just callsguardian.require_auth(), which will now correctly route through this new contract's own auth when it callsveto.
Acceptance Criteria
- Multisig contract enforces that
execute_vetoonly succeeds once approvals reach the configured threshold - A single signer cannot approve twice for the same action
-
execute_vetocorrectly callsGovernance.veto(proposal_id)and the veto is reflected in the proposal's status - Signer set and threshold are fixed at deployment (no mutation function) unless a separate signer-rotation issue is scoped
- Unit tests cover: reaching threshold executes the veto, below-threshold does not, duplicate approval from the same signer is rejected
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
GrantFox OSSIssue tracked in GrantFox OSSIssue tracked in GrantFox OSSMaybe RewardedIssue may be eligible for a GrantFox rewardIssue may be eligible for a GrantFox rewardOfficial Campaign | FWC26Campaign: Official Campaign | FWC26Campaign: Official Campaign | FWC26contract
Activity
devwums commentedon Jul 16, 2026
Hello team, i would love to resolve this issue. i have so many free time so i will be dedicated to your project. I am a software engineer and web3 developer. I will surely deliver on this with a quality pr.
grantfox-oss commentedon Jul 16, 2026
🦊 GrantFox — @devwums has been assigned to this issue as part of the Official Campaign | FWC26 campaign!
Next steps:
Closes #81)Good luck! Track your progress on GrantFox.
grantfox-oss commentedon Jul 21, 2026
🎉 This issue has been marked as completed on GrantFox as part of the Official Campaign | FWC26 campaign!
@devwums's PR #132 was approved and merged by @wumibals.
🏆 @devwums: You earned 35 FoxPoints for this contribution! Your current tier: Explorer (834 total points). Track your full progress on GrantFox.
👏 Great work, @devwums! Keep contributing to LadderMine.