Repository navigation
docs(audit-prep): record governance for stealth-splitter and stealth-batch-sender - #255
Merged
truthixify merged 1 commit intoOct 17, 2026
Conversation
…batch-sender
DEPLOYMENT_MANIFEST.md had no governance entry for either contract, so
the docs contract-registry check could not verify their upgradeability.
README.md and MIGRATION_V0_TO_V1.md listed both as upgradeable, but
neither contract has an upgrade entrypoint.
- stealth-splitter: frozen. No admin, no pause and no upgrade path.
- stealth-batch-sender: the code cannot be upgraded, but the contract
keeps two authorities, so it gets its own "Non-Upgradeable Contracts
(Pause Admin)" section:
- `init` sets a pause admin once.
- `init_multisig` sets a signer set that can only rotate itself,
behind a 7-day timelock.
- Batch sender deploy steps: add the missing `--admin` argument and the
`init_multisig` call. Note that neither call checks the caller, as
AUTHORIZATION_MATRIX.md already records.
- Incident response and rollback plan now cover both contracts. The
batch sender pause admin cannot be replaced, so a compromised admin
key means redeploying the batch sender.
Refs wraith-protocol/docs#182
|
Hey @izzetemredemir! 👋 It looks like this PR isn't linked to any issue. If this PR is for one of the issues assigned to you as part of a Wave, please link it to ensure your contribution is tracked properly. You can do this by adding a keyword to the PR description (e.g.,
|
truthixify
approved these changes
Oct 17, 2026
truthixify
left a comment
Contributor
There was a problem hiding this comment.
Governance documentation matches the current splitter and batch sender implementations. Approved.
truthixify
pushed a commit
to wraith-protocol/docs
that referenced
this pull request
Oct 18, 2026
…tch sender rows (#201) * fix(registry): fail on missing governance entries and fix splitter/batch sender rows The contract registry check only warned when a mainnet contract had no governance entry in the pinned contracts manifest. That is how stealth-splitter and stealth-batch-sender stayed unverified while the registry listed both as upgradeable, although neither contract has an upgrade entrypoint. Registry and page: - Record both contracts as non-upgradeable in the testnet and mainnet rows and in the governance table on the registry page. - Re-pin pinnedContractsRepoCommit to the contracts commit that adds their governance entries. Check script: - A missing governance entry is a failure. This applies to a contract listed on any network, not only mainnet. - A pinned manifest that returns 404 is a failure. Network errors are still warnings. - Parse the manifest's new "Non-Upgradeable Contracts" section. It holds contracts with immutable code and a pause admin. - `upgradeable` must be a boolean, and the same contract version must have the same flag on every network. - main() runs when the script is invoked through a symlinked path. Tests: - Export the pure checks and add node:test coverage. - check:contract-registry runs the tests before the network checks, so CI runs them without workflow changes. Closes #182 * chore(registry): pin the merged contracts governance commit wraith-protocol/contracts#255 merged as affc51c. Pin it instead of the PR head so the registry is checked against the manifest on develop.
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.
Why
The docs contract-registry check (wraith-protocol/docs#182) reads the governance section of
audit-prep/DEPLOYMENT_MANIFEST.mdat a pinned commit.stealth-splitterandstealth-batch-senderhave no entry there. The check only warned, and the docs registry kept listing both as upgradeable.What the source says (develop 66273f2)
stealth-splitterinit,create_split,fund_split,get_split.update_current_contract_wasm.initstores the announcer once; a second call returnsAlreadyInitialized.stealth-batch-senderhas no upgrade entry point.init(admin, announcer, asset_policy)stores the pause admin once. Nothing writesDataKey::Adminafterwards.pauseandunpauseonly affectbatch_send.init_multisig(signers, threshold)sets a signer set that can only rotate itself (multisig.rs):ROTATION_TIMELOCK_SECS(7 days, ledger timestamp);AUTHORIZATION_MATRIX.md.Changes
DEPLOYMENT_MANIFEST.mdstealth-splittergoes under "Frozen Contracts (No Admin)".stealth-batch-sendergets a new "Non-Upgradeable Contracts (Pause Admin)" section. It has a pause admin, so it does not fit the frozen definition the audit docs use ("no upgrade, pause, or admin paths" in02-threat-model.md), and it is not upgradeable either.--adminargument;init_multisigcall;AUTHORIZATION_MATRIX.mdalready records, so both run right after deploy.README.md,06-deployment-manifest.mdandstellar/MIGRATION_V0_TO_V1.mddescribed both contracts as upgradeable (the migration table even says 3-of-5 multisig and pausable for the splitter). They now match the source.The docs PR pins this commit. Once this merges, I'll re-pin it to the merge commit on
develop. The docs check has to learn the new section name, and that change is part of the docs PR.Noticed, not changed
stealth-senderandwraith-namesas upgradeable (multisig + timelock), but no contract understellar/*/srccallsupdate_current_contract_wasmon develop;AUTHORIZATION_MATRIX.mdsays the same. The manifest also sayswraith-nameshas no pause, but it haspause/unpause. These need a decision on the intended model, so they belong in a separate issue.stealth-senderinitexample is out of date.initnow takesannouncer, asset_policy, fee_recipient, fee_basis_points, admin.Refs wraith-protocol/docs#182