;; OptimizerV3 in Push3 ;; ;; Computes isBullMarket(percentageStaked_1e18, averageTaxRate_1e18) ;; ;; Inputs on DYADIC stack (top to bottom when called): ;; top: percentageStaked (0 to 1e18, where 1e18 = 100%) ;; below: averageTaxRate (0 to 1e18, normalized from Stake contract) ;; ;; Output on BOOLEAN stack: ;; top: TRUE if bull market, FALSE if bear market ;; ;; Logic mirrors OptimizerV3.isBullMarket: ;; stakedPct = percentageStaked * 100 / 1e18 (0-100) ;; if stakedPct <= 91 → FALSE (always bear) ;; deltaS = 100 - stakedPct ;; effIdx = _taxRateToEffectiveIndex(averageTaxRate) (0-29, with +1 shift at >=14) ;; penalty = deltaS^3 * effIdx / 20 ;; return penalty < 50 ( ;; Step 1: Bind inputs to names. ;; Stack on entry: [percentageStaked_1e18 (top), averageTaxRate_1e18 (below)] DYADIC.SWAP ;; Stack: [averageTaxRate_1e18 (top), percentageStaked_1e18 (below)] TAXRATE DYADIC.DEFINE ;; Stack: [percentageStaked_1e18] ;; Step 2: Compute stakedPct = percentageStaked * 100 / 1e18 (integer 0..100) 100 DYADIC.* 1000000000000000000 DYADIC./ ;; Stack: [stakedPct] STAKED DYADIC.DEFINE ;; Stack: [] ;; Step 3: Main conditional — stakedPct > 91? STAKED 91 DYADIC.> ;; bool_stack: [stakedPct > 91] EXEC.IF ;; TRUE branch: stakedPct > 91 — compute penalty ( ;; deltaS = 100 - stakedPct 100 STAKED DYADIC.- ;; Stack: [deltaS] DELTAS DYADIC.DEFINE ;; Stack: [] ;; Compute raw tax index via 30-way threshold lookup. ;; Each level: if TAXRATE <= threshold then push index, else go deeper. TAXRATE 206185567010309 DYADIC.<= EXEC.IF 0 ( TAXRATE 412371134020618 DYADIC.<= EXEC.IF 1 ( TAXRATE 618556701030927 DYADIC.<= EXEC.IF 2 ( TAXRATE 1030927835051546 DYADIC.<= EXEC.IF 3 ( TAXRATE 1546391752577319 DYADIC.<= EXEC.IF 4 ( TAXRATE 2164948453608247 DYADIC.<= EXEC.IF 5 ( TAXRATE 2783505154639175 DYADIC.<= EXEC.IF 6 ( TAXRATE 3608247422680412 DYADIC.<= EXEC.IF 7 ( TAXRATE 4639175257731958 DYADIC.<= EXEC.IF 8 ( TAXRATE 5670103092783505 DYADIC.<= EXEC.IF 9 ( TAXRATE 7216494845360824 DYADIC.<= EXEC.IF 10 ( TAXRATE 9278350515463917 DYADIC.<= EXEC.IF 11 ( TAXRATE 11855670103092783 DYADIC.<= EXEC.IF 12 ( TAXRATE 15979381443298969 DYADIC.<= EXEC.IF 13 ( TAXRATE 22164948453608247 DYADIC.<= EXEC.IF 14 ( TAXRATE 29381443298969072 DYADIC.<= EXEC.IF 15 ( TAXRATE 38144329896907216 DYADIC.<= EXEC.IF 16 ( TAXRATE 49484536082474226 DYADIC.<= EXEC.IF 17 ( TAXRATE 63917525773195876 DYADIC.<= EXEC.IF 18 ( TAXRATE 83505154639175257 DYADIC.<= EXEC.IF 19 ( TAXRATE 109278350515463917 DYADIC.<= EXEC.IF 20 ( TAXRATE 144329896907216494 DYADIC.<= EXEC.IF 21 ( TAXRATE 185567010309278350 DYADIC.<= EXEC.IF 22 ( TAXRATE 237113402061855670 DYADIC.<= EXEC.IF 23 ( TAXRATE 309278350515463917 DYADIC.<= EXEC.IF 24 ( TAXRATE 402061855670103092 DYADIC.<= EXEC.IF 25 ( TAXRATE 520618556701030927 DYADIC.<= EXEC.IF 26 ( TAXRATE 680412371134020618 DYADIC.<= EXEC.IF 27 ( TAXRATE 886597938144329896 DYADIC.<= EXEC.IF 28 29 ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ;; Stack: [raw_idx (0-29)] ;; Apply effIdx shift: if raw_idx >= 14, effIdx = min(raw_idx + 1, 29) DYADIC.DUP 14 DYADIC.>= EXEC.IF ( 1 DYADIC.+ DYADIC.DUP 29 DYADIC.> EXEC.IF ( DYADIC.POP 29 ) ( ) ) ( ) ;; Stack: [effIdx (0-29)] EFFIDX DYADIC.DEFINE ;; Stack: [] ;; Compute penalty = deltaS^3 * effIdx / 20 DELTAS DELTAS DYADIC.* DELTAS DYADIC.* EFFIDX DYADIC.* 20 DYADIC./ ;; Stack: [penalty] ;; Return penalty < 50 50 DYADIC.< ;; bool_stack: [penalty < 50] ) ;; FALSE branch: stakedPct <= 91 — always bear ( FALSE ) )