- Optimizer: add `is IOptimizer` and mark getLiquidityParams() with `override`, making the interface conformance explicit at the base level. OptimizerV3 inherits it transitively via Optimizer. - OptimizerV3Push3: add `is IOptimizer` and implement getLiquidityParams() that calls calculateParams() with zeroed inputs, returning bear-mode defaults (ci=0, anchorShare=0.3e18, anchorWidth=100, discoveryDepth=0.3e18). Behaviour is identical to the previous try/catch fallback used by LiquidityManager and the backtesting deployer. - Update backtesting comments to reflect that getLiquidityParams() now exists on OptimizerV3Push3 (returns bear defaults via zeroed inputs). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
341 lines
27 KiB
Solidity
341 lines
27 KiB
Solidity
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
pragma solidity ^0.8.19;
|
|
|
|
import {Optimizer} from "./Optimizer.sol";
|
|
import {IOptimizer, 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 ──
|
|
}
|
|
}
|