201 lines
10 KiB
Text
201 lines
10 KiB
Text
;; 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
|
|
)
|
|
)
|