Duelis
Un pool Uniswap v4 apărat de mici rețele on-chain care evoluează în fiecare zi. Gărzile stabilesc prețul tranzacțiilor care arată a boți, Umbrele tranzacționează simulat împotriva lor, iar deținătorii obișnuiți păstrează un comision de 1% pe care nicio rețea nu îl poate schimba.
Studiul de caz 02 din 03 · Ethereum mainnet · activ din 14 octombrie 2026 · blocul 26.193.597
- Rol
- Concepție, model economic, Solidity, testare, lansare și integrarea cu site-ul
- Lansat
- 14 octombrie 2026, 22:01 UTCBlocul 26.193.597, prin Custom Launch de la Programmable
- Contracte
- Patru scrise de mine, toate verificateEtherscan, potrivire exactă; plus seiful de comisioane al platformei
- Testare
- 26 de teste Foundry pe un fork de mainnetToate cele 26, rulate din nou cu succes pe 20 octombrie 2026
- Tehnologii
- Solidity 0.8.26 (via IR), Foundry, Uniswap v4, Permit2, JavaScript
- Permisiunile hookului
- 0x10CC
Tranzacția
Comisionul hookului pe partea în ETH
1,00%
Fixat în cod
O cumpărare plătește întotdeauna minimul de 1%, cu excepția cazului în care același portofel a mai tranzacționat în acest bloc. Nicio Gardă nu poate schimba asta.
Fiecare tranzacție mai plătește comisionul LP de 1% al poolului și comisionul de 0,30% al platformei.
Proiectul
Duelis este un token al cărui singur pool este păzit de hookul său. Șase rețele neuronale mici, Gărzile, decid comisionul tranzacțiilor care arată a boți: revânzări rapide, tranzacții repetate în același bloc și a doua jumătate a unui sandwich. Alte patru, Umbrele, reiau piața fiecărei zile ca boți care tranzacționează simulat și caută ce nu reușesc Gărzile să taxeze.
O dată pe zi, oricine poate rula duelul. Cea mai slabă rețea din fiecare tabără este înlocuită de o copie mutantă a celei mai puternice, iar cea mai bună Gardă preia controlul. Cumpărătorii care folosesc site-ul proiectului pot susține o tabără chiar în tranzacția de cumpărare, iar tabăra câștigătoare împarte o cincime din comisioanele hookului din acea zi.
Problema
În poolul unui token nou, cumpărătorii obișnuiți sunt ținta cea mai ușoară. Boții de tip sandwich cumpără chiar înaintea lor și vând imediat după; cei care cumpără și revând în câteva minute le lasă deținătorilor impactul asupra prețului. Un comision fix mai mare i-ar proteja pe deținători, dar i-ar taxa și pe ei.
Duelis taxează în schimb după comportament și pune în cod o regulă fermă: o cumpărare, sau vânzarea unor tokenuri deținute de cel puțin șase ore, plătește întotdeauna minimul de 1%, orice ar învăța rețelele. Doar tranzacțiile cu formă de bot ajung la Gărzi, iar un back-run plătește cel puțin câștigul de preț pe care l-a obținut.
Ce am construit
- Un model economic, înainte de orice linie de Solidity
Piețe de șaizeci de zile, în trei profiluri de volum, cu trei tipuri de traderi: deținători, speculatori adaptivi care revând rapid și atacatori sandwich raționali. Modelul a arătat că deținătorii au nevoie de o garanție fermă, pentru că doar prin evoluție comisioanele lor creșteau treptat, și că Umbrele nu adaugă o protecție consecventă peste ceea ce învață Gărzile din tranzacțiile reale. Ambele concluzii sunt scrise în contracte.
- Patru contracte
Tokenul, cu recompense în ETH care se acordă treptat după vechimea tokenurilor; hookul, cu Gărzile, Umbrele, regulile de comision, jocul taberelor și răscumpărarea; contractul care deschide poolul în tranzacția de lansare; și contractul care păstrează lichiditatea.
- 26 de teste pe un fork de mainnet
Inclusiv întreaga lansare rulată prin fabrica reală de implementare a platformei, comisionul platformei pe toate cele patru tipuri de swap și o grilă de atacuri sandwich care măsoară unde încetează să funcționeze regula de back-run.
- Pachetul de lansare pentru o platformă cu revizuire
Un depozit public de cod sursă la un commit exact, datele de intrare ale compilatorului împărțite în trei unități după ce varianta combinată a depășit timpul permis de compilatorul platformei, și configurația lansării. Trei respingeri, fiecare cu o cerință concretă, au fost rezolvate una câte una, până când a patra depunere a fost aprobată.
- Integrarea cu site-ul
Site-ul proiectului conectat la contracte: cumpărări care numesc o tabără în datele hookului, vânzări prin Permit2, revendicarea recompenselor și pașii duelului.
- Un panou pentru proprietar
Citește exact, din memoria PoolManager, comisioanele necolectate ale poziției blocate, cu rezultatul confirmat până la ultimul wei de o colectare reală pe un fork.
Brand și site
Duelis este pus în scenă ca o luptă. Două colțuri, negru pentru Gărzi și roșu pentru Umbre, trec prin logo, prin arena 3D și prin fiecare panou al site-ului. Titluri înalte și condensate stau deasupra unui text simplu, iar panouri scurte, pas cu pas, explică regulile fără a părăsi arena.
- Paletă
- Fundal
#F1EFEANegrul Gărzilor#141414Roșul Umbrelor#E1251B - Tipografie
- Anton pentru titluriInter pentru textJetBrains Mono pentru date
Cum funcționează
- 1Tranzacția
Fiecare swap plătește un comision al hookului pe partea sa în ETH, peste comisionul LP de 1% al poolului. Hookul citește cine a semnat tranzacția și cât de vechi sunt tokenurile acelui portofel.
- 2Minimul
O cumpărare, sau vânzarea unor tokenuri vechi de cel puțin șase ore, plătește exact 1%, cu excepția cazului în care același portofel a mai tranzacționat în acest bloc.
- 3Garda
Orice altceva ajunge la Garda campioană: o rețea int8 cu opt intrări, nouă unități ascunse și o ieșire, care percepe între 1% și 5%.
- 4Regula de back-run
A doua jumătate a unui sandwich plătește cel puțin propriul câștig de preț de la prima sa tranzacție din bloc, plus 1%, până la 5%.
- 5Împărțirea
Comisionul hookului se împarte: 55% pentru deținători, 20% pentru fondul taberelor, 20% pentru răscumpărarea și arderea DUEL și 5% pentru keeperii care rulează duelul.
- 6Duelul
O dată pe zi, trei tipuri de apeluri publice notează ambele colțuri pe piața înregistrată a zilei și le fac să evolueze. Fiecare apelant este plătit din partea keeperilor.
Gărzile stabilesc comisioanele
Șase rețele. Campioana stabilește prețul fiecărei tranzacții de tip bot.
- scoreShadows()Fiecare Umbră reia traseul de preț înregistrat în acea zi și cumpărările înregistrate, ca victime ale unui sandwich, și primește un scor după profitul ei simulat împotriva campioanei.3.017.551 gas
- scoreGuard(g), de șase oriPuncte pentru comisioanele luate pe revânzările rapide și pe tranzacțiile de tip back-run înregistrate, o penalizare de cinci ori mai mare pentru comisioanele luate deținătorilor pe termen scurt, minus profitul celei mai bune Umbre împotriva ei.895.431 gas fiecare
- evolve()În fiecare tabără, cea mai slabă rețea este înlocuită de o copie mutantă a celei mai puternice; cea mai bună Gardă devine campioană, iar fondul taberelor este decontat.317.349 gas
Umbrele vânează
Patru boți care tranzacționează simulat și caută ce nu reușesc Gărzile să taxeze.
Fig. 2. Duelul zilnic, cu costul în gas al fiecărui pas, măsurat pe un fork de mainnet. Garda 0, rețeaua de pornire proiectată manual, apare drept campioană.
Fig. 3. Unde ajunge comisionul hookului. Cei 0,30% ai platformei și comisionul LP de 1% al poolului nu fac parte din această împărțire.
Contractele, explicate
Cantitate și emitere
Un miliard de DUEL au fost create o singură dată și plasate în pool în tranzacția de lansare. Nicio funcție nu poate crea altele.
SUPPLY = 1_000_000_000 ether este emis în constructor către seeder. DuelSeeder.launch adaugă întreaga cantitate ca o singură bandă numai în DUEL, de la cel mai mic tick utilizabil până la prețul de deschidere.
Ardere
Deținătorii își pot arde propriile tokenuri. O cincime din fiecare comision al hookului este pusă deoparte pentru a răscumpăra DUEL din pool și a-l arde, în pași mici, plafonați, pe care îi poate declanșa oricine.
burn(uint256). DuelHook.buyback() poate fi apelat de oricine, cel mult o dată pe oră, cheltuiește cel mult 1% din adâncimea în ETH a poolului și stabilește o limită de preț la 50 de tickuri (0,5%) peste prețul curent. DUEL răscumpărat este ars cu TOKEN.burn.
Transferuri și vechimea tokenurilor
Fiecare sold are o vechime: momentul mediu în care au fost dobândite tokenurile lui, ponderat după cantitate. Tokenurile cumpărate din pool pornesc de la zero. Tokenurile trimise altui portofel își păstrează vechimea, așa că un portofel nou nu poate face tokenurile tinere să pară vechi.
acquiredAt[address] este recalculat ca medie la fiecare _move; ageOf(a) îl expune. Hookul citește TOKEN.ageOf(tx.origin), adică portofelul care a semnat tranzacția.
Comisioane
Cumpărările plătesc 1%. Vânzările de tokenuri vechi de cel puțin șase ore plătesc 1%. Vânzările de tokenuri tinere, a doua tranzacție din același bloc și tranzacțiile de tip back-run primesc prețul de la Garda campioană, între 1% și 5%, iar un back-run plătește cel puțin câștigul său de preț plus 1%. Un swap care specifică o sumă în ETH trebuie să se execute integral.
FLOOR = 10_000 și CAP = 50_000 pips. Rata Gărzii este FLOOR + max(o, 0) x (CAP - FLOOR) / 1e6 pentru ieșirea ei o. Comisionul platformei este ceil(gross x 0.30%), alocat primul și emis ca drepturi ERC-6909 către seiful de comisioane.
if (!same && !sandwich && (buy || age >= HOLDER_AGE)) {
if (buy) _victim(ethSide, depth);
return FLOOR;
}Recompense și acordare treptată
55% din fiecare comision al hookului merge la deținători, în ETH. Se acumulează pe fiecare token deținut și se acordă treptat, pe măsură ce tokenurile îmbătrânesc, în 14 zile. La o vânzare timpurie, partea care nu s-a acordat încă revine deținătorilor rămași. Până când este deținut 1% din cantitatea totală, recompensele se împart ca și cum acest 1% ar fi deținut, astfel încât primul cumpărător să nu poată lua singur comisioanele de lansare.
flush() trimite registrul deținătorilor către notify(); un acumulator accPerToken rulează peste eligibleSupply, care exclude PoolManager, hookul, tokenul și 0x...dEaD. vested(a) crește liniar până la AGE_FULL = 14 days; _handBack rulează la fiecare transfer de ieșire; MIN_DENOM = SUPPLY / 100.
Jocul taberelor
Un cumpărător de pe site-ul proiectului poate susține Gărzile sau Umbrele chiar în tranzacția de cumpărare. Gărzile câștigă ziua dacă nicio Umbră nu a obținut un profit simulat împotriva campioanei; altfel câștigă Umbrele. Tabăra câștigătoare împarte fondul taberelor din acea zi proporțional cu ETH-ul cumpărat, iar o vânzare în timpul zilei anulează partea vânzătorului.
Cumpărările cu intrare exactă citesc abi.encode(uint8 side) din datele hookului în backing[epoch][tx.origin]; o singură tabără per portofel per epocă. evolve() decontează sidePot[e]; claimSide(e) îl plătește. Dacă tabăra câștigătoare nu are susținători, fondul trece în ziua următoare.
Puterile proprietarului și ale administratorului
Nu există administrator. Portofelul proprietarului primește comisioanele de lichiditate ale poziției blocate și nimic din hook. Nu poate schimba codul, comisioanele, rețelele sau soldul nimănui.
Nu există nicio funcție de proprietar în DUEL, DuelHook sau DuelLocker. bindHook rulează o singură dată, din seeder. afterInitialize acceptă doar seederul și doar dacă TOKEN.HOOK() == this. Plata keeperilor este STEP_PAY = 0.002 ether pe pas, cel mult un sfert din registrul keeperilor.
Lichiditate
Lichiditatea de lansare este păstrată de DuelLocker, care are o singură funcție: trimite proprietarului comisioanele poziției. Nu există cod care să poată retrage sau muta poziția.
DuelLocker.collect(tokenId) rulează DECREASE_LIQUIDITY cu lichiditate zero și TAKE_PAIR către OWNER. Seederul a emis NFT-ul poziției direct către locker, în tranzacția de lansare.
Valori aleatoare
Mutațiile și eșantionarea tranzacțiilor înregistrate folosesc valoarea aleatoare a blocului. Nu există oracol și nici server.
evolve() inițializează mutația din keccak256(prevrandao, blockhash(n - 1), epoch); fiecare dintre cele 91 de ponderi se modifică cu până la 24, cu probabilitatea 1/12. Eșantioanele sunt păstrate prin eșantionare de tip rezervor (reservoir sampling) pe prevrandao.
Testare și securitate
Revizuirea platformei a respins primele trei depuneri, de fiecare dată cu o cerință concretă: blocarea lichidității și o primă cumpărare, aplicarea comisionului platformei chiar în pool, nu într-un router, refuzarea execuțiilor parțiale și taxarea răscumpărărilor făcute de hook cu comisionul platformei, pe aceeași sumă brută ca orice altă tranzacție. Fiecare cerință a devenit o modificare în contracte și un test care o dovedește.
| Cumpărarea victimei | Rezultatul atacului | Concluzie |
|---|---|---|
| 0,02 ETH | -0,00078 ETH | Pierde |
| 0,05 ETH | -0,00172 ETH | Pierde |
| 0,10 ETH | -0,00269 ETH | Pierde |
| 0,20 ETH | -0,00240 ETH | Pierde |
| 0,50 ETH | +0,01593 ETH | Câștigă |
| 1,00 ETH | +0,10148 ETH | Câștigă |
| 2,00 ETH | +0,45164 ETH | Câștigă |
| Operațiune | Gas |
|---|---|
| Cumpărare prin Universal Router | 373.624 |
| Vânzare de tokenuri tinere, cu consultarea Gărzii | 390.252 |
| Vânzare de tokenuri mai vechi de șase ore | 266.310 |
| scoreShadows() | 3.017.551 |
| scoreGuard(g), fiecare dintre cele șase | 895.431 |
| evolve() | 317.349 |
Limite, spuse direct
- Aplicația Uniswap nu poate ruta acest pool, pentru că hookul își decontează comisionul prin return deltas. Tranzacțiile trec prin site-ul proiectului, prin alte routere și prin boți.
- Vechimea tokenurilor este citită din portofelul care semnează tranzacția. Tokenurile ținute într-un portofel de tip smart contract par noi și plătesc rata Gărzii.
- Atacurile sandwich mari pot fi încă profitabile: într-un pool cu o adâncime de aproximativ 6 ETH, pentru victime de 0,5 ETH sau mai mult. Pragul crește odată cu adâncimea poolului.
- Modelul economic nu a arătat nicio protecție consecventă din partea Umbrelor peste ceea ce învață Gărzile din tranzacțiile reale. Contractele spun acest lucru.
- Mutațiile și eșantionarea folosesc valoarea aleatoare a blocului, pe care propunătorul blocului o poate influența ușor.
Starea on-chain
Date citite de pe Ethereum mainnet pe 20 octombrie 2026, la blocul 26.234.176
- Pe mainnet fuseseră notate și evoluate trei epoci zilnice.
- Campioana era încă Garda 0, cu ponderile neschimbate față de rețeaua de pornire proiectată manual.
Contracte
| Contract | Adresă | Sursă verificată |
|---|---|---|
DUELToken ERC-20 |
0xD946fEFbdEdF6086afba72d91C9A10f0b3Fb8eBa | Etherscan (se deschide într-o filă nouă) |
DuelHookHook Uniswap v4 |
0x2911623B872be9F44C81ce5FCd070AB1B56610cc | Etherscan (se deschide într-o filă nouă) |
DuelSeederInițializarea lansării |
0x12A43efb4D6938dFEcdCA0dae3ba2cDDd0cFfA9F | Etherscan (se deschide într-o filă nouă) |
DuelLockerCustodia lichidității |
0x539bAffe2CC41143b7a3e969fC5524F0f55f2140 | Etherscan (se deschide într-o filă nouă) |
Seif de comisioaneComisionul platformei, cod Programmable |
0x68b15402F2929CfA6760625b4b98010d2462BAdD | Etherscan (se deschide într-o filă nouă)EthereumNativeFeeVaultV3 al platformei Programmable, nemodificat, implementat de hook. Etherscan îl arată ca potrivire similară cu originalul verificat al platformei. |
DUEL, DuelHook, DuelSeeder și DuelLocker sunt verificate pe Etherscan cu potrivire exactă. Compilator: solc 0.8.26, via IR, 2.000 de rulări ale optimizatorului, EVM țintă Cancun.
Depozitul de cod sursă: github.com/DuelisAI/duelis-contracts (se deschide într-o filă nouă)



