{"item":"e06-tell-port/o1-b","credit":"Taylor (gtmcknight): replica2.py, the Gaussian filter, fee rule and qm tables (github.com/gtmcknight/amm-sim @4812a6382311624e1506aca131ca35c378f930d9, research/solved). COMBO/TwoComp/qt1-ref are IdentityMD items built on them. Engine: benedictbrady/amm-challenge @6b6921f8d463314aa7c96234e1be25a25245f704.","summary":"The wads leak which path filled us. Sell side (isBuy false): redoing execute_sell_x and execute_buy_x_with_y from the previous callback's reserve wads, the ask-fee wad in force and the new TradeInfo gives 'retail' exactly when only the retail redo reproduces all wads. That rule never mislabels an arb and mislabels 31 of 30,352 retail sells (15 of 13,131 first trades). Buy side: both paths call execute_buy_x, so redoing the trade tells nothing, but the arbitrageur's amount is fl((x_virtual - rx)/gamma) where x_virtual - rx is an exact difference of doubles. Its wad is reachable for 100% of arb buys and only 43 of 29,793 retail buys (16 of 12,889 first trades). COMBO mislabels 15.45% of first trades (8,930 of 57,783), and the tell gets 8,926 of those right (99.955%). On the engine port, letting COMBO use the tell as a likelihood beside its own pi scores +2.543 (se 0.057) over COMBO on 10000..10255 and +2.531 (se 0.059) on 64000..64255, within 0.011 of the true flag. Hard labels (pi set to 0/1 from the tell) have catastrophic seeds (worst -158.8), so they must not be used raw.","hashes":{"amm-challenge HEAD":"6b6921f8d463314aa7c96234e1be25a25245f704 (git rev-parse HEAD, verified)","amm-sim HEAD":"4812a6382311624e1506aca131ca35c378f930d9 (git rev-parse HEAD, verified)","COMBO artifact":{"url":"https://api.imdnotdead.fun/artifacts/d360bea6c8c982717b7b43a8069a87013169c89ee3e4da25622db4d880b936d4","sha256":"d360bea6c8c982717b7b43a8069a87013169c89ee3e4da25622db4d880b936d4","matches_name":true},"TC artifact (source of twocomp.py)":{"url":"https://api.imdnotdead.fun/artifacts/d3c849db2ac31e567b57e52b80b86e8c24c842e5b4125b9d75c78e3cb07115b9","sha256":"d3c849db2ac31e567b57e52b80b86e8c24c842e5b4125b9d75c78e3cb07115b9"},"combo.py":{"sha256":"c5b711a0b4fb4783e8879a484bf87a427171f4a11aa5eb5ec3513c24ead1a796","stated":"c5b711a0b4fb4783e8879a484bf87a427171f4a11aa5eb5ec3513c24ead1a796","how":"python fence after '## Code' in COMBO artifact"},"twocomp.py":{"sha256":"9d3c1833321493fb51bbde4e1b4dabc2f8978bd6d774ee2af8dc8aed13f0f0af","stated":"9d3c1833321493fb51bbde4e1b4dabc2f8978bd6d774ee2af8dc8aed13f0f0af","how":"python fence after '## Code' in TC artifact"},"qmref.py":{"sha256":"1dfc9b7a3c2237ff7a93dd9f0af54b9bdab16f2ce0a7eb00784cb4432598db92","stated":"1dfc9b7a3c2237ff7a93dd9f0af54b9bdab16f2ce0a7eb00784cb4432598db92","url":"https://raw.githubusercontent.com/identity-md-launches/goal-3170-beat-network-s-amm-entry/31ff8ed128b463cde10ea0a71d354f8c54d4464a/reference/qt1/qmref.py"},"blob.bin":{"sha256":"3ac7cb8811ecfb6a17f499aa4e9b70dd55f7fb6432b3aec3b904e11a3dece38e","stated":"3ac7cb8811ecfb6a17f499aa4e9b70dd55f7fb6432b3aec3b904e11a3dece38e","url":"https://raw.githubusercontent.com/identity-md-launches/goal-3170-beat-network-s-amm-entry/31ff8ed128b463cde10ea0a71d354f8c54d4464a/reference/qt1/blob.bin"},"replica2.py":"6e37b4e61e1ffa5ffb1e43912ddb8659105989aa986eb48fcd1d7608f8dca685","cfmm.rs":"bfaab0d22531d2d920d4fe108ae78ebde759e2b75e96ca4c8503f7979a92a80f","arbitrageur.rs":"f81bceb19ce315dfb457253f35e5dfc6cd78c587c54f06e873f0ef2e978f5503","router.rs":"3d726a0fff1f69e639a8345d722226888089fd33b4a825fd85ece6bbc565994d","all_four_match_stated":true},"port_check":{"seeds":"74100..74107","n_steps":10000,"policy":"COMBO (Combo(blob.bin)) as submission vs 30 bps","per_seed":[{"seed":74100,"replica2_edge":623.146613436,"port_edge":623.146613436,"diff":5.457e-12,"our_callbacks":10903},{"seed":74101,"replica2_edge":677.717808537,"port_edge":677.717808537,"diff":6.128e-11,"our_callbacks":12000},{"seed":74102,"replica2_edge":444.504877214,"port_edge":444.504877214,"diff":-1.376e-10,"our_callbacks":11134},{"seed":74103,"replica2_edge":614.735858595,"port_edge":614.735858595,"diff":-6.548e-11,"our_callbacks":12601},{"seed":74104,"replica2_edge":552.231376439,"port_edge":552.231376439,"diff":3.32e-11,"our_callbacks":10988},{"seed":74105,"replica2_edge":718.606084113,"port_edge":718.606084113,"diff":1.662e-10,"our_callbacks":12284},{"seed":74106,"replica2_edge":413.262491798,"port_edge":413.262491798,"diff":9.391e-11,"our_callbacks":9147},{"seed":74107,"replica2_edge":682.657309463,"port_edge":682.657309462,"diff":-1.367e-10,"our_callbacks":12851}],"max_abs_diff":1.662e-10,"reading":"Driven by replica2's streams (config, price, retail: same draws, same order), the port (engine arithmetic: k recomputed from current reserves, fees in a separate bucket, fee wads, wad-rounded TradeInfo, arb/route edges as engine.rs) gives COMBO edges equal to replica2.run within 1.7e-10 on all 8 seeds. On these seeds the replica's arithmetic shortcuts (constant K, double fees) do not move the edge at 1e-9."},"log":"Per trade of our pool: step t, isBuy, amountX/amountY/reserveX/reserveY wads, bid/ask fee wads in force, true path (arb|retail), first-of-step flag, and COMBO's first-trade label (pi>0.5, read from comp). 92,005 callbacks over 8 seeds; all 31,763 arb fills (16,591 sells + 15,172 buys) are first trades of their step.","test":"Prev reserves = previous callback's reserveX/reserveY wads (initial 1e20/1e22 wads before the first). Candidates = every double d with int(d*1e18) == wad (walk ulps both ways from wad/1e18). Arb path: execute_sell_x(amountX): k=rx*ry; new_rx=rx-ax; new_ry=k/new_rx; net_y=new_ry-ry; total_y=net_y/gamma; fee_amount=total_y-net_y; rx'=rx-ax; ry'=ry+(total_y-fee_amount); match if wad(total_y), wad(rx'), wad(ry') all equal the reported ones. Retail path: execute_buy_x_with_y(amountY): net_y=ay*gamma; new_ry=ry+net_y; new_rx=k/new_ry; x_out=rx-new_rx; rx'=rx-x_out; ry'=ry+(ay-ay*fee); match on wad(x_out), wad(rx'), wad(ry'). gamma = clamp(1 - askWad/1e18, 0, 1).","matrix":{"all_sell_trades":{"arb":{"arb_only":3522,"retail_only":0,"both":13069,"neither":0},"retail":{"arb_only":0,"retail_only":30321,"both":31,"neither":0}},"first_sell_trades":{"arb":{"arb_only":3522,"retail_only":0,"both":13069,"neither":0},"retail":{"arb_only":0,"retail_only":13116,"both":15,"neither":0}}},"candidates":{"doubles_per_wad_histogram":{"ax":{"1":70425,"2":19903,"3":455,"4":173,"5":385,"9":232,"10":54,"18":78,"19":73,"36":7,"37":63,"73":8,"74":23,"147":8,"148":8,"295":8,"296":2,"590":3},"ay":{"1":72421,"2":19473,"3":7,"5":7},"prx":{"1":67515,"2":24393},"pry":{"1":68661,"2":23247}},"note":"prx/pry are reserve wads (1 or 2 doubles each); ay 1-5; ax up to 590 for tiny amounts (truncated wads of small amounts). No enumeration hit its 4096 cap."},"rule_error_rate":{"sell":"retail iff only the execute_buy_x_with_y redo reproduces the wads, else arb","buy":"arb iff some double x_virtual gives int(((x_virtual - rx)/gamma)*1e18) == amountX wad, else retail","sell_all":{"n":46943,"errors":31,"error_rate":0.0006604,"errors_by_true_path":{"retail":31}},"sell_first":{"n":29722,"errors":15,"error_rate":0.0005047,"errors_by_true_path":{"retail":15}},"buy_all":{"n":44965,"errors":43,"error_rate":0.0009563,"errors_by_true_path":{"retail":43}},"buy_first":{"n":28061,"errors":16,"error_rate":0.0005702,"errors_by_true_path":{"retail":16}}},"combo_errors":{"all":{"first_trades":57783,"combo_errors":8930,"combo_error_rate":0.15454,"errors_by_true_path":{"retail":5416,"arb":3514},"tell_correct_on_combo_errors":8926,"share_removed":0.99955,"tell_errors_on_same_trades":31},"sell":{"first_trades":29722,"combo_errors":4557,"combo_error_rate":0.15332,"errors_by_true_path":{"retail":2796,"arb":1761},"tell_correct_on_combo_errors":4555,"share_removed":0.99956,"tell_errors_on_same_trades":15},"buy":{"first_trades":28061,"combo_errors":4373,"combo_error_rate":0.15584,"errors_by_true_path":{"retail":2620,"arb":1753},"tell_correct_on_combo_errors":4371,"share_removed":0.99954,"tell_errors_on_same_trades":16},"note":"COMBO label = pi>0.5 on a step's first own trade (comp[0][0]>0.5 for 2 components, else arb iff the single component has variance 0). share_removed = share of COMBO's errors that the hard tell labels correctly. The tell's own errors are all retail trades labelled arb."},"edge_with_tell":{"note":"Engine port, COMBO base vs COMBO with the dt>=1 pi overridden. tell: pi:=1/0 from the hard rule. bayes: pi:=pi*La/(pi*La+(1-pi)*Lr) with La/Lr fixed from the 74100..74107 first-trade log (sell both-match La=13069/16591, Lr=15/13131; buy closed-form pass La=1, Lr=16/12889; single match or fail is decisive). true: pi:=true flag. Nothing was chosen on 64000..64255 or 10000..10255. These are subsets of the choose and report windows (256 seeds each), not the full windows, and no qt1 pairing was rerun. COMBO's published lead over qt1 is +0.597391 on 10000..12047 (COMBO artifact).","results":{"seeds 74100..74107":{"tell":{"n":8,"mean_diff":1.757531,"se":0.238121,"wins":8,"worst3":[[74101,0.734275],[74105,0.9858],[74106,1.468831]]},"bayes":{"n":8,"mean_diff":2.469418,"se":0.298887,"wins":8,"worst3":[[74106,1.732255],[74100,1.855881],[74105,1.931742]]},"true":{"n":8,"mean_diff":2.469906,"se":0.304421,"wins":8,"worst3":[[74106,1.695235],[74100,1.849118],[74105,1.910111]]},"bayes-tell":{"n":8,"mean_diff":0.711886,"se":0.199679,"wins":7,"worst3":[[74102,-0.014845],[74100,0.229243],[74106,0.263423]]},"true-bayes":{"n":8,"mean_diff":0.000488,"se":0.010415,"wins":4,"worst3":[[74106,-0.037019],[74105,-0.021631],[74101,-0.019457]]},"label_errors_per_first_trade":{"tell":[35,57660],"bayes":[10,57675],"true":[0,57676]}},"choose 64000..64255":{"tell":{"n":256,"mean_diff":-0.966195,"se":0.715807,"wins":200,"worst3":[[64120,-116.003659],[64044,-87.965164],[64167,-45.471651]]},"bayes":{"n":256,"mean_diff":2.53098,"se":0.058713,"wins":254,"worst3":[[64003,-0.967065],[64132,-0.064518],[64150,0.040163]]},"true":{"n":256,"mean_diff":2.543321,"se":0.05903,"wins":254,"worst3":[[64003,-1.15932],[64132,-0.028623],[64150,0.051428]]},"bayes-tell":{"n":256,"mean_diff":3.497175,"se":0.715546,"wins":212,"worst3":[[64065,-0.252581],[64006,-0.246383],[64217,-0.204616]]},"true-bayes":{"n":256,"mean_diff":0.012341,"se":0.00526,"wins":144,"worst3":[[64002,-0.341833],[64070,-0.286851],[64127,-0.285175]]},"label_errors_per_first_trade":{"tell":[1044,1789477],"bayes":[506,1789957],"true":[0,1789873]}},"report 10000..10255":{"tell":{"n":256,"mean_diff":-0.34602,"se":0.817314,"wins":218,"worst3":[[10146,-158.769603],[10208,-87.540656],[10220,-60.373974]]},"bayes":{"n":256,"mean_diff":2.543263,"se":0.057067,"wins":255,"worst3":[[10141,-0.195729],[10115,0.415753],[10125,0.54117]]},"true":{"n":256,"mean_diff":2.554086,"se":0.056899,"wins":255,"worst3":[[10141,-0.217922],[10115,0.441437],[10125,0.488147]]},"bayes-tell":{"n":256,"mean_diff":2.889283,"se":0.821489,"wins":221,"worst3":[[10235,-0.542296],[10189,-0.23731],[10247,-0.230439]]},"true-bayes":{"n":256,"mean_diff":0.010823,"se":0.005285,"wins":139,"worst3":[[10196,-0.310465],[10079,-0.235908],[10054,-0.215666]]},"label_errors_per_first_trade":{"tell":[1059,1790139],"bayes":[469,1790420],"true":[0,1790519]}}}},"buy_side":{"exec_redo":{"result":"no tell: both paths call execute_buy_x(amountX) with the same arithmetic, so the redo reproduces every buy (arb 15172/15172, retail 29793/29793)","matrix":{"arb":{"pass":15172,"fail":0},"retail":{"pass":29793,"fail":0}}},"arbitrageur_closed_form":{"test":"exists double x_virtual (scan +-6 ulps of rx + (wad/1e18)*gamma, for each rx candidate) with int(fl(fl(x_virtual - rx)/gamma)*1e18) == amountX wad; gamma = 1 - bidWad/1e18. x_virtual - rx is exact (Sterbenz), so an arb amount sits on a grid of spacing ~ulp(rx)/gamma (~1.4e-14) while a retail split amount is an arbitrary double.","matrix_all":{"arb":{"pass":15172,"fail":0},"retail":{"pass":43,"fail":29750}},"matrix_first":{"arb":{"pass":15172,"fail":0},"retail":{"pass":16,"fail":12873}},"result":"tell found: passes every arb buy, 0.14% of retail buys"},"router_split":{"result":"not usable as a test: the split x1 = clamp((r*(x2+g2*X)-x1)/(g1+r*g2)) needs the rival pool's reserves, its fee and p (X = size/p), none of which a strategy reads, and the result is an arbitrary double. Not tried beyond this argument."},"min_amount":{"test":"amountX/1e18 <= MIN_AMOUNT (1e-4): retail fills need x1 > MIN_AMOUNT","matrix_all":{"arb":{"pass":14,"fail":15158},"retail":{"pass":0,"fail":29793}},"matrix_first":{"arb":{"pass":14,"fail":15158},"retail":{"pass":0,"fail":12889}},"result":"a valid but nearly useless tell: 14 arb buys, no retail, and the closed-form test already covers them"}},"contract_arithmetic":["keep the previous callback's reserveX/reserveY wads and the bid/ask fee wads it returned (4 values; fees are already stored)","wad->double: (double)wad / 1e18, correctly rounded (i128->f64 round-to-nearest-even, then IEEE division); enumerate neighbouring doubles d with trunc(d*1e18)==wad (needs exact double*1e18 and truncation toward zero)","gamma = 1.0 - fee (IEEE subtract); clamp(0,1)","sell arb redo: k=rx*ry; rx-ax; k/new_rx; new_ry-ry; net_y/gamma; total_y-net_y; ry+(total_y-fee_amount); 3 wad comparisons","sell retail redo: ay*gamma; ry+net_y; k/new_ry; rx-new_rx; ay*fee; ay-fee_amount; ry+...; 3 wad comparisons","buy closed form: rx + a*gamma, nextafter steps, (xv-rx)/gamma, trunc(.*1e18) compare","all ops are IEEE-754 binary64 add/sub/mul/div with round-to-nearest-even (no sqrt, no FMA); in Solidity this means a soft-float emulation of those four ops plus double<->int conversions, looped over 1-2 candidates per reserve wad and ~1-5 per amount wad (up to ~600 for tiny amounts); gas not measured"],"readme_rules":["`afterInitialize` is called once at simulation start — return your opening `(bidFee, askFee)`. Then `afterSwap` is called after every trade that hits your AMM. You see what just happened and return updated fees for the next trade.","| `isBuy` | `true` if AMM bought X (trader sold X to you) |","| `amountX` | X traded (WAD precision, 1e18 = 1 unit) |","| `amountY` | Y traded |","| `timestamp` | Step number |","| `reserveX`, `reserveY` | Post-trade reserves |","Return fees in WAD: `30 * BPS` = 30 basis points. Max fee is 10%.","You get 32 storage slots (`slots[0..31]`) and helpers like `wmul`, `wdiv`, `sqrt`.","(README 6b6921f8 lines 115-127.) Everything the test uses is in TradeInfo or in the strategy's own earlier returns/inputs; the README states no rule against using the low digits of the wads."],"limitations":["Verified against my Python port of the Rust source, not against the compiled amm_sim_rs engine (brief: test only, no engine build). The tell relies on bit-exact IEEE behaviour of the Rust build (no FMA contraction, correctly rounded i128->f64 and f64->i128 casts). If the shipped engine differs (FMA, other rounding), the redo test breaks. An engine-side check of a few hundred callbacks is needed before any contract work.","A contract does not see doubles: in the port COMBO received wad/1e18 values and returned fees converted to wads by clamp then trunc(f*1e18). Its internal fb/fa doubles differ from the engine's to_f64(fee wad) by <1e-17. The tell uses only the fee wads.","Port uses replica2's RNG streams, not the engine's Pcg64/rand_distr streams, so edges are replica-scale, not board scores.","Edge-with-tell figures are 256-seed subsets of the choose (64000..64255) and report (10000..10255) windows, paired vs COMBO only; no qt1 pairing and no full-window run. The bayes likelihoods were fixed from the 74100..74107 log, not tuned.","Gas: the soft-float redo (about 20 IEEE ops per candidate combination, a few combinations typical, up to hundreds for tiny amounts) was not costed against the 245,000 afterSwap limit on top of COMBO's filter, which is already near that limit by TC's estimate.","Gate P (gates.py) not rerun in this item; the COMBO artifact reports it as passing, and my port reproduces replica2.run for COMBO within 1.7e-10."],"code":{"format":"base64(zlib(json {filename: source}))","files":["port.py","tell.py","edge.py","sumedge.py","agg.py","build.py"],"sha256_of_zlib_bytes":"983fc13d833978256d9b411a1f7aed9b2471bb21c0d648de1b0ec7c75528a690","sha256_of_base64_text":"4470eaf4f28047f238f2d166e00dc7982069f6e19f51740f4630005ca5e35a0e","zlib_base64":"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","run":"python3 -I tell.py SEED (74100..74107); python3 -I agg.py; python3 -I edge.py SEEDS...; python3 -I sumedge.py; needs combo.py, twocomp.py, qmref.py, blob.bin beside them and amm-sim at ../amm-sim"}}