Audit date: 2026-06-25
Scope: formal v9.26.2 DigiDollar mainnet release readiness. This document now tracks both the original audit findings and the housekeeping execution status.
- Version source is set to v9.26.2:
configure.achas major9, minor26, build2, releasetrue, and no RC suffix. - Normal public mainnet parameters are restored:
src/kernel/chainparams.cppuses magicfa c3 b6 daand P2P port12024;src/chainparamsbase.cppuses mainnet data directory suffix"", RPC port14022, and onion target port14122. - The PRE/mainnet rehearsal network settings are not active in source:
the active source no longer uses
mainnet-pre,12046,14046, or14146for mainnet. - Historical DigiByte fork heights are still present in mainnet chainparams:
DigiShield
67200, MultiAlgo145000, MultiShield400000, DigiSpeed1430000, reserve algo bits8547840, algo swap9100000, Odocrypt9112320, and BIP34/BIP65/BIP66/CSV/SegWit at4394880. - Mainnet DigiDollar activation is BIP9-gated:
bit
23, threshold28224, window40320, start time1780272000, timeout1811808000, and minimum activation height23627520. - Mainnet DigiDollar, oracle validation, and MuSig2 are aligned:
nDDActivationHeight,nOracleActivationHeight, andnDigiDollarMuSig2Heightare all23627520. - Mainnet oracle quorum is configured as 7-of-35:
nOraclePubkeyCount = 35,nOracleConsensusRequired = 7, with 35 configured oracle pubkeys and 35 configured oracle node entries. - The current oracle bundle validation path is shared by mainnet and testnet: a DigiDollar price-sensitive mint or redeem must have a valid v0x03 MuSig2 oracle bundle after activation.
- Lock-tier policy is intentionally not a housekeeping item: the current build still contains the 1-hour and 10-year lock tiers, and this audit does not propose changing them.
Targeted validation already run during this audit:
./src/test/test_digibyte --run_test=musig2_activation_tests./src/test/test_digibyte --run_test=rh50_oracle_keyset_alignment_tests./src/test/test_digibyte --run_test=digidollar_activation_wave12_tests./src/test/test_digibyte --run_test=miner_dd_validation_tests./src/test/test_digibyte --run_test=rh65_mainnet_testnet_validator_parity_tests
All five targeted test groups passed.
Completed in this housekeeping pass:
- Commit
88b7ad81cd(release: prune stale mainnet seeders) removed the four mainnet DNS seed domains that did not resolve from local and Cloudflare DNS checks:seed.digibyteblockchain.org,eu.digibyteseed.com,seed.quakeguy.com, andseed.digibyte.services. - The retained mainnet DNS seed domains were rechecked and returned reachable
sampled peers on TCP
12024:seed.digibyte.io,seed.diginode.tools,seed.digibyte.link, andseed.aroundtheblock.app. contrib/seeds/makeseeds.pynow accepts the v9.26.x user-agent family so a future fixed-seed refresh does not filter current v9 release nodes out.src/chainparamsseeds.hwas regenerated from the currentcontrib/seeds/nodes_main.txtandcontrib/seeds/nodes_test.txt; the generated output matched the checked-in file, so no fixed-seed byte change was needed.- Commit
47b9ea3481(release: refresh mainnet chain metadata) added a fresh block23,500,000mainnet checkpoint and updated release safety metadata.
Mainnet checkpoint data used from the local synced v9.26.2 Qt node:
- Height:
23,500,000 - Block hash:
ade47d5ccbb92cb1d965b97a187bdbf65bf74be6a3709cb6a01339f8c2856deb - Chainwork:
0000000000000000000000000000000000000000001cae290ed41eb2efd4804c - Block time:
1778906996 - Chain transaction count from
getchaintxstatsat that block:53,488,713 - Transaction rate from the 8192-block stats window:
0.09148870167189133
The placeholder mainnet AssumeUTXO entry was removed because it had a zero serialized UTXO hash and zero transaction count. v9.26.2 now ships no mainnet AssumeUTXO snapshot until a real snapshot is generated.
Taproot live state was also checked with the running mainnet node:
- Taproot status:
active - Taproot since height:
21,168,000 - DigiDollar status during the check:
started, minimum activation height23,627,520
Validation completed after the code changes:
make -j$(nproc)python3 contrib/seeds/generate-seeds.py contrib/seedsproduced no diff againstsrc/chainparamsseeds.h- Focused unit tests:
oracle_config_tests,rh50_oracle_keyset_alignment_tests,digidollar_oracle_tests/chainparams_oracle_endpoint_uniqueness, andvalidation_tests - Full unit test suite:
./src/test/test_digibyte --show_progresspassed3401test cases - Full functional suite:
test/functional/test_runner.py --jobs=8passed all378listed entries with expected skips; runtime398s - Fuzz smoke with an empty input file passed for:
dd_txbuilder_validate_mint_params,dd_txbuilder_mint,dd_txbuilder_redeem,oracle_bundle_v03_roundtrip,oracle_bundle_validation,oracle_musig2_bundle,oracle_p2p_wire_messages,oracle_validate_block_data, andfuzz_block_algo_routing_phase2a - Commit
07a63a9586(test: refresh regtest assumeutxo vector) refreshed the regtest height-299 AssumeUTXO vector and updatedfeature_assumeutxo.pyto match the deterministic DigiByte regtest snapshot it builds. - Commit
1fec3a51f9(test: restore assumeutxo functional coverage) restoredfeature_assumeutxo.pyto the default functional runner. test/functional/feature_assumeutxo.pypassed directly.test/functional/test_runner.py feature_assumeutxo.py --jobs=1passed.feature_assumevalid.pyremains intentionally disabled. The current test buries the invalid block by 2100 blocks, which is Bitcoin's two-week-work assumption, but only hours of DigiByte-equivalent work at 15-second spacing. Porting it correctly is a separate test-maintenance task.
Oracle peer-seeding decision:
- The 35 oracle public keys, 35 active oracle slots, and 7-of-35 MuSig2 quorum must stay intact.
- The release does not need 35 live oracle DNS endpoints for consensus. The 35-slot endpoint list is roster/status metadata; oracle security comes from the hardcoded public keys and MuSig2 bundle validation.
- For launch operations, oracle operators should use the two public v9.26.2
mainnet oracle seed peers we have now:
oracle1.digibyte.io:12024anddigihash.digibyte.io:12024. - A third, fourth, and fifth stable public seed peer would be useful for redundancy, but this is operational bootstrap redundancy, not consensus.
Code currently defines 35 active mainnet oracle slots and endpoint strings, all
using port 12024. Those endpoint strings are not consensus trust anchors.
Local DNS verification found only these oracle hostnames resolving:
oracle1.digibyte.iodigihash.digibyte.io
Local TCP reachability on port 12024 during the re-check:
digihash.digibyte.io:12024accepted a TCP connection.oracle1.digibyte.io:12024did not accept a TCP connection from this host.
The oracle2.digidollar.org through oracle35.digidollar.org style hostnames
did not resolve locally during this audit.
Important: these configured oracle endpoints are not the same thing as mainnet DNS seeders. They are oracle roster metadata used by RPC/status display and key alignment checks. Oracle message validity is controlled by the configured oracle public keys and MuSig2 signature validation, not by trusting DNS hostnames.
Tasks:
- Confirm
oracle1.digibyte.ioanddigihash.digibyte.ioresolve from outside the local network. - Confirm both public oracle seed peers accept inbound DigiByte P2P traffic on
port
12024. - Add one to three more stable public v9.26.2 mainnet peers if community hosts volunteer them.
- Confirm the running oracle node for each slot uses the pubkey assigned to that slot.
- Run a mainnet smoke check after DNS is fixed:
listoracle,getoraclepubkey,getdigidollardeploymentinfo, and one controlled oracle start/stop flow.
Why this matters:
The code-side 35-slot roster is internally consistent. Oracle operators still need a few reliable public peers so their nodes can find each other and relay oracle traffic cleanly through activation.
Mainnet previously listed eight DNS seeds in src/kernel/chainparams.cpp.
Commit 88b7ad81cd removed the four domains that did not resolve locally.
The formal v9.26.2 mainnet source now retains these four DNS seeds:
seed.digibyte.ioseed.diginode.toolsseed.digibyte.linkseed.aroundtheblock.app
Local TCP reachability on port 12024 during the re-check:
- Accepted
12024in the sampled returned peers:seed.digibyte.io,seed.diginode.tools,seed.digibyte.link,seed.aroundtheblock.app
Current removal candidates because they did not resolve locally:
seed.digibyteblockchain.orgeu.digibyteseed.comseed.quakeguy.comseed.digibyte.services
Completed:
- The four non-resolving domains were removed from mainnet chainparams.
- The retained seed domains returned reachable sampled mainnet peers on TCP
12024during the local audit. contrib/seeds/makeseeds.pynow accepts v9.26.x user agents.- Regenerating
src/chainparamsseeds.hfrom the current seed files produced no diff, so the fixed-seed byte list did not need a source change.
Why this matters:
The release should not depend on stale seed infrastructure. New mainnet users need reliable initial peers after installing v9.26.2.
Commit 47b9ea3481 refreshed mainnet chain safety metadata from the synced
local v9.26.2 Qt node at block 23,500,000.
Completed:
- Added checkpoint height
23,500,000. - Updated
defaultAssumeValidto block23,500,000. - Set
nMinimumChainWorkfrom that block's chainwork. - Refreshed
chainTxDatafromgetchaintxstats. - Removed the placeholder mainnet AssumeUTXO entry because it had zero values and was not a real release snapshot.
Why this matters:
This is normal release housekeeping, but it matters more for DigiDollar because activation and oracle validation depend on nodes being cleanly synced on the same mainnet chain.
DigiDollar V1 uses P2TR vault scripts. The code has a separate Taproot BIP9 deployment and DigiDollar activation assumes Taproot script support is available before DigiDollar activates.
Completed:
- The synced local mainnet v9.26.2 Qt node reported Taproot
active. - Taproot was active since height
21,168,000.
Why this matters:
The code sets DigiDollar activation separately from Taproot. The release process must confirm the live network state before asking wallets, exchanges, pools, and oracles to prepare for DigiDollar activation.
The source version is v9.26.2, but several public docs still read like RC, testnet, or PRE rehearsal material.
Tasks:
- Add formal
digidollar/RELEASE_v9.26.2.mdrelease notes. - Update root
README.mdto explain that v9.26.2 is the formal DigiDollar mainnet activation release. - Update
doc/release-notes.md; it still contains stale DigiDollar language from older phases, including old oracle counts and old activation descriptions. - Update
DIGIDOLLAR_ARCHITECTURE.mdandDIGIDOLLAR_EXPLAINER.mdwhere they still describe validation as RC/testnet-focused instead of formal mainnet release-focused. - Update oracle setup and integration guides so exchanges, wallets, pools, and oracle operators see v9.26.2 as the formal baseline.
- Clearly mark
digidollar/MAINNET_TEST.mdand PRE release notes as historical rehearsal documentation, not formal mainnet configuration.
Why this matters:
The code may be correct, but stale docs can cause operators to use the wrong version, wrong network assumptions, wrong oracle count, or wrong activation expectations.
The build source says v9.26.2, but the current tests only check that version output exists. They do not assert the exact formal release version.
Tasks:
- Add or update a focused test that verifies the exact v9.26.2 release string.
- Include the GUI splash/version text if the release image is part of the expected user-facing version surface.
Why this matters:
The formal release should not ship with mismatched binary version, GUI version, release notes, or tag name.
Tracked test files exist that are not wired into the normal test build lists. These should be intentionally registered or intentionally removed before the formal release.
Unit-test files found tracked but not registered in the current test list:
src/test/bip324_tests.cppsrc/test/limitedmap_tests.cppsrc/test/rbf_tests.cppsrc/wallet/test/accounting_tests.cpp
Additional cleanup finding:
src/test/crypto_tests_backup.cppdefines a duplicatecrypto_testssuite name and appears to be a backup artifact, not an intended release test.
Fuzz files found tracked but not wired into the normal fuzz source list:
src/test/fuzz/crypto_chacha20_poly1305_aead.cppsrc/test/fuzz/data_stream.cppsrc/test/fuzz/odocrypt.cpp
Tasks:
- Decide whether each file should be active release coverage or removed as stale source.
- Register intended tests in the appropriate makefile lists.
- Remove true backup/stale artifacts in a focused cleanup commit.
- Re-run unit, functional, and fuzz build/test gates after cleanup.
Why this matters:
Unregistered tests create false confidence. Backup test artifacts can also break future test discovery or duplicate-suite cleanup.
After the remaining oracle endpoint and release-document decisions are fixed, run one final release validation pass.
Required gates:
- Full unit test suite.
- Full functional test suite:
test/functional/test_runner.py --jobs=8 - DigiDollar/oracle-focused functional subset if the full suite fails for an unrelated environment reason.
- Fuzz target build and at least a short smoke run for DigiDollar/oracle/mining related targets.
- Clean build from a fresh checkout or clean build directory.
- GUI launch smoke check showing the v9.26.2 DigiDollar release branding.
- Mainnet startup smoke check with no PRE network parameters active.
Why this matters:
The formal DigiDollar release needs one clean final proof pass after metadata, seed, docs, and version housekeeping are complete.
doc/release-process.md calls out headerssync review as part of release
maintenance. contrib/devtools/headerssync-params.py should be checked against
current DigiByte mainnet assumptions before the formal release.
Tasks:
- Confirm the script is still used by this release process.
- If used, update parameters from current mainnet data.
- If not used, document that clearly so future release work does not treat stale values as active release policy.
One RPC comment still describes V1 as setting the format gate to zero, while
current mainnet code sets MuSig2/DigiDollar activation at height 23627520.
Tasks:
- Update stale comments in
src/rpc/digidollar.cppand nearby docs so they match the current v0x03 MuSig2-only release model.
The exchange-price code fails closed when libcurl support is unavailable. Release documentation and build messaging should make that clear for oracle operators.
Tasks:
- Confirm configure/build output describes oracle price fetching accurately.
- Document that production oracle operators need libcurl-enabled builds.
- Make clear that no-libcurl builds are not valid production oracle-signing builds.
The repo maps are useful for future agents and release audits, but they should match the final v9.26.2 tree after housekeeping changes.
Tasks:
- Update
REPO_MAP.md. - Update
REPO_MAP_DIGIDOLLAR.md. - Remove or clearly mark obsolete PRE/testnet-only references.
- Do not change the mainnet magic bytes.
- Do not change the normal mainnet ports.
- Do not change the normal mainnet data directory.
- Do not change historical DigiByte fork heights.
- Do not move DigiDollar, oracle validation, and MuSig2 to different mainnet heights.
- Do not remove the current 1-hour or 10-year lock tiers as part of this housekeeping pass.
- Do not keep PRE/mainnet rehearsal settings in the formal release.
The formal v9.26.2 source tree now has the main PRE rehearsal reversion done, normal mainnet network identity restored, stale DNS seeds pruned, fresh mainnet chain safety metadata added, Taproot verified active, and DigiDollar, oracle validation, and MuSig2 activation aligned.
The highest-risk remaining release item is operational oracle/bootstrap connectivity: the 35 oracle public keys and 7-of-35 quorum are correct in code, and the launch plan is to use DigiByte.io and DigiHash as public v9.26.2 mainnet oracle seed peers while asking for one to three more for redundancy. Formal public docs are being handled by the separate docs team.
Quick v9.26.2 DigiDollar housekeeping update before we do the formal mainnet release.
The main PRE rehearsal changes have been reverted. The current source tree is back on normal DigiByte mainnet identity: same mainnet magic bytes, same normal mainnet ports, same normal mainnet data directory, and the historical DigiByte fork heights are still intact. DigiDollar, oracle validation, and MuSig2 are all aligned at the same mainnet activation height in chainparams.
Taproot is already active, and the release/docs team is handling the formal public release notes and integration docs separately. The core housekeeping work completed in this pass:
-
Fresh mainnet checkpoint and chain metadata are updated. We added block
23,500,000as the current checkpoint, updateddefaultAssumeValid, set realnMinimumChainWork, refreshedchainTxData, and removed the placeholder mainnet AssumeUTXO entry. -
Mainnet DNS seeds are cleaned up. The seeds that resolved and returned reachable sampled mainnet peers were:
seed.digibyte.io,seed.diginode.tools,seed.digibyte.link, andseed.aroundtheblock.app.The seed domains that did not resolve locally were removed:
seed.digibyteblockchain.org,eu.digibyteseed.com,seed.quakeguy.com, andseed.digibyte.services.src/chainparamsseeds.hwas regenerated from the current seed files and had no diff. The seed-generation user-agent filter now accepts v9.26.x nodes. -
Regtest AssumeUTXO coverage is restored. The stale regtest AssumeUTXO vector was updated and
feature_assumeutxo.pyis back in the default functional runner.
Remaining item:
-
Verify oracle/bootstrap connectivity. Oracle hostnames are not consensus trust anchors. The actual oracle security comes from the hardcoded oracle public keys and 7-of-35 MuSig2 validation. The hostnames are only bootstrap/status/operator metadata.
For the formal release we only need stable public bootstrap/connectivity for DigiHash and DigiByte.io style nodes, with one to three more useful but not consensus-required. Those seed peers should accept normal mainnet P2P on TCP
12024before we put them in operator instructions. -
Run final release gates after the remaining release decisions. Once oracle endpoint/docs decisions are finalized, we need the full unit suite, full functional suite with
test/functional/test_runner.py --jobs=8, relevant fuzz build/smoke coverage, Qt launch/version verification, and a final mainnet startup smoke check.
The important part: nothing in this housekeeping changes DigiDollar economics, mainnet identity, historical fork heights, or the DigiDollar/oracle/MuSig2 activation alignment. This is the final cleanup pass to make sure the formal v9.26.2 DigiDollar release starts from clean mainnet settings and reliable network bootstrap data.