fix: address #399, #405, #406, #407 - #459
Merged
james2177 merged 4 commits intoOct 2, 2026
Merged
Conversation
…k contract for canonical p Closes stellar-vortex-protocol#399
…easury contract for contri Closes stellar-vortex-protocol#405
…hat splits protocol revenu Closes stellar-vortex-protocol#406
…th an m-of-n bonded arbite Closes stellar-vortex-protocol#407
|
@k2ghostyou Great news! 🎉 Based on an automated assessment of this PR, the linked Wave issue(s) no longer count against your application limits. You can now already apply to more issues while waiting for a review of this PR. Keep up the great work! 🚀 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
fix: address #399, #405, #406, #407
What was solved
#399 — [High] Build an on-chain address-book contract for canonical protocol addresses
Add a new
vortex_directorySoroban contract crate that maps canonical names to versioned addresses with timelocked propose/execute updates and an entry history, plus optional config-flag resolution hooks in settlement, the registry, and the badge so existing deployments keep working. Update CI and the deployment runbook to document bootstrap order and the new crate.Addressed:
get(name) -> (Address, version)andlist()read entrypoints on the new directory contractpropose_set/execute_setwith a configurable delay and per-change events#405 — [High] Build a streaming-payments treasury contract for contributor grants
Add a new
treasury_streamscrate implementing a Drips/Sablier-style pull-based streaming-payments treasury contract. The treasury (fee recipient) is funded and streams tokens to grantees per-second with optional cliffs; only the timelock/governor may create or cancel streams; recipients withdraw vested funds; cancellation returns unvested funds to the sender while leaving vested funds withdrawable. Includes precision-safe per-second vesting, per-action events, edge-case handling (rounding dust swept on final withdrawal, zero-duration streams, contract recipients), and a proptest invariant that vested + unvested always equals the deposit.Addressed:
create_stream(sender, recipient, token, total, start, cliff, end)with per-stream escrow accounting.withdraw(recipient)as a pull-based withdrawal of vested funds.cancel(stream_id)where unvested funds return to the sender and vested funds remain withdrawable by the recipient.#406 — [High] Build a fee-router contract that splits protocol revenue by governance-set weights
Add a new
fee_router/Soroban crate implementing a pull-based fee recipient that accumulates per-token balances and distributes them to governance-configured sinks according to timelocked weights (summing to 10,000 bps), with per-token accounting, a max sink count, dust-to-first-sink rounding, and failure isolation viaclaimable[sink][token]so rejecting sinks don't revert the whole distribution. Include deployment docs and a conservation proptest.Addressed:
fee_router/crate as the protocol fee recipientdistribute(token)is permissionless and pays out per governance-set weights summing to 10,000 bps#407 — [High] Replace the single arbiter with an m-of-n bonded arbiter panel
Replace the single-arbiter dispute resolution with an m-of-n bonded arbiter panel: a new
arbiter_panelcrate that handles arbiter registration/bonding, PRNG-seeded panel selection per dispute, a voting window, and tallying that callsresolve_disputeon settlement. Settlement must accept resolutions only from the panel contract, with a timeout fallback to the existingARBITER_WINDOWrule. Includes a full dispute lifecycle test with a collusion scenario and an updated dispute design doc.Addressed:
arbiter_panelcontract crate with arbiter register and bond functionalityintent_id, documenting that it is manipulable by the ledger closer and unsuitable as a sole defenceChanges
Cargo.toml(modify)treasury_streams/Cargo.toml(create)treasury_streams/src/lib.rs(create)fee_router/src/lib.rs(create)fee_router/Cargo.toml(create)docs/mainnet-deployment-runbook.md(modify)docs/dispute-resolution-design.md(modify)Approach
Issues
Closes #399
Closes #405
Closes #406
Closes #407