chore(deploy): config-driven price-oracle bring-up script + runbook + config block#188
Merged
Merged
Conversation
… config block Closes the ops/deploy gap behind the oracle audit fixes: the price oracle is real and consumed (Tangle payments/exposure + ServiceFeeDistributor), but FullDeploy only WIRES a pre-existing address — it never deploys or configures one, and base-mainnet.json left it unset, so the protocol launches on the raw-token-amount fallback. That's intentional at genesis (exposure-weighted rail dormant, stakersBps=0), but there was no scripted/runbooked path to turn USD normalization on. - script/ConfigureOracle.s.sol: config-driven (reads the `oracle` block of FULL_DEPLOY_CONFIG, mirroring FullDeploy/DeployGovernance conventions). Deploys a ChainlinkOracle or UniswapV3Oracle, configures every feed/pool + maxAge + the L2 sequencer-uptime gate, optionally wires Tangle + ServiceFeeDistributor (setPriceOracle, bootstrap window only), and hands the oracle's Ownable ownership to the timelock/multisig as the final step. Production guard (bypass with TANGLE_DEPLOY_LOCAL=1) requires owner set, maxAge set, >=1 feed/pool, and the sequencer feed on Base/OP/Arbitrum. Writes a manifest; prints the governance setPriceOracle calls when wire=false. - deploy/RUNBOOK-launch.md §3c: oracle bring-up procedure + bootstrap-vs-governance wiring + the stakersBps flip. - deploy/config/base-mainnet.json: self-documenting `oracle` block (deploy=false at genesis; Base sequencer feed pre-filled; TODOs for feeds/owner). No src changes. Script compiles and dry-runs end-to-end (deploy + configure + manifest); base-mainnet.json validated.
tangletools
approved these changes
Jun 20, 2026
tangletools
left a comment
Contributor
There was a problem hiding this comment.
✅ Auto-approved PR — a833a702
Blanket team auto-approval is enabled for this reviewer service.
The full PR reviewer audit still runs separately and will publish findings if it detects issues.
tangletools · auto-approval · reason: blanket_auto_approve · 2026-06-20T05:15:23Z
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
Closes the ops/deploy gap behind the oracle audit fixes. The price oracle is real and consumed (
Tanglepayments/exposure +ServiceFeeDistributor), butFullDeployonly wires a pre-existing address — it never deploys or configures one, andbase-mainnet.jsonleft it unset. So the protocol launches on the raw-token-amount fallback (intentional at genesis: the exposure-weighted rail is dormant,incentives.weights.stakersBps = 0) with no scripted/runbooked path to turn USD normalization on. This adds that path. Nosrc/changes.What's here
script/ConfigureOracle.s.sol— config-driven (reads theoracleblock ofFULL_DEPLOY_CONFIG, same convention asFullDeploy/DeployGovernance):ChainlinkOracleorUniswapV3Oracle,maxAge+ the L2 sequencer-uptime gate,Tangle+ServiceFeeDistributorviasetPriceOracle(bootstrap window only — needs ADMIN_ROLE),Ownableownership to the timelock/multisig as the final step,TANGLE_DEPLOY_LOCAL=1): requiresownerset,maxAgeset, ≥1 feed/pool, and the sequencer feed on Base/OP/Arbitrum,setPriceOraclecalls whenwire=false.deploy/RUNBOOK-launch.md§3c — oracle bring-up procedure: bootstrap-vs-governance wiring, required prod params, and thestakersBpsflip to actually activate the rail.deploy/config/base-mainnet.json— self-documentingoracleblock:deploy=falseat genesis, Base sequencer feed pre-filled, TODOs for feeds/owner.Verification
base-mainnet.jsonvalidated as JSON.main, clean merge.Usage: