diff --git a/onchain/src/Optimizer.sol b/onchain/src/Optimizer.sol index c7f721d..fe7687b 100644 --- a/onchain/src/Optimizer.sol +++ b/onchain/src/Optimizer.sol @@ -245,6 +245,7 @@ contract Optimizer is Initializable, UUPSUpgradeable { function calculateParams(OptimizerInput[8] memory inputs) public pure + virtual returns (uint256 capitalInefficiency, uint256 anchorShare, uint24 anchorWidth, uint256 discoveryDepth) { // Extract slots 0 and 1 (shift=0 assumed — mantissa IS the value) diff --git a/onchain/src/OptimizerV3.sol b/onchain/src/OptimizerV3.sol new file mode 100644 index 0000000..68b2d24 --- /dev/null +++ b/onchain/src/OptimizerV3.sol @@ -0,0 +1,341 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity ^0.8.19; + +import {Optimizer} from "./Optimizer.sol"; +import {OptimizerInput} from "./IOptimizer.sol"; + +/** + * @title OptimizerV3 + * @notice UUPS-upgradeable Optimizer whose calculateParams is overridden by + * the Push3 transpiler output. The body below is a verbatim copy of + * OptimizerV3Push3.calculateParams — kept in sync by the deploy pipeline + * (transpile → overwrite this file → compile → upgrade). + * + * @dev No new storage slots. Only overrides the pure calculateParams function. + * Register-to-output mapping must match OptimizerV3Push3 exactly: + * r40 → ci, r39 → anchorShare, r38 → anchorWidth, r37 → discoveryDepth + */ +contract OptimizerV3 is Optimizer { + function calculateParams(OptimizerInput[8] memory inputs) + public + pure + override + returns (uint256 ci, uint256 anchorShare, uint24 anchorWidth, uint256 discoveryDepth) + { + // ── BEGIN TRANSPILER OUTPUT (optimizer_v3.push3) ── + // Do NOT edit by hand — regenerate via: npx tsx tools/push3-transpiler/transpile-cli.ts + + uint256 percentagestaked = uint256(uint256(inputs[0].mantissa)); + uint256 taxrate = uint256(uint256(inputs[1].mantissa)); + uint256 staked = uint256(((percentagestaked * 100) / 1000000000000000000)); + + uint256 r37; + uint256 r38; + uint256 r39; + uint256 r40; + + if ((staked > 91)) { + uint256 deltas = uint256((100 - staked)); + uint256 r0; + if ((taxrate <= 206185567010309)) { + r0 = 0; + } else { + uint256 r1; + if ((taxrate <= 412371134020618)) { + r1 = 1; + } else { + uint256 r2; + if ((taxrate <= 618556701030927)) { + r2 = 2; + } else { + uint256 r3; + if ((taxrate <= 1030927835051546)) { + r3 = 3; + } else { + uint256 r4; + if ((taxrate <= 1546391752577319)) { + r4 = 4; + } else { + uint256 r5; + if ((taxrate <= 2164948453608247)) { + r5 = 5; + } else { + uint256 r6; + if ((taxrate <= 2783505154639175)) { + r6 = 6; + } else { + uint256 r7; + if ((taxrate <= 3608247422680412)) { + r7 = 7; + } else { + uint256 r8; + if ((taxrate <= 4639175257731958)) { + r8 = 8; + } else { + uint256 r9; + if ((taxrate <= 5670103092783505)) { + r9 = 9; + } else { + uint256 r10; + if ((taxrate <= 7216494845360824)) { + r10 = 10; + } else { + uint256 r11; + if ((taxrate <= 9278350515463917)) { + r11 = 11; + } else { + uint256 r12; + if ((taxrate <= 11855670103092783)) { + r12 = 12; + } else { + uint256 r13; + if ((taxrate <= 15979381443298969)) { + r13 = 13; + } else { + uint256 r14; + if ((taxrate <= 22164948453608247)) { + r14 = 14; + } else { + uint256 r15; + if ((taxrate <= 29381443298969072)) { + r15 = 15; + } else { + uint256 r16; + if ((taxrate <= 38144329896907216)) { + r16 = 16; + } else { + uint256 r17; + if ((taxrate <= 49484536082474226)) { + r17 = 17; + } else { + uint256 r18; + if ((taxrate <= 63917525773195876)) + { + r18 = 18; + } else { + uint256 r19; + if ( + ( + taxrate + <= 83505154639175257 + ) + ) { + r19 = 19; + } else { + uint256 r20; + if ( + ( + taxrate + <= + 109278350515463917 + ) + ) { + r20 = 20; + } else { + uint256 r21; + if ( + ( + taxrate + <= + 144329896907216494 + ) + ) { + r21 = 21; + } else { + uint256 r22; + if ( + ( + taxrate + <= + 185567010309278350 + ) + ) { + r22 = 22; + } else { + uint256 r23; + if ( + ( + taxrate + <= + 237113402061855670 + ) + ) { + r23 = 23; + } else { + uint256 r24; + if ( + ( + taxrate + <= + 309278350515463917 + ) + ) { + r24 = 24; + } else { + uint256 + r25; + if ( + ( + taxrate + <= + 402061855670103092 + ) + ) { + r25 + = 25; + } else { + uint256 + r26; + if ( + ( + taxrate + <= + 520618556701030927 + ) + ) { + r26 + = + 26; + } + else + { + uint256 + r27; + if ( + ( + taxrate + <= + 680412371134020618 + ) + ) + { + r27 + = + 27; + } + else + { + uint256 + r28; + if ( + ( + taxrate + <= + 886597938144329896 + ) + ) + { + r28 + = + 28; + } + else + { + r28 + = + 29; + } + r27 + = + r28; + } + r26 + = + r27; + } + r25 + = + r26; + } + r24 = + r25; + } + r23 = r24; + } + r22 = r23; + } + r21 = r22; + } + r20 = r21; + } + r19 = r20; + } + r18 = r19; + } + r17 = r18; + } + r16 = r17; + } + r15 = r16; + } + r14 = r15; + } + r13 = r14; + } + r12 = r13; + } + r11 = r12; + } + r10 = r11; + } + r9 = r10; + } + r8 = r9; + } + r7 = r8; + } + r6 = r7; + } + r5 = r6; + } + r4 = r5; + } + r3 = r4; + } + r2 = r3; + } + r1 = r2; + } + r0 = r1; + } + + uint256 dup29 = r0; + uint256 r32; + if ((dup29 >= 14)) { + uint256 dup30 = uint256((dup29 + 1)); + if ((dup30 > 29)) { + r32 = 29; + } else { + r32 = dup30; + } + } else { + r32 = dup29; + } + uint256 effidx = r32; + + if ((((((deltas * deltas) * deltas) * effidx) / 20) < 50)) { + r37 = uint256(1000000000000000000); + r38 = uint256(20); + r39 = uint256(1000000000000000000); + r40 = uint256(0); + } else { + r37 = uint256(300000000000000000); + r38 = uint256(100); + r39 = uint256(300000000000000000); + r40 = uint256(0); + } + } else { + r37 = uint256(300000000000000000); + r38 = uint256(100); + r39 = uint256(300000000000000000); + r40 = uint256(0); + } + + // Register-to-output mapping (matches OptimizerV3Push3 exactly) + ci = uint256(r40); + anchorShare = uint256(r39); + anchorWidth = uint24(r38); + discoveryDepth = uint256(r37); + // ── END TRANSPILER OUTPUT ── + } +} diff --git a/tools/deploy-optimizer.sh b/tools/deploy-optimizer.sh index e932b6d..2ba9874 100755 --- a/tools/deploy-optimizer.sh +++ b/tools/deploy-optimizer.sh @@ -19,6 +19,9 @@ set -euo pipefail +# Foundry tools (forge, cast, anvil) +export PATH="${HOME}/.foundry/bin:${PATH}" + # --------------------------------------------------------------------------- # Paths # --------------------------------------------------------------------------- @@ -269,7 +272,7 @@ step "Deploying new Optimizer implementation for diff preview" ( cd "$ONCHAIN_DIR" - forge create src/Optimizer.sol:Optimizer \ + forge create src/OptimizerV3.sol:OptimizerV3 \ --rpc-url "$RPC_URL" \ --private-key "$DEPLOYER_KEY" \ --json 2>/dev/null \ @@ -278,7 +281,7 @@ step "Deploying new Optimizer implementation for diff preview" ) NEW_IMPL="$(cat /tmp/new-optimizer-impl.txt 2>/dev/null || echo "")" -[ -z "$NEW_IMPL" ] && fail "Failed to deploy new Optimizer implementation" +[ -z "$NEW_IMPL" ] && fail "Failed to deploy new OptimizerV3 implementation" info "New implementation deployed at: $NEW_IMPL" # calculateSentiment is pure — callable on bare (uninitialized) implementation diff --git a/tools/push3-evolution/evolve.sh b/tools/push3-evolution/evolve.sh index 4851178..a502fc5 100755 --- a/tools/push3-evolution/evolve.sh +++ b/tools/push3-evolution/evolve.sh @@ -39,6 +39,9 @@ set -euo pipefail +# Foundry tools (forge, cast, anvil) +export PATH="${HOME}/.foundry/bin:${PATH}" + SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" FITNESS_SH="$SCRIPT_DIR/fitness.sh" MUTATE_CLI="$SCRIPT_DIR/mutate-cli.ts" diff --git a/tools/push3-evolution/fitness.sh b/tools/push3-evolution/fitness.sh index ec5fb48..be5a3c0 100755 --- a/tools/push3-evolution/fitness.sh +++ b/tools/push3-evolution/fitness.sh @@ -24,6 +24,9 @@ set -euo pipefail +# Foundry tools (forge, cast, anvil) +export PATH="${HOME}/.foundry/bin:${PATH}" + SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" ONCHAIN_DIR="$REPO_ROOT/onchain"