From 85350caf52866ba1e2aab0f213257aa3da404cf9 Mon Sep 17 00:00:00 2001 From: openhands Date: Fri, 13 Feb 2026 18:21:18 +0000 Subject: [PATCH] feat: OptimizerV3 with direct 2D staking-to-LP parameter mapping MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Core protocol changes for launch readiness: - OptimizerV3: binary bear/bull mapping from (staking%, avgTax) — avoids exploitable AW 30-90 kill zone. Bear: AS=30%, AW=100, CI=0, DD=0.3e18. Bull: AS=100%, AW=20, CI=0, DD=1e18. UUPS upgradeable with __gap[48]. - Directional VWAP: only records prices on ETH inflow (buys), preventing sell-side dilution of price memory - Floor formula: unified max(scarcity, mirror, clamp) — VWAP mirror uses distance from adjusted VWAP as floor distance, no branching - PriceOracle (M-1 fix): correct fallback TWAP divisor (60000s, not 300s) - Access control (M-2 fix): deployer-only guard on one-time setters - Recenter rate limit (M-3 fix): 60-second cooldown for open recenters - Safe fallback params: recenter() optimizer-failure defaults changed from exploitable CI=50%/AW=50 to safe bear-mode CI=0/AW=100 - Recentered event for monitoring and indexing - VERSION bump to 2, kraiken-lib COMPATIBLE_CONTRACT_VERSIONS updated Co-Authored-By: Claude Opus 4.6 --- .claude-code-supervisor.yml | 26 + .claude/hooks/supervisor/lib.sh | 139 ++ .claude/hooks/supervisor/on-error.sh | 40 + .claude/hooks/supervisor/on-notify.sh | 44 + .claude/hooks/supervisor/on-stop.sh | 71 + .claude/hooks/supervisor/triage.sh | 72 + .claude/settings.json | 37 + .husky/pre-commit | 5 +- TECHNICAL_APPENDIX.md | 49 +- docs/DEPLOYMENT_RUNBOOK.md | 306 ++++ kraiken-lib/src/version.ts | 5 +- landing/src/views/docs/AiAgent.vue | 71 +- landing/src/views/docs/FaqDocs.vue | 7 +- landing/src/views/docs/HarbergerTax.vue | 8 +- landing/src/views/docs/HoldersDocs.vue | 18 +- .../src/views/docs/LiquidityManagement.vue | 23 +- landing/src/views/docs/StakingDocs.vue | 4 +- onchain/src/Kraiken.sol | 11 +- onchain/src/LiquidityManager.sol | 100 +- onchain/src/OptimizerV2.sol | 131 ++ onchain/src/OptimizerV3.sol | 191 +++ onchain/src/VWAPTracker.sol | 3 +- onchain/src/abstracts/PriceOracle.sol | 5 +- .../src/abstracts/ThreePositionStrategy.sol | 96 +- onchain/src/libraries/UniswapMath.sol | 9 +- onchain/test/EthScarcityAbundance.t.sol | 480 ++++++ onchain/test/FuzzingAnalyzerBugs.t.sol | 1317 +++++++++++++++++ onchain/test/OptimizerV3.t.sol | 232 +++ onchain/test/abstracts/PriceOracle.t.sol | 81 +- .../abstracts/ThreePositionStrategy.t.sol | 73 +- onchain/test/helpers/TestBase.sol | 4 +- scripts/bootstrap-common.sh | 4 +- services/ponder/abis/Kraiken.json | 2 +- services/ponder/abis/Stake.json | 2 +- tests/e2e/02-max-stake-all-tax-rates.spec.ts | 1 + tests/e2e/04-recenter-positions.spec.ts | 153 ++ tests/e2e/05-optimizer-integration.spec.ts | 177 +++ tests/setup/stack.ts | 1 + 38 files changed, 3793 insertions(+), 205 deletions(-) create mode 100644 .claude-code-supervisor.yml create mode 100755 .claude/hooks/supervisor/lib.sh create mode 100755 .claude/hooks/supervisor/on-error.sh create mode 100755 .claude/hooks/supervisor/on-notify.sh create mode 100755 .claude/hooks/supervisor/on-stop.sh create mode 100755 .claude/hooks/supervisor/triage.sh create mode 100644 .claude/settings.json create mode 100644 docs/DEPLOYMENT_RUNBOOK.md create mode 100644 onchain/src/OptimizerV2.sol create mode 100644 onchain/src/OptimizerV3.sol create mode 100644 onchain/test/EthScarcityAbundance.t.sol create mode 100644 onchain/test/FuzzingAnalyzerBugs.t.sol create mode 100644 onchain/test/OptimizerV3.t.sol create mode 100644 tests/e2e/04-recenter-positions.spec.ts create mode 100644 tests/e2e/05-optimizer-integration.spec.ts diff --git a/.claude-code-supervisor.yml b/.claude-code-supervisor.yml new file mode 100644 index 0000000..0328145 --- /dev/null +++ b/.claude-code-supervisor.yml @@ -0,0 +1,26 @@ +# Claude Code Supervisor configuration +# Copy to ~/.config/claude-code-supervisor/config.yml +# or .claude-code-supervisor.yml in your project root. + +triage: + # Command that accepts a prompt on stdin and returns text on stdout. + # Default: claude -p (uses Claude Code's own auth) + command: "claude -p --no-session-persistence" + model: "claude-haiku-4-20250414" + max_tokens: 150 + +notify: + # Command that receives a JSON string as its last argument. + # Called when triage determines action is needed. + # Examples: + # openclaw: openclaw gateway call wake --params + # ntfy: curl -s -X POST https://ntfy.sh/my-topic -d + # webhook: curl -s -X POST https://example.com/hook -H 'Content-Type: application/json' -d + # script: /path/to/my-notify.sh + command: "openclaw gateway call wake --params" + +# Quiet hours — suppress non-urgent escalations +quiet_hours: + start: "23:00" + end: "08:00" + timezone: "Europe/Berlin" diff --git a/.claude/hooks/supervisor/lib.sh b/.claude/hooks/supervisor/lib.sh new file mode 100755 index 0000000..68d3892 --- /dev/null +++ b/.claude/hooks/supervisor/lib.sh @@ -0,0 +1,139 @@ +#!/bin/bash +# Shared functions for claude-code-supervisor hooks and scripts. + +set -euo pipefail + +# Find config file: project .claude-code-supervisor.yml → ~/.config/ → defaults +ccs_find_config() { + local cwd="${1:-.}" + if [ -f "$cwd/.claude-code-supervisor.yml" ]; then + echo "$cwd/.claude-code-supervisor.yml" + elif [ -f "${HOME}/.config/claude-code-supervisor/config.yml" ]; then + echo "${HOME}/.config/claude-code-supervisor/config.yml" + else + echo "" + fi +} + +# Read a yaml value (simple key.subkey extraction, no yq dependency). +# Falls back to default if not found. +ccs_config_get() { + local config_file="$1" + local key="$2" + local default="${3:-}" + + if [ -z "$config_file" ] || [ ! -f "$config_file" ]; then + echo "$default" + return + fi + + # Simple grep-based yaml extraction (handles key: value on one line) + local value + case "$key" in + triage.command) value=$(grep -A0 '^\s*command:' "$config_file" | head -1 | sed 's/.*command:\s*["]*//;s/["]*$//' | xargs) ;; + triage.model) value=$(awk '/^triage:/,/^[a-z]/' "$config_file" | grep 'model:' | head -1 | sed 's/.*model:\s*["]*//;s/["]*$//' | xargs) ;; + triage.max_tokens) value=$(awk '/^triage:/,/^[a-z]/' "$config_file" | grep 'max_tokens:' | head -1 | sed 's/.*max_tokens:\s*//' | xargs) ;; + notify.command) value=$(awk '/^notify:/,/^[a-z]/' "$config_file" | grep 'command:' | head -1 | sed 's/.*command:\s*["]*//;s/["]*$//' | xargs) ;; + idle.timeout) value=$(awk '/^idle:/,/^[a-z]/' "$config_file" | grep 'timeout_seconds:' | head -1 | sed 's/.*timeout_seconds:\s*//' | xargs) ;; + idle.nudge_message) value=$(awk '/^idle:/,/^[a-z]/' "$config_file" | grep 'nudge_message:' | head -1 | sed 's/.*nudge_message:\s*["]*//;s/["]*$//' | xargs) ;; + *) value="" ;; + esac + + echo "${value:-$default}" +} + +# Send a notification via the configured notify command. +ccs_notify() { + local config_file="$1" + local message="$2" + + local notify_cmd + notify_cmd=$(ccs_config_get "$config_file" "notify.command" "openclaw gateway call wake --params") + + # Build JSON payload + local payload + payload=$(jq -n --arg text "$message" --arg mode "now" '{text: $text, mode: $mode}') + + $notify_cmd "$payload" 2>/dev/null || true +} + +# Run LLM triage via configured command. +# Accepts prompt on stdin, returns verdict on stdout. +ccs_triage() { + local config_file="$1" + local prompt="$2" + + local triage_cmd model max_tokens + triage_cmd=$(ccs_config_get "$config_file" "triage.command" "claude -p --no-session-persistence") + model=$(ccs_config_get "$config_file" "triage.model" "claude-haiku-4-20250414") + max_tokens=$(ccs_config_get "$config_file" "triage.max_tokens" "150") + + echo "$prompt" | $triage_cmd --model "$model" --max-tokens "$max_tokens" 2>/dev/null +} + +# Generate a notify wrapper script the agent can call on completion. +# Usage: ccs_generate_notify_script "$config_file" ["/tmp/supervisor-notify.sh"] +ccs_generate_notify_script() { + local config_file="$1" + local script_path="${2:-/tmp/supervisor-notify.sh}" + local notify_cmd + notify_cmd=$(ccs_config_get "$config_file" "notify.command" "openclaw gateway call wake --params") + + cat > "$script_path" <