{"item":"later","batch":"e08-protect-hinge","code":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {AMMStrategyBase} from \"./AMMStrategyBase.sol\";\nimport {TradeInfo} from \"./IAMMStrategy.sol\";\n\ncontract Strategy is AMMStrategyBase {\n    uint256 constant ELAPSED_CAP = 8;\n    uint256 constant SIGNAL_THRESHOLD = WAD / 650;\n    uint256 constant DIR_DECAY = 750000000000000000;\n    uint256 constant ACT_DECAY = 530000000000000000;\n    uint256 constant SIZE_DECAY = 530000000000000000;\n    uint256 constant TOX_DECAY = 910000000000000000;\n    uint256 constant SIGMA_DECAY = 690000000000000000;\n    uint256 constant LAMBDA_DECAY = 990000000000000000;\n    uint256 constant SIZE_BLEND_DECAY = 828000000000000000;\n    uint256 constant TOX_BLEND_DECAY = 51000000000000000;\n    uint256 constant ACT_BLEND_DECAY = 985000000000000000;\n    uint256 constant PHAT_ALPHA = 270000000000000000;\n    uint256 constant PHAT_ALPHA_RETAIL = 60000000000000000;\n    uint256 constant PHAT_ALPHA_SAME = 120000000000000000;\n    uint256 constant REVERT_U = 0;\n    uint256 constant DIR_IMPACT_MULT = 4;\n    uint256 constant GATE_SIGMA_MULT = 7200000000000000000;\n    uint256 constant MIN_GATE = 30000000000000000;\n    uint256 constant TRADE_TOX_BOOST = 3500 * BPS;\n    uint256 constant STALE_ATTRACT_FRAC = 1050000000000000000;\n    uint256 constant RET_CAP = WAD / 35;\n    uint256 constant TOX_CAP = WAD / 5;\n    uint256 constant TRADE_RATIO_CAP = WAD / 5;\n    uint256 constant LAMBDA_CAP = 1820000000000000000;\n    uint256 constant STEP_COUNT_CAP = 64;\n    uint256 constant BASE_FEE = 4 * BPS;\n    uint256 constant SIGMA_COEF = 200000000000000000;\n    uint256 constant LAMBDA_COEF = 12 * BPS;\n    uint256 constant FLOW_SIZE_COEF = 4842 * BPS;\n    uint256 constant TOX_COEF = 300 * BPS;\n    uint256 constant TOX_QUAD_COEF = 15000 * BPS;\n    uint256 constant ACT_COEF = 91843 * BPS;\n    uint256 constant DIR_COEF = 20 * BPS;\n    uint256 constant DIR_TOX_COEF = 100 * BPS;\n    uint256 constant STALE_DIR_COEF = 6850 * BPS;\n    uint256 constant SIGMA_TOX_COEF = 500 * BPS;\n    uint256 constant TAIL_KNEE = 600 * BPS;\n    uint256 constant TAIL_SLOPE_PROTECT = 930000000000000000;\n    uint256 constant TAIL_SLOPE_ATTRACT = 850000000000000000;\n\n    function afterInitialize(uint256 initialX, uint256 initialY) external override returns (uint256, uint256) {\n        slots[0] = BASE_FEE; slots[1] = BASE_FEE; slots[3] = WAD; \n        slots[5] = initialX > 0 ? wdiv(initialY, initialX) : 100 * WAD;\n        slots[6] = 950000000000000; slots[7] = 800000000000000000; slots[8] = 2000000000000000;\n        slots[13] = 902500000000; slots[14] = slots[5]; \n        return (BASE_FEE, BASE_FEE);\n    }\n\n    function afterSwap(TradeInfo calldata trade) external override returns (uint256, uint256) {\n        uint256 prevBidFee = slots[0]; uint256 prevAskFee = slots[1]; uint256 lastTs = uint64(slots[2]);\n        uint256 dirState = slots[3]; uint256 actEma = slots[4]; uint256 pHat = slots[5];\n        uint256 sigmaHat = slots[6]; uint256 lambdaHat = slots[7]; uint256 sizeHat = slots[8];\n        uint256 toxEma = slots[9]; uint256 stepTradeCount = slots[10];\n\n        uint256 sigmaForFast = sigmaHat;\n        uint256 fastHat = slots[14];\n        uint256 uncertainty = slots[13];\n        uint256 silent = trade.timestamp > lastTs ? trade.timestamp - lastTs : 0;\n        bool isNewStep = trade.timestamp > lastTs;\n        if (isNewStep) {\n            uint256 elapsedRaw = trade.timestamp - lastTs;\n            uint256 elapsed = elapsedRaw > ELAPSED_CAP ? ELAPSED_CAP : elapsedRaw;\n            dirState = _decayCentered(dirState, DIR_DECAY, elapsed);\n            actEma = wmul(actEma, _powWad(ACT_DECAY, elapsed));\n            sizeHat = wmul(sizeHat, _powWad(SIZE_DECAY, elapsed));\n            toxEma = wmul(toxEma, _powWad(TOX_DECAY, elapsed));\n            if (stepTradeCount > 0 && elapsedRaw > 0) {\n                uint256 lambdaInst = (stepTradeCount * WAD) / elapsedRaw;\n                if (lambdaInst > LAMBDA_CAP) lambdaInst = LAMBDA_CAP;\n                lambdaHat = wmul(lambdaHat, LAMBDA_DECAY) + wmul(lambdaInst, WAD - LAMBDA_DECAY);\n            }\n            uncertainty += wmul(sigmaForFast, sigmaForFast) * elapsedRaw;\n            if (uncertainty > 100000000000000) uncertainty = 100000000000000;\n            stepTradeCount = 0;\n        }\n\n        bool firstInStep = stepTradeCount == 0;\n        uint256 spot = trade.reserveX > 0 ? wdiv(trade.reserveY, trade.reserveX) : pHat;\n        if (pHat == 0) pHat = spot;\n\n        uint256 feeUsed = trade.isBuy ? prevBidFee : prevAskFee;\n        uint256 gamma = feeUsed < WAD ? WAD - feeUsed : 0;\n        uint256 pImplied;\n        if (gamma == 0) { pImplied = spot; }\n        else { pImplied = trade.isBuy ? wmul(spot, gamma) : wdiv(spot, gamma); }\n\n        // S: infer a no-trade interval center from the last post-trade spot.\n        uint256 silenceScale = WAD;\n        if (firstInStep && silent > 1) {\n            uint256 g = silent - 1;\n            if (g > 1) g = 1;\n            uint256 w = WAD - _powWad(800000000000000000, g);\n            uint256 s = slots[2] >> 64;\n            if (s == 0) s = pHat;\n            uint256 c = (wmul(s, WAD - prevBidFee) + wdiv(s, WAD - prevAskFee)) / 2;\n            if (c >= pHat) pHat += wmul(w, c - pHat);\n            else pHat -= wmul(w, pHat - c);\n            silenceScale = WAD - wmul(300000000000000000, w);\n        }\n\n        {\n            uint256 ret = pHat > 0 ? wdiv(absDiff(pImplied, pHat), pHat) : 0;\n            uint256 alpha = firstInStep ? PHAT_ALPHA : PHAT_ALPHA_RETAIL;\n            uint256 prePhat = pHat;\n            bool secondPrint = !firstInStep && stepTradeCount == 1;\n            bool sameDir = false; bool oppDir = false;\n            if (secondPrint) {\n                bool up2 = pImplied >= pHat;\n                uint256 d1 = slots[12];\n                if (d1 != 0) { sameDir = (d1 == 1) == up2; oppDir = !sameDir; }\n                if (sameDir) alpha = PHAT_ALPHA_SAME;\n            }\n            if (firstInStep) { slots[12] = pImplied >= pHat ? 1 : 2; }\n            uint256 adaptiveGate = wmul(sigmaHat, GATE_SIGMA_MULT);\n            if (adaptiveGate < MIN_GATE) adaptiveGate = MIN_GATE;\n            alpha = wmul(alpha, silenceScale);\n            adaptiveGate = wmul(adaptiveGate, silenceScale);\n            if (ret <= adaptiveGate) { pHat = wmul(pHat, WAD - alpha) + wmul(pImplied, alpha); }\n            if (oppDir && REVERT_U > 0) {\n                uint256 pre = slots[11];\n                if (pre > pHat) pHat = pHat + wmul(pre - pHat, REVERT_U);\n                else pHat = pHat - wmul(pHat - pre, REVERT_U);\n            }\n            if (firstInStep) {\n                if (ret > RET_CAP) ret = RET_CAP;\n                sigmaHat = wmul(sigmaHat, SIGMA_DECAY) + wmul(ret, WAD - SIGMA_DECAY);\n            }\n        }\n\n        // Interior retail routing equalizes fee-adjusted marginal prices.\n        // Subsequent trades in a step cannot be the initial arbitrage trade.\n        if (!firstInStep && feeUsed > 30 * BPS && gamma > 0) {\n            uint256 normalSpot = trade.isBuy\n                ? wdiv(wmul(spot, gamma), WAD - 30 * BPS)\n                : wdiv(wmul(spot, WAD - 30 * BPS), gamma);\n            pHat = wmul(pHat, 90 * WAD / 100) + wmul(normalSpot, 10 * WAD / 100);\n        }\n\n        {\n            uint256 ret = fastHat > 0 ? wdiv(absDiff(pImplied, fastHat), fastHat) : 0;\n            uint256 alpha;\n            if (firstInStep) {\n                uint256 processSigma = sigmaForFast;\n                uint256 obsVar = uncertainty + wmul(processSigma, processSigma);\n                uint256 probArb;\n                uint256 z2 = wdiv(wmul(ret, ret), obsVar);\n                uint256 density = _powWad(wdiv(WAD, WAD + z2 / 16), 8);\n                uint256 sigmaObs = _isqrt(obsVar * WAD);\n                uint256 odds = wmul(density, wdiv(6700000000000000, sigmaObs));\n                bool arbFlag = ret <= wmul(sigmaForFast, 1220000000000000000);\n                uint256 prior = arbFlag ? 650000000000000000 : 400000000000000000;\n                uint256 tr = trade.reserveY > 0 ? wdiv(trade.amountY, trade.reserveY) : 0;\n                if (tr > 3000000000000000) prior = wmul(prior, 6 * WAD / 10);\n                if (silent > 1) prior = wmul(prior, 8 * WAD / 10);\n                odds = wmul(odds, wdiv(prior, WAD - prior));\n                probArb = wdiv(odds, WAD + odds);\n                alpha = wmul(probArb, 600000000000000000) + wmul(WAD - probArb, 80000000000000000);\n                slots[15] = pImplied >= fastHat ? 1 : 2;\n                uncertainty = wmul(uncertainty, WAD - alpha);\n            } else {\n                if ((slots[15] == 1) == (pImplied >= fastHat)) alpha = PHAT_ALPHA_RETAIL;\n            }\n            uint256 gate = wmul(sigmaHat, GATE_SIGMA_MULT);\n            if (gate < MIN_GATE) gate = MIN_GATE;\n            if (ret <= gate) fastHat = wmul(fastHat, WAD - alpha) + wmul(pImplied, alpha);\n            slots[13] = uncertainty;\n        }\n\n        if (!firstInStep && feeUsed > 30 * BPS && gamma > 0) {\n            uint256 normalObs = trade.isBuy\n                ? wdiv(wmul(spot, gamma), WAD - 30 * BPS)\n                : wdiv(wmul(spot, WAD - 30 * BPS), gamma);\n            if ((slots[15] == 1) == (normalObs >= fastHat)) {\n                fastHat = wmul(fastHat, 9 * WAD / 10) + wmul(normalObs, WAD / 10);\n            }\n        }\n        slots[14] = fastHat;\n        uint256 tradeRatio = trade.reserveY > 0 ? wdiv(trade.amountY, trade.reserveY) : 0;\n        if (tradeRatio > TRADE_RATIO_CAP) tradeRatio = TRADE_RATIO_CAP;\n\n        if (tradeRatio > SIGNAL_THRESHOLD) {\n            uint256 push = tradeRatio * DIR_IMPACT_MULT;\n            if (push > WAD / 4) push = WAD / 4;\n            if (trade.isBuy) {\n                dirState = dirState + push;\n                if (dirState > 2 * WAD) dirState = 2 * WAD;\n            } else {\n                dirState = dirState > push ? dirState - push : 0;\n            }\n            actEma = wmul(actEma, ACT_BLEND_DECAY) + wmul(tradeRatio, WAD - ACT_BLEND_DECAY);\n            sizeHat = wmul(sizeHat, SIZE_BLEND_DECAY) + wmul(tradeRatio, WAD - SIZE_BLEND_DECAY);\n            if (sizeHat > WAD) sizeHat = WAD;\n        }\n\n        uint256 tox = pHat > 0 ? wdiv(absDiff(spot, pHat), pHat) : 0;\n        if (tox > TOX_CAP) tox = TOX_CAP;\n        toxEma = wmul(toxEma, TOX_BLEND_DECAY) + wmul(tox, WAD - TOX_BLEND_DECAY);\n        uint256 toxSignal = toxEma;\n\n        stepTradeCount = stepTradeCount + 1;\n        if (stepTradeCount > STEP_COUNT_CAP) stepTradeCount = STEP_COUNT_CAP;\n\n        uint256 flowSize = wmul(lambdaHat, sizeHat);\n        uint256 fBase = BASE_FEE + wmul(SIGMA_COEF, sigmaHat) + wmul(LAMBDA_COEF, lambdaHat) + wmul(FLOW_SIZE_COEF, flowSize);\n        uint256 fMid = fBase + wmul(TOX_COEF, toxSignal) + wmul(TOX_QUAD_COEF, wmul(toxSignal, toxSignal)) + wmul(ACT_COEF, actEma);\n        fMid = fMid + wmul(SIGMA_TOX_COEF, wmul(sigmaHat, toxSignal));\n\n        uint256 dirDev; bool sellPressure;\n        if (dirState >= WAD) { dirDev = dirState - WAD; sellPressure = true; }\n        else { dirDev = WAD - dirState; sellPressure = false; }\n\n        uint256 skew = wmul(DIR_COEF, dirDev) + wmul(DIR_TOX_COEF, wmul(dirDev, toxSignal));\n        uint256 bidFee; uint256 askFee;\n        if (sellPressure) {\n            bidFee = fMid + skew;\n            askFee = fMid > skew ? fMid - skew : 0;\n        } else {\n            askFee = fMid + skew;\n            bidFee = fMid > skew ? fMid - skew : 0;\n        }\n\n        {\n            uint256 staleHat = wmul(pHat, 700000000000000000) + wmul(fastHat, 300000000000000000);\n            uint256 staleTox = wdiv(absDiff(spot, staleHat), staleHat);\n            if (staleTox > TOX_CAP) staleTox = TOX_CAP;\n            uint256 staleShift = wmul(STALE_DIR_COEF, staleTox);\n            uint256 attractShift = wmul(staleShift, STALE_ATTRACT_FRAC);\n            if (!firstInStep) {\n                uint256 hingeK = 150 * BPS;\n                uint256 lower = staleTox < hingeK ? staleTox : hingeK;\n                uint256 upper = staleTox > hingeK ? staleTox - hingeK : 0;\n                staleShift = wmul(STALE_DIR_COEF, lower)\n                    + wmul(1500000000000000000, wmul(STALE_DIR_COEF, upper));\n            }\n            if (spot >= staleHat) {\n                bidFee = bidFee + staleShift;\n                askFee = askFee > attractShift ? askFee - attractShift : 0;\n            } else {\n                askFee = askFee + staleShift;\n                bidFee = bidFee > attractShift ? bidFee - attractShift : 0;\n            }\n        }\n\n        {\n            bool tradeAligned = (trade.isBuy && spot >= pHat) || (!trade.isBuy && spot < pHat);\n            if (tradeAligned) {\n                uint256 tradeBoost = wmul(TRADE_TOX_BOOST, tradeRatio);\n                if (trade.isBuy) { bidFee = bidFee + tradeBoost; }\n                else { askFee = askFee + tradeBoost; }\n            }\n        }\n\n        if (sellPressure) {\n            bidFee = clampFee(_compressTailWithSlope(bidFee, TAIL_SLOPE_PROTECT));\n            askFee = clampFee(_compressTailWithSlope(askFee, TAIL_SLOPE_ATTRACT));\n        } else {\n            askFee = clampFee(_compressTailWithSlope(askFee, TAIL_SLOPE_PROTECT));\n            bidFee = clampFee(_compressTailWithSlope(bidFee, TAIL_SLOPE_ATTRACT));\n        }\n\n        slots[0] = bidFee; slots[1] = askFee; slots[2] = (spot << 64) | trade.timestamp;\n        slots[3] = dirState; slots[4] = actEma; slots[5] = pHat;\n        slots[6] = sigmaHat; slots[7] = lambdaHat; slots[8] = sizeHat;\n        slots[9] = toxEma; slots[10] = stepTradeCount;\n\n        return (bidFee, askFee);\n    }\n\n    function _compressTailWithSlope(uint256 fee, uint256 slope) internal pure returns (uint256) {\n        if (fee <= TAIL_KNEE) return fee;\n        return TAIL_KNEE + wmul(fee - TAIL_KNEE, slope);\n    }\n\n    function _powWad(uint256 factor, uint256 exp) internal pure returns (uint256 result) {\n        result = WAD;\n        while (exp > 0) {\n            if (exp & 1 == 1) result = wmul(result, factor);\n            factor = wmul(factor, factor);\n            exp >>= 1;\n        }\n    }\n\n    function _decayCentered(uint256 centered, uint256 decayFactor, uint256 elapsed) internal pure returns (uint256) {\n        uint256 mul = _powWad(decayFactor, elapsed);\n        if (centered >= WAD) { return WAD + wmul(centered - WAD, mul); }\n        uint256 below = wmul(WAD - centered, mul);\n        return below < WAD ? WAD - below : 0;\n    }\n\n    // Floor square root: bit-length seed and seven Newton steps (all uint256).\n    function _isqrt(uint256 x) internal pure returns (uint256 r) {\n        if (x == 0) return 0;\n        unchecked {\n            uint256 y = x;\n            r = 1;\n            if (y >> 128 != 0) { y >>= 128; r <<= 64; }\n            if (y >> 64 != 0) { y >>= 64; r <<= 32; }\n            if (y >> 32 != 0) { y >>= 32; r <<= 16; }\n            if (y >> 16 != 0) { y >>= 16; r <<= 8; }\n            if (y >> 8 != 0) { y >>= 8; r <<= 4; }\n            if (y >> 4 != 0) { y >>= 4; r <<= 2; }\n            if (y >> 2 != 0) { r <<= 1; }\n            r = (r + x / r) >> 1;\n            r = (r + x / r) >> 1;\n            r = (r + x / r) >> 1;\n            r = (r + x / r) >> 1;\n            r = (r + x / r) >> 1;\n            r = (r + x / r) >> 1;\n            r = (r + x / r) >> 1;\n            uint256 t = x / r;\n            return r < t ? r : t;\n        }\n    }\n\n    function getName() external pure override returns (string memory) { return \"no_cubic\"; }\n}\n","sha256":"7bab67dc00e49940970b9f537ba56dded9fef23c5f52713dcc27044b6fd540b2","base_sha256":"610c1905e7dd5559b84e40a3b2d6f8e0b53a7b0ac7574ae33b6c1770a28367cb","v2_sha256":"28417e116f57f1029fdd1803832e852574902c1ae7253c05657f317db76da4ab","variant":{"id":"later_K150_m15","K_bps":150,"K_wad":"15000000000000000","m":1.5,"m_wad":"1500000000000000000"},"outcome":"All four hinges underperformed V2 in screening. The best valid hinge also underperformed V2 on the second training block; do not promote this experiment.","paired":{"n":512,"mean_diff":-6.394304576138311,"se":0.2338653259535563,"sd":5.2917682517171825,"n_nonzero":512,"max_abs_diff":53.64655797009823,"worst":{"seed":22418,"diff":-53.64655797009823,"edge_a":520.6438757953243,"edge_b":574.2904337654226},"stage":"tuning"},"variants":[{"id":"later_K50_m05","K_bps":50,"K_wad":"5000000000000000","m":0.5,"m_wad":"500000000000000000","sha256":"34fd4aa13e8fae87a4f9eb4c7644b3cff25cb9ea050f29224c92445af2c53dfe","screen":{"paired":{"n":256,"mean_diff":-17.461005728014758,"se":0.3434223773523184,"sd":5.494758037637094,"n_nonzero":256,"max_abs_diff":37.5480301945322,"worst":{"seed":20096,"diff":-37.5480301945322,"edge_a":785.1952627563078,"edge_b":822.74329295084},"stage":"tuning"},"valid":true,"invalid_reasons":[],"gas":{"max_ok":211300,"max_ok_callback":"afterSwap","init_max":220953,"oog":0,"other_errors":0,"swap_calls":2616289,"swap_ok":2616289,"init_calls":256,"name_calls":256,"name_max":21566,"oog_seeds":[]},"vanilla_gas":{"max_ok":22592,"max_ok_callback":"afterSwap","init_max":21796,"oog":0,"other_errors":0,"swap_calls":2738065,"swap_ok":2738065,"init_calls":256,"name_calls":256,"name_max":21526,"oog_seeds":[]},"edge_deltas":{"total":{"mean_diff":-17.461005728014758,"se":0.3434223773523184,"candidate_mean":505.64586153096855,"v2_mean":523.1068672589834},"retail":{"mean_diff":6.127069444772447,"se":0.1442448186671919,"candidate_mean":556.1935600167113,"v2_mean":550.0664905719389},"arb":{"mean_diff":-23.588075172787065,"se":0.42448424773292337,"candidate_mean":-50.54769848574274,"v2_mean":-26.959623312955674}},"v2_volume_terciles":[{"tercile":"low","n":86,"v2_volume_y_min":57993.978854731424,"v2_volume_y_max":70763.75606739354,"deltas":{"total":{"mean_diff":-13.509734588763475,"se":0.41862968680630147},"retail":{"mean_diff":4.1714374785987225,"se":0.12372489048857335},"arb":{"mean_diff":-17.68117206736229,"se":0.422585914763035}}},{"tercile":"middle","n":85,"v2_volume_y_min":70801.48041463109,"v2_volume_y_max":82207.89120657643,"deltas":{"total":{"mean_diff":-17.026848567640588,"se":0.42162319387787495},"retail":{"mean_diff":5.871622977951148,"se":0.17954836569977523},"arb":{"mean_diff":-22.898471545591633,"se":0.4150838824730792}}},{"tercile":"high","n":85,"v2_volume_y_min":82279.58965768572,"v2_volume_y_max":96938.17774984562,"deltas":{"total":{"mean_diff":-21.892919570454936,"se":0.5449617766019051},"retail":{"mean_diff":8.36115531266363,"se":0.18989741254520978},"arb":{"mean_diff":-30.25407488311815,"se":0.5808439353459612}}}],"checks":{"all_requested_seeds_returned_once":true,"per_seed_global_counters_equal":true,"max_retail_arb_reconciliation_error":5.286437954055145e-12}}},{"id":"later_K50_m15","K_bps":50,"K_wad":"5000000000000000","m":1.5,"m_wad":"1500000000000000000","sha256":"19287314e10e4aa748bf0ee014e06742b8ab7009246c3df1aa769528d1f04a1d","screen":{"paired":{"n":256,"mean_diff":-16.334726615529878,"se":0.44716853481134805,"sd":7.154696556981569,"n_nonzero":256,"max_abs_diff":57.65713858216668,"worst":{"seed":20212,"diff":-57.65713858216668,"edge_a":570.1926114255671,"edge_b":627.8497500077337},"stage":"tuning"},"valid":true,"invalid_reasons":[],"gas":{"max_ok":211302,"max_ok_callback":"afterSwap","init_max":220953,"oog":0,"other_errors":0,"swap_calls":2346045,"swap_ok":2346045,"init_calls":256,"name_calls":256,"name_max":21566,"oog_seeds":[]},"vanilla_gas":{"max_ok":22592,"max_ok_callback":"afterSwap","init_max":21796,"oog":0,"other_errors":0,"swap_calls":2747921,"swap_ok":2747921,"init_calls":256,"name_calls":256,"name_max":21526,"oog_seeds":[]},"edge_deltas":{"total":{"mean_diff":-16.334726615529878,"se":0.44716853481134805,"candidate_mean":506.77214064345344,"v2_mean":523.1068672589834},"retail":{"mean_diff":-18.996937110137903,"se":0.4924065837808122,"candidate_mean":531.069553461801,"v2_mean":550.0664905719389},"arb":{"mean_diff":2.662210494608075,"se":0.08595323170385326,"candidate_mean":-24.2974128183476,"v2_mean":-26.959623312955674}},"v2_volume_terciles":[{"tercile":"low","n":86,"v2_volume_y_min":57993.978854731424,"v2_volume_y_max":70763.75606739354,"deltas":{"total":{"mean_diff":-12.45851441907967,"se":0.6396670830737886},"retail":{"mean_diff":-14.398911852283147,"se":0.7002544127813867},"arb":{"mean_diff":1.9403974332036158,"se":0.12442458087263368}}},{"tercile":"middle","n":85,"v2_volume_y_min":70801.48041463109,"v2_volume_y_max":82207.89120657643,"deltas":{"total":{"mean_diff":-16.145947153952143,"se":0.5934439123376216},"retail":{"mean_diff":-18.773523435106778,"se":0.6308503901444572},"arb":{"mean_diff":2.6275762811546177,"se":0.11403611917317623}}},{"tercile":"high","n":85,"v2_volume_y_min":82279.58965768572,"v2_volume_y_max":96938.17774984562,"deltas":{"total":{"mean_diff":-20.445320769986647,"se":0.8213151592101172},"retail":{"mean_diff":-23.87247045782207,"se":0.8823732435921707},"arb":{"mean_diff":3.4271496878354557,"se":0.1594900271446605}}}],"checks":{"all_requested_seeds_returned_once":true,"per_seed_global_counters_equal":true,"max_retail_arb_reconciliation_error":6.565414878423326e-12}}},{"id":"later_K150_m05","K_bps":150,"K_wad":"15000000000000000","m":0.5,"m_wad":"500000000000000000","sha256":"9692a97463d53e453027a96c57e76ac554f66e7e6d4ee0f5c5b71fe7d5573945","screen":{"paired":{"n":256,"mean_diff":-7.311943874636831,"se":0.2104709372879226,"sd":3.3675349966067616,"n_nonzero":256,"max_abs_diff":18.566852061814302,"worst":{"seed":20096,"diff":-18.566852061814302,"edge_a":804.1764408890257,"edge_b":822.74329295084},"stage":"tuning"},"valid":true,"invalid_reasons":[],"gas":{"max_ok":211300,"max_ok_callback":"afterSwap","init_max":220953,"oog":0,"other_errors":0,"swap_calls":2628311,"swap_ok":2628311,"init_calls":256,"name_calls":256,"name_max":21566,"oog_seeds":[]},"vanilla_gas":{"max_ok":22592,"max_ok_callback":"afterSwap","init_max":21796,"oog":0,"other_errors":0,"swap_calls":2735855,"swap_ok":2735855,"init_calls":256,"name_calls":256,"name_max":21526,"oog_seeds":[]},"edge_deltas":{"total":{"mean_diff":-7.311943874636831,"se":0.2104709372879226,"candidate_mean":515.7949233843465,"v2_mean":523.1068672589834},"retail":{"mean_diff":1.3253702457608492,"se":0.06102229207843726,"candidate_mean":551.3918608176997,"v2_mean":550.0664905719389},"arb":{"mean_diff":-8.63731412039761,"se":0.23246747428615938,"candidate_mean":-35.59693743335328,"v2_mean":-26.959623312955674}},"v2_volume_terciles":[{"tercile":"low","n":86,"v2_volume_y_min":57993.978854731424,"v2_volume_y_max":70763.75606739354,"deltas":{"total":{"mean_diff":-5.4071111840941235,"se":0.2918100494899035},"retail":{"mean_diff":0.7716063696607783,"se":0.07571727248531683},"arb":{"mean_diff":-6.178717553754944,"se":0.28935035247935253}}},{"tercile":"middle","n":85,"v2_volume_y_min":70801.48041463109,"v2_volume_y_max":82207.89120657643,"deltas":{"total":{"mean_diff":-7.06183666720825,"se":0.2925788491143861},"retail":{"mean_diff":1.1845227913412968,"se":0.08616367352048135},"arb":{"mean_diff":-8.246359458549486,"se":0.2972087439278739}}},{"tercile":"high","n":85,"v2_volume_y_min":82279.58965768572,"v2_volume_y_max":96938.17774984562,"deltas":{"total":{"mean_diff":-9.489293568967444,"se":0.36240974025007516},"retail":{"mean_diff":2.0264964454110617,"se":0.10473668296382274},"arb":{"mean_diff":-11.515790014378318,"se":0.38311222439539233}}}],"checks":{"all_requested_seeds_returned_once":true,"per_seed_global_counters_equal":true,"max_retail_arb_reconciliation_error":6.366462912410498e-12}}},{"id":"later_K150_m15","K_bps":150,"K_wad":"15000000000000000","m":1.5,"m_wad":"1500000000000000000","sha256":"7bab67dc00e49940970b9f537ba56dded9fef23c5f52713dcc27044b6fd540b2","screen":{"paired":{"n":256,"mean_diff":-6.419396760850964,"se":0.3852922890524451,"sd":6.164676624839122,"n_nonzero":256,"max_abs_diff":60.25801809102285,"worst":{"seed":20169,"diff":-60.25801809102285,"edge_a":322.5673912129398,"edge_b":382.82540930396266},"stage":"tuning"},"valid":true,"invalid_reasons":[],"gas":{"max_ok":211302,"max_ok_callback":"afterSwap","init_max":220953,"oog":0,"other_errors":0,"swap_calls":2566019,"swap_ok":2566019,"init_calls":256,"name_calls":256,"name_max":21566,"oog_seeds":[]},"vanilla_gas":{"max_ok":22592,"max_ok_callback":"afterSwap","init_max":21796,"oog":0,"other_errors":0,"swap_calls":2739628,"swap_ok":2739628,"init_calls":256,"name_calls":256,"name_max":21526,"oog_seeds":[]},"edge_deltas":{"total":{"mean_diff":-6.419396760850964,"se":0.3852922890524451,"candidate_mean":516.6874704981324,"v2_mean":523.1068672589834},"retail":{"mean_diff":-7.091481449843788,"se":0.4107051241930438,"candidate_mean":542.9750091220951,"v2_mean":550.0664905719389},"arb":{"mean_diff":0.6720846889929551,"se":0.06458915017466739,"candidate_mean":-26.28753862396272,"v2_mean":-26.959623312955674}},"v2_volume_terciles":[{"tercile":"low","n":86,"v2_volume_y_min":57993.978854731424,"v2_volume_y_max":70763.75606739354,"deltas":{"total":{"mean_diff":-4.888116501924481,"se":0.738742226999371},"retail":{"mean_diff":-5.202682343511969,"se":0.7875899928732469},"arb":{"mean_diff":0.31456584158747014,"se":0.12225133059887626}}},{"tercile":"middle","n":85,"v2_volume_y_min":70801.48041463109,"v2_volume_y_max":82207.89120657643,"deltas":{"total":{"mean_diff":-6.06187063917119,"se":0.4018499155090014},"retail":{"mean_diff":-6.64191643824272,"se":0.4284488135044539},"arb":{"mean_diff":0.5800457990716301,"se":0.08140042046721578}}},{"tercile":"high","n":85,"v2_volume_y_min":82279.58965768572,"v2_volume_y_max":96938.17774984562,"deltas":{"total":{"mean_diff":-8.326218203326945,"se":0.7509935236511761},"retail":{"mean_diff":-9.45206673373352,"se":0.7822119411904737},"arb":{"mean_diff":1.1258485304068884,"se":0.11010408374245853}}}],"checks":{"all_requested_seeds_returned_once":true,"per_seed_global_counters_equal":true,"max_retail_arb_reconciliation_error":6.0822458181064576e-12}}}],"seeds":{"screen":{"start":20000,"end_inclusive":20255,"n":256,"excluded":[]},"selected_training":{"start":22000,"end_inclusive":22511,"n":512,"excluded":[]}},"selection":{"id":"later_K150_m15","sha256":"7bab67dc00e49940970b9f537ba56dded9fef23c5f52713dcc27044b6fd540b2","rule":"greatest screening paired mean among the four valid variants; lexicographic id breaks exact ties","selected_at":"2026-11-08T05:30:50.014171+00:00","G_control_excluded_from_selection":true},"freeze":{"id":"later_K150_m15","sha256":"7bab67dc00e49940970b9f537ba56dded9fef23c5f52713dcc27044b6fd540b2","frozen_at":"2026-11-08T05:33:09.052231+00:00","completed_selected_training":true,"source_unchanged_since_screening":true},"gas":{"max_ok":211326,"max_ok_callback":"afterSwap","init_max":220953,"oog":0,"other_errors":0,"swap_calls":5159247,"swap_ok":5159247,"init_calls":512,"name_calls":512,"name_max":21566,"oog_seeds":[]},"v2_gas":{"max_ok":243605,"max_ok_callback":"afterSwap","init_max":236377,"oog":6,"other_errors":0,"swap_calls":5304253,"swap_ok":5304247,"init_calls":512,"name_calls":512,"name_max":21545,"oog_seeds":[[22086,1],[22136,2],[22442,3]]},"gas_scope":"Top-level gas and paired refer to the 512-seed selected_training stage. Screening gas is reported separately for every variant, G and the single reused V2 run.","screen_v2_gas":{"max_ok":242807,"max_ok_callback":"afterSwap","init_max":236377,"oog":1,"other_errors":0,"swap_calls":2638829,"swap_ok":2638828,"init_calls":256,"name_calls":256,"name_max":21545,"oog_seeds":[[20120,1]]},"screen_v2_vanilla_gas":{"max_ok":22592,"max_ok_callback":"afterSwap","init_max":21796,"oog":0,"other_errors":0,"swap_calls":2734159,"swap_ok":2734159,"init_calls":256,"name_calls":256,"name_max":21526,"oog_seeds":[]},"selected_training":{"paired":{"n":512,"mean_diff":-6.394304576138311,"se":0.2338653259535563,"sd":5.2917682517171825,"n_nonzero":512,"max_abs_diff":53.64655797009823,"worst":{"seed":22418,"diff":-53.64655797009823,"edge_a":520.6438757953243,"edge_b":574.2904337654226},"stage":"tuning"},"valid":true,"invalid_reasons":[],"gas":{"max_ok":211326,"max_ok_callback":"afterSwap","init_max":220953,"oog":0,"other_errors":0,"swap_calls":5159247,"swap_ok":5159247,"init_calls":512,"name_calls":512,"name_max":21566,"oog_seeds":[]},"vanilla_gas":{"max_ok":22592,"max_ok_callback":"afterSwap","init_max":21796,"oog":0,"other_errors":0,"swap_calls":5532368,"swap_ok":5532368,"init_calls":512,"name_calls":512,"name_max":21526,"oog_seeds":[]},"edge_deltas":{"total":{"mean_diff":-6.394304576138311,"se":0.2338653259535563,"candidate_mean":520.2493527844969,"v2_mean":526.6436573606352},"retail":{"mean_diff":-7.079598478622757,"se":0.2558064741836757,"candidate_mean":547.3451605608205,"v2_mean":554.4247590394434},"arb":{"mean_diff":0.6852939024845198,"se":0.06232087835551261,"candidate_mean":-27.095807776323795,"v2_mean":-27.781101678808316}},"v2_volume_terciles":[{"tercile":"low","n":171,"v2_volume_y_min":57217.7264928254,"v2_volume_y_max":71066.6132568273,"deltas":{"total":{"mean_diff":-4.578285840531891,"se":0.27195984745980534},"retail":{"mean_diff":-4.949406406421293,"se":0.2794000004695174},"arb":{"mean_diff":0.37112056588947406,"se":0.05468577542486986}}},{"tercile":"middle","n":171,"v2_volume_y_min":71103.86752535496,"v2_volume_y_max":82203.85587259429,"deltas":{"total":{"mean_diff":-7.038236615757906,"se":0.4802283408734964},"retail":{"mean_diff":-7.6201283474381905,"se":0.5397850339655818},"arb":{"mean_diff":0.5818917316802349,"se":0.16225386827054988}}},{"tercile":"high","n":170,"v2_volume_y_min":82212.78882094122,"v2_volume_y_max":97931.83497242021,"deltas":{"total":{"mean_diff":-7.573285899748586,"se":0.3994472918564226},"retail":{"mean_diff":-8.678611636146353,"se":0.42216812007429727},"arb":{"mean_diff":1.105325736397964,"se":0.06332533119033748}}}],"checks":{"all_requested_seeds_returned_once":true,"per_seed_global_counters_equal":true,"max_retail_arb_reconciliation_error":6.224354365258478e-12}},"selected_training_v2_vanilla_gas":{"max_ok":22592,"max_ok_callback":"afterSwap","init_max":21796,"oog":0,"other_errors":0,"swap_calls":5521257,"swap_ok":5521257,"init_calls":512,"name_calls":512,"name_max":21526,"oog_seeds":[]},"G_control":{"paired":{"n":256,"mean_diff":7.125186787249049e-07,"se":7.125186787249048e-07,"sd":1.1400298859598477e-05,"n_nonzero":1,"max_abs_diff":0.00018240478175357566,"worst":{"seed":20000,"diff":0.0,"edge_a":665.2002798921455,"edge_b":665.2002798921455},"stage":"tuning"},"valid":true,"invalid_reasons":[],"gas":{"max_ok":211174,"max_ok_callback":"afterSwap","init_max":220944,"oog":0,"other_errors":0,"swap_calls":2638829,"swap_ok":2638829,"init_calls":256,"name_calls":256,"name_max":21557,"oog_seeds":[]},"vanilla_gas":{"max_ok":22592,"max_ok_callback":"afterSwap","init_max":21796,"oog":0,"other_errors":0,"swap_calls":2734160,"swap_ok":2734160,"init_calls":256,"name_calls":256,"name_max":21526,"oog_seeds":[]},"edge_deltas":{"total":{"mean_diff":7.125186787249049e-07,"se":7.125186787249048e-07,"candidate_mean":523.106867971502,"v2_mean":523.1068672589834},"retail":{"mean_diff":-6.020185186361715e-06,"se":6.020185186361715e-06,"candidate_mean":550.0664845517537,"v2_mean":550.0664905719389},"arb":{"mean_diff":6.732703870471202e-06,"se":6.732703870471202e-06,"candidate_mean":-26.959616580251804,"v2_mean":-26.959623312955674}},"v2_volume_terciles":[{"tercile":"low","n":86,"v2_volume_y_min":57993.978854731424,"v2_volume_y_max":70763.75606739354,"deltas":{"total":{"mean_diff":0.0,"se":0.0},"retail":{"mean_diff":0.0,"se":0.0},"arb":{"mean_diff":0.0,"se":0.0}}},{"tercile":"middle","n":85,"v2_volume_y_min":70801.48041463109,"v2_volume_y_max":82207.89120657643,"deltas":{"total":{"mean_diff":0.0,"se":0.0},"retail":{"mean_diff":0.0,"se":0.0},"arb":{"mean_diff":0.0,"se":0.0}}},{"tercile":"high","n":85,"v2_volume_y_min":82279.58965768572,"v2_volume_y_max":96938.17774984562,"deltas":{"total":{"mean_diff":2.145938608865596e-06,"se":2.145938608865596e-06},"retail":{"mean_diff":-1.8131381267159987e-05,"se":1.813138126715999e-05},"arb":{"mean_diff":2.027731989224268e-05,"se":2.027731989224268e-05}}}],"checks":{"all_requested_seeds_returned_once":true,"per_seed_global_counters_equal":true,"max_retail_arb_reconciliation_error":6.792788553866558e-12},"sha256":"610c1905e7dd5559b84e40a3b2d6f8e0b53a7b0ac7574ae33b6c1770a28367cb","nonzero_diff_seeds":[20120],"all_nonzero_differences_on_v2_oog_seeds":true},"method":{"simulator_url":"https://github.com/benedictbrady/amm-challenge","simulator_commit":"6b6921f8d463314aa7c96234e1be25a25245f704","input_artifact":"https://api.imd.fun/artifacts/206a4888de6fa1bda53cd2c9bad1632ccdbb63d32e7f09b6a332746b7a3ac3c3","input_source_hashes_verified":true,"market":"Each X measured separately with amm_sim_rs.run_batch(X, VanillaStrategy, configs, 8); V2 rows reused within each stage.","workers":8,"chunk_max":32,"steps_per_seed":10000,"afterSwap_gas_limit":250000,"config":"MatchRunner defaults; default_rng(seed) draws retail mean size, arrival rate, sigma, in that order. Price seed=seed, retail seed=seed+1.","gas_validity":"No non-OOG errors in either strategy or any Vanilla callback; candidate OOG count <= V2 OOG count on the same full seed set. All calls and seeds retained.","paired_se":"Sample standard deviation of per-seed candidate-minus-V2 total edge, divided by sqrt(n); worst is the minimum paired difference.","edge_decomposition":"Actual simulator edge contributions: retail trade edge and negative arbitrageur profit; not fee revenue proxies.","terciles":"Sort each stage's seeds by exact V2 submission.retail_volume_y then seed; numpy.array_split into three groups. Same baseline groups used for every candidate.","gate":"!firstInStep, where G evaluates firstInStep before the count increment. No other gate or stacked rule.","formula":"d=min(G staleTox,TOX_CAP); x=wmul(STALE_DIR_COEF,d); attractShift=wmul(x,STALE_ATTRACT_FRAC); protecting shift on gate=wmul(STALE_DIR_COEF,min(d,K))+wmul(m,wmul(STALE_DIR_COEF,max(d-K,0))); outside gate=x.","rounding":"WAD integer divisions floor at each wmul; the excess term is multiplied by STALE_DIR_COEF first, then m.","unchanged":"All G estimators, direction skew, other fee terms, side selection, trade boost, tail compression, clamps and getName.","confirmation":"None; both stages are tuning. No seed >=4000000 and no board measurement or claim."},"checks":{"setup_exit":0,"instrumentation_apply_exit":0,"release_rebuild_exit":0,"harness_tests":{"matchrunner_equal_10000_10031":true,"far_block_len":4,"far_block_seconds":0.0001,"allocation_scales_with_n":true,"far_seed_equals_single":true,"validity_cases":{"cand_oog_equal_v2_valid":true,"cand_oog_less_valid":true,"cand_oog_more_invalid":true,"v2_oog_alone_not_invalid":true,"revert_invalid":true,"ref_revert_invalid":true,"vanilla_oog_invalid":true,"vanilla_other_invalid":true,"incomplete_invalid":true,"counter_mismatch_invalid":true,"reconciliation_threshold_invalid":true,"control_oog_match_valid":true,"control_oog_mismatch_invalid":true},"all_pass":true},"harness_test_adaptation":"CHUNK reduced from 64 to 32; config-only scaling test uses 90000..90003 instead of 4000000..4000003.","variant_checks":{"all_pass":true,"variants":{"later_K50_m05":{"source_change_isolated":true,"sole_gate_not_firstInStep":true,"attraction_computed_before_hinge":true,"amm_match_validate":true,"evm_cases":{"first_trade_equal":14,"new_step_equal":28,"same_step_attraction_equal":14,"same_step_estimators_equal":14,"below_knee_equal":2,"above_knee_changed_bid":6,"above_knee_changed_ask":6}},"later_K50_m15":{"source_change_isolated":true,"sole_gate_not_firstInStep":true,"attraction_computed_before_hinge":true,"amm_match_validate":true,"evm_cases":{"first_trade_equal":14,"new_step_equal":28,"same_step_attraction_equal":14,"same_step_estimators_equal":14,"below_knee_equal":2,"above_knee_changed_bid":6,"above_knee_changed_ask":6}},"later_K150_m05":{"source_change_isolated":true,"sole_gate_not_firstInStep":true,"attraction_computed_before_hinge":true,"amm_match_validate":true,"evm_cases":{"first_trade_equal":14,"new_step_equal":28,"same_step_attraction_equal":14,"same_step_estimators_equal":14,"below_knee_equal":6,"above_knee_changed_bid":4,"above_knee_changed_ask":4}},"later_K150_m15":{"source_change_isolated":true,"sole_gate_not_firstInStep":true,"attraction_computed_before_hinge":true,"amm_match_validate":true,"evm_cases":{"first_trade_equal":14,"new_step_equal":28,"same_step_attraction_equal":14,"same_step_estimators_equal":14,"below_knee_equal":6,"above_knee_changed_bid":4,"above_knee_changed_ask":4}}}},"G_amm_match_validate":true,"all_compilations_passed":true,"creation_bytecode_sizes":{"V2":7024,"G":7376,"later_K50_m05":7636,"later_K50_m15":7651,"later_K150_m05":7636,"later_K150_m15":7651},"independent_row_audit":{"screen":{"n_seeds":256,"strategies":{"V2":256,"G":256,"later_K50_m05":256,"later_K50_m15":256,"later_K150_m05":256,"later_K150_m15":256},"all_seeds_kept":true,"all_counters_recomputed":true,"all_callback_outcomes_accounted":true,"rowsets_sha256":"acd1ac9e6f3ad9d1e1c2d69a998eceeec82c910471af54bdad7fa881117f462d"},"selected_training":{"n_seeds":512,"strategies":{"V2":512,"later_K150_m15":512},"all_seeds_kept":true,"all_counters_recomputed":true,"all_callback_outcomes_accounted":true,"rowsets_sha256":"62a371fde6e928db2e2c207372d4fe1a0fc3795ac1dbad65997548465cd8c8a4"}},"paired_recomputed_with_numpy":true,"all_reconciliation_errors_lt_1e8_inverse":true,"source_quotes_refetched_and_exact":true,"no_scored_seed_excluded":true},"reproducibility":{"variant_patch":"--- G.sol\n+++ later.sol\n@@ -232,6 +232,13 @@\n             if (staleTox > TOX_CAP) staleTox = TOX_CAP;\n             uint256 staleShift = wmul(STALE_DIR_COEF, staleTox);\n             uint256 attractShift = wmul(staleShift, STALE_ATTRACT_FRAC);\n+            if (!firstInStep) {\n+                uint256 hingeK = 150 * BPS;\n+                uint256 lower = staleTox < hingeK ? staleTox : hingeK;\n+                uint256 upper = staleTox > hingeK ? staleTox - hingeK : 0;\n+                staleShift = wmul(STALE_DIR_COEF, lower)\n+                    + wmul(1500000000000000000, wmul(STALE_DIR_COEF, upper));\n+            }\n             if (spot >= staleHat) {\n                 bidFee = bidFee + staleShift;\n                 askFee = askFee > attractShift ? askFee - attractShift : 0;\n","generator_path_in_bundle":"scratch/generate_variants.py","bundle":{"encoding":"base64(lzma-xz(JSON filename->source))","sha256_uncompressed":"5ba25c62784d4b147f1bf156b59f6e389dd806a354e333aaf0da90a794feff74","files":["scratch/setup.sh","scratch/instrumentation.patch","scratch/harness.py","scratch/tests.py","scratch/generate_variants.py","scratch/check_variants.py","scratch/train.py","contracts/src/V2.sol","contracts/src/G.sol","contracts/src/AMMStrategyBase.sol","contracts/src/IAMMStrategy.sol"],"data":"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"},"decode_bundle_python":"json.loads(lzma.decompress(base64.b64decode(result['reproducibility']['bundle']['data'])))","bundle_note":"Pinned source dependencies and supplied harness/patch/setup included. train.py replay changes only its absolute deadline to a relative 55-minute budget.","commands":["Clone the simulator at the pinned commit in a workspace; unpack bundle paths at checkout root.","sh scratch/setup.sh",". scratch/env.sh && git apply scratch/instrumentation.patch",". scratch/env.sh && maturin develop --release --uv --manifest-path amm_sim_rs/Cargo.toml",". scratch/env.sh && python scratch/tests.py",". scratch/env.sh && amm-match validate contracts/src/G.sol",". scratch/env.sh && python scratch/generate_variants.py",". scratch/env.sh && python scratch/check_variants.py",". scratch/env.sh && python -u scratch/train.py"]},"timing":{"task_started_utc":"2026-11-08T05:23:45+00:00","training_started_utc":"2026-11-08T05:27:19.800356+00:00","training_finished_utc":"2026-11-08T05:33:09.052252+00:00","result_packaged_utc":"2026-11-08T05:35:32.830332+00:00"},"blocked":null,"confirmation":null,"evidence":"Scores, gas and checks are local measurements from this run. Source provenance is in sources.json; row hashes identify the unfiltered local records. Raw rows are retained in scratch during the run but are not included in this size-bounded deliverable."}
