Repository navigation
Description
Summary
register enforces policy.max_position (a per-position cap) and policy.max_total_weight (a cap on the frozen eligible total W). Both bounds exist purely as arithmetic overflow guards for settlement's forfeiture-distribution math (max_position's own doc comment: "checked at deposit time so settlement's forfeiture-distribution arithmetic can't overflow"), not as a concentration or anti-Sybil control.
Nothing prevents a single funded actor from splitting capital across many addresses, each individually staying under max_position, to collectively acquire far more effective voting weight than any single position could hold, up to the full max_total_weight. docs/src/V2_RESOLUTION.md explicitly and deliberately rejects per-address caps as a concentration control for exactly this reason ("per-address caps... all increase combined influence when a participant splits capital across pseudonymous addresses... making address splitting profitable"), so this isn't an oversight in register's logic, it's a known consequence of the linear-weight design that isn't yet bounded by anything else.
Impact: a single well-funded actor can dominate a dispute's outcome by splitting into enough addresses, up to max_total_weight, the same plutocratic risk V2_RESOLUTION.md's own "Non-goals and trust assumption" section already states plainly ("an address or coalition controlling more than half of the eligible bonded capital can determine the result"), but with no bound at all today on how cheaply one actor can approach that threshold via splitting.
Scope
- Evaluate bounding the ratio between
max_total_weightandmax_positionatinitialize(e.g. requiringmax_total_weightbe no more than some multiple ofmax_position), so a deployment can at least cap how many effective "seats" a single split actor could occupy, even without solving Sybil resistance outright. - Document the residual plutocratic risk explicitly wherever policy parameters are described (
CONTRACT_V2.md), since this isn't fully solvable without an external identity system, perV2_RESOLUTION.md's own analysis. - This is a design trade-off, not a pure bug fix; the assignee should present options rather than assuming a specific ratio is correct.
Proposed approach
No single fix is prescribed. A bounded max_total_weight/max_position ratio is the most direct lever available without a larger redesign; the assignee's first deliverable should be a short written analysis of what ratio (if any) meaningfully raises the cost of address-splitting without over-constraining legitimate deployments, confirmed with the maintainer before implementation.
Activity
ZacLou commentedon Sep 3, 2026
I'd like to work on this. Before opening a PR, here is a design proposal for maintainer feedback:
Proposed mitigation: bound the max_total_weight / max_position ratio at initialize
max_total_weight <= max_position * MAX_POSITION_RATIO`n2. Introduce a constant MAX_POSITION_RATIO (e.g. 10) so a single actor must control at least max_total_weight / max_position distinct positions to approach the plutocratic threshold.
Rationale for ratio = 10
Tests
Please confirm whether this ratio and approach look right, or if you'd prefer a different bound or a runtime (rather than initialization-time) check.
ZacLou commentedon Sep 3, 2026
Opened a PR implementing the ratio-bound approach proposed above: #174. Happy to adjust the ratio or switch to a different mechanism based on maintainer feedback.
devkryssie commentedon Sep 3, 2026
hi maintainer i'll like to work on this issue and submit pr within 24hous
Stealth-cloud-droid commentedon Sep 3, 2026
hi maintainer i'll like to work on this issue and submit pr within 24hous
aojomo commentedon Sep 3, 2026
Hi maintainer, Please I would like to work on this issue
JohnArayaE commentedon Sep 3, 2026
I would like to work on this issue because the current relationship between max_total_weight and max_position leaves a meaningful concentration risk when a single funded actor can split capital across multiple addresses. I can first provide the requested short analysis comparing reasonable ratio bounds and their trade-offs, including how each option affects legitimate deployments versus the cost of address splitting, and confirm the preferred direction with the maintainer before making any implementation changes. I can also update the relevant V2 contract documentation to make the residual plutocratic risk and limitations of this mitigation explicit.
grantfox-oss commentedon Sep 4, 2026
🦊 GrantFox — @devkryssie has been assigned to this issue!
Next steps:
Closes #168)Good luck! Track your progress on GrantFox.
Ranjeet2063 commentedon Sep 5, 2026
Hi maintainers, I would like to take up this issue.
I specialize in Soroban smart contract architecture, cryptographic game theory, and sybil resistance mechanisms.
Implementation Plan:
contracts/tholos-v2/src/lib.rsregister()implementation to identify missing sybil resistance checks.contracts/tholos-v2/src/tests/covering sybil attempts, bonded constraints, and honest participant flows.grantfox-oss commentedon Sep 11, 2026
🦊 GrantFox — @Ranjeet2063 has been assigned to this issue!
Next steps:
Closes #168)Good luck! Track your progress on GrantFox.
collinsezedike commentedon Sep 11, 2026
@Ranjeet2063 You're assigned. @devkryssie was unassigned after going silent for two check-ins on an open PR (#182), now closed.
Please open a PR referencing this issue (Closes #168).
Ranjeet2063 commentedon Sep 11, 2026
Thank you @collinsezedike for assigning this! I am actively on it. Analyzing the ratio bounds between
max_total_weightandmax_positionand theV2_RESOLUTIONdesign trade-offs right now. Will deliver the clean PR with unit tests shortly.Ranjeet2063 commentedon Sep 11, 2026
Hey @collinsezedike, I have opened PR #215 resolving this issue.
Summary of work done:
MAX_TOTAL_WEIGHT_TO_POSITION_RATIO = 10and enforcedmax_total_weight <= max_position * 10ininitialize()with customError::InvalidWeightRatio = 37.max_position <= 10^19on i128).docs/src/V2_BOND_SIZING.mdand load scriptscripts/testnet-load-v2.sh.contracts/tholos-v2/src/test.rs.cargo clippyandcargo fmtclean.Ready for your review!
fix(tholos-v2): bound max_total_weight/max_position ratio to raise Sy…