[{"data":1,"prerenderedAt":1179},["ShallowReactive",2],{"docs:de:\u002Fdocs\u002Fduel\u002Fcontracts\u002Fintegrate":3},{"id":4,"title":5,"body":6,"cover":1170,"description":1171,"extension":1172,"meta":1173,"navigation":1174,"path":1175,"seo":1176,"stem":1177,"__hash__":1178},"docs\u002Fde\u002Fdocs\u002Fduel\u002Fcontracts\u002Fintegrate.md","Auf Duel bauen",{"type":7,"value":8,"toc":1163},"minimark",[9,13,17,22,29,131,187,215,219,225,306,313,338,344,350,451,454,536,559,566,659,700,703,723,784,802,806,864,883,887,1104,1111,1115,1159],[10,11,5],"h1",{"id":12},"auf-duel-bauen",[14,15,16],"p",{},"Die Pools von Duel sind Standard-Uniswap-V4-Pools mit einem Hook, und jede Zahl, die die App zeigt, stammt aus öffentlichen Views und Events. Bots, Terminals, Dashboards und Aggregatoren können darauf aufbauen, ohne zu fragen.",[18,19,21],"h2",{"id":20},"ein-duell-lesen","Ein Duell lesen",[14,23,24,28],{},[25,26,27],"code",{},"DuelLens"," sammelt alles über ein Duell in einem Aufruf:",[30,31,36],"pre",{"className":32,"code":33,"language":34,"meta":35,"style":35},"language-solidity shiki shiki-themes vitesse-light vitesse-dark","function getPair(uint256 pairId) external view returns (PairView memory);\nfunction getPairs(uint256 offset, uint256 limit) external view returns (PairView[] memory);\n","solidity","",[25,37,38,88],{"__ignoreMap":35},[39,40,43,47,51,55,59,63,66,69,72,76,79,82,85],"span",{"class":41,"line":42},"line",1,[39,44,46],{"class":45},"s5TCs","function",[39,48,50],{"class":49},"s_xSY"," getPair",[39,52,54],{"class":53},"si6no","(",[39,56,58],{"class":57},"s_NWU","uint256",[39,60,62],{"class":61},"s9nN2"," pairId",[39,64,65],{"class":53},")",[39,67,68],{"class":45}," external",[39,70,71],{"class":45}," view",[39,73,75],{"class":74},"sTPum"," returns",[39,77,78],{"class":53}," (",[39,80,81],{"class":45},"PairView",[39,83,84],{"class":45}," memory",[39,86,87],{"class":53},");\n",[39,89,91,93,96,98,100,103,106,109,112,114,116,118,120,122,124,127,129],{"class":41,"line":90},2,[39,92,46],{"class":45},[39,94,95],{"class":49}," getPairs",[39,97,54],{"class":53},[39,99,58],{"class":57},[39,101,102],{"class":61}," offset",[39,104,105],{"class":53},",",[39,107,108],{"class":57}," uint256",[39,110,111],{"class":61}," limit",[39,113,65],{"class":53},[39,115,68],{"class":45},[39,117,71],{"class":45},[39,119,75],{"class":74},[39,121,78],{"class":53},[39,123,81],{"class":45},[39,125,126],{"class":53},"[]",[39,128,84],{"class":45},[39,130,87],{"class":53},[14,132,133,134,136,137,140,141,144,145,148,149,152,153,156,157,160,161,164,165,168,169,172,173,176,177,152,180,152,183,186],{},"Ein ",[25,135,81],{}," enthält die ID des Duells, seinen Creator und seine Metadaten-URI, beide Seiten (Token, Name, Symbol, Angebot, Pool-Preis und Tick, ETH pro Token, echtes ETH im Pool), die drei Pool-Keys, die Live-Verteilung (",[25,138,139],{},"gaugeBps",", der Anteil von Seite A in Basispunkten), den bisherigen Durchschnitt der Runde (",[25,142,143],{},"roundGaugeBps","), den Pot, die Creator-Gebühren, das Gesamtvolumen und die Rückkäufe, die aktuelle Anti-Snipe-Steuer, Index, Beginn und Ende der Runde und ob in ihr gehandelt wurde (",[25,146,147],{},"roundTraded","), Zeitpunkt und Tick des Launchs (",[25,150,151],{},"launchTime",", ",[25,154,155],{},"startTick","), ob es ein Unterstützer-Duell ist, seine Kategorie (",[25,158,159],{},"category",", nach der Nummerierung der App, 0 für keine), seine Gebührenkonditionen (",[25,162,163],{},"fees",") und den Teil seines Anteils, den das Protokoll derzeit nimmt (",[25,166,167],{},"protocolRateBps",", von 10.000): Das Protokoll erhält ",[25,170,171],{},"fees.protocolShareBps × protocolRateBps \u002F 10.000"," der Swap-Gebühr, der Pot den Rest dieses Anteils. In den Verträgen und ihren ABIs heißt Seite B ",[25,174,175],{},"D",": ",[25,178,179],{},"d",[25,181,182],{},"tokenD",[25,184,185],{},"keyD",".",[14,188,189,190,152,193,152,196,152,199,152,202,152,205,152,208,211,212,186],{},"Der Hook hat kleinere Views: ",[25,191,192],{},"pairCount()",[25,194,195],{},"getPair(pairId)",[25,197,198],{},"poolKeys(pairId)",[25,200,201],{},"gaugeBps(pairId)",[25,203,204],{},"snipeTaxBps(pairId)",[25,206,207],{},"protocolRateBps()",[25,209,210],{},"protocolFees()"," und ",[25,213,214],{},"firstRoundEnd(launchTime)",[18,216,218],{"id":217},"handeln","Handeln",[14,220,221,222,224],{},"Jeder Uniswap-V4-Router kann in den Pools eines Duells handeln. Baue die Pool-Keys aus ",[25,223,198],{},":",[226,227,228,250],"table",{},[229,230,231],"thead",{},[232,233,234,238,241,244,247],"tr",{},[235,236,237],"th",{},"Pool",[235,239,240],{},"currency0",[235,242,243],{},"currency1",[235,245,246],{},"fee",[235,248,249],{},"tickSpacing",[251,252,253,274,290],"tbody",{},[232,254,255,259,265,268,271],{},[256,257,258],"td",{},"ETH \u002F A",[256,260,261,262,65],{},"ETH (",[25,263,264],{},"address(0)",[256,266,267],{},"Token A",[256,269,270],{},"0",[256,272,273],{},"200",[232,275,276,279,283,286,288],{},[256,277,278],{},"ETH \u002F B",[256,280,261,281,65],{},[25,282,264],{},[256,284,285],{},"Token B",[256,287,270],{},[256,289,273],{},[232,291,292,295,298,301,303],{},[256,293,294],{},"A \u002F B",[256,296,297],{},"die niedrigere Token-Adresse",[256,299,300],{},"die höhere",[256,302,270],{},[256,304,305],{},"60",[14,307,308,309,312],{},"Der Hook erhebt seine Gebühren über Return-Deltas, also hol Angebote über den V4 Quoter ein: Seine Antworten enthalten alle Gebühren und Steuern. Ein Wechsel über ETH ist sein ",[25,310,311],{},"quoteExactInput"," entlang des Pfads Token → ETH → anderer Token.",[14,314,315,316,319,320,211,322,325,326,329,330,333,334,337],{},"Ein Swap, dessen Gebühr der Hook vor der Ausführung erhebt (ein Kauf oder Wechsel mit exaktem Input, ein Verkauf mit exaktem Output), muss vollständig ausgeführt werden: Einer, den sein Preislimit oder ein ETH-Pool mit zu wenig ETH vorzeitig stoppen würde, wird mit ",[25,317,318],{},"PartialFill"," rückgängig gemacht. Der PoolManager verpackt den Fehler eines Hooks: ",[25,321,318],{},[25,323,324],{},"ArbitrageStarved"," kommen in ",[25,327,328],{},"WrappedError(address target, bytes4 selector, bytes reason, bytes details)"," an, und in ",[25,331,332],{},"UnexpectedRevertBytes(bytes revertData)",", wenn der V4 Quoter sie meldet. Dekodiere ",[25,335,336],{},"reason",", um den Fehler des Hooks zu lesen.",[14,339,340,341,343],{},"Jeder Trade endet mit der Neuausrichtung des Hooks, die eigenes Gas braucht: Ein Swap, der ihr zu wenig lässt, wird mit ",[25,342,324],{}," rückgängig gemacht, statt sie zu überspringen. Sende Swaps mit dem Gas einer Schätzung, nie mit weniger, und mit Reserve: Der erste Swap nach dem Schluss einer Runde rechnet auch die Runde ab (ihr Rückkauf, dann eine Neuausrichtung, rund 170.000 Gas mehr), was eine vor dem Schluss gemachte Schätzung nicht mitzählt. Die App schlägt auf jede Schätzung 500.000 Gas auf.",[14,345,346,349],{},[25,347,348],{},"DuelRouter"," bietet einen Aufruf für einen Swap in einem Pool:",[30,351,353],{"className":32,"code":352,"language":34,"meta":35,"style":35},"function swapExactIn(\n    PoolKey calldata key,\n    bool zeroForOne,\n    uint256 amountIn,\n    uint256 minAmountOut,\n    address recipient,\n    uint256 deadline\n) external payable returns (uint256 amountOut);\n",[25,354,355,365,379,390,401,411,422,430],{"__ignoreMap":35},[39,356,357,359,362],{"class":41,"line":42},[39,358,46],{"class":45},[39,360,361],{"class":49}," swapExactIn",[39,363,364],{"class":53},"(\n",[39,366,367,370,373,376],{"class":41,"line":90},[39,368,369],{"class":45},"    PoolKey",[39,371,372],{"class":45}," calldata",[39,374,375],{"class":61}," key",[39,377,378],{"class":53},",\n",[39,380,382,385,388],{"class":41,"line":381},3,[39,383,384],{"class":57},"    bool",[39,386,387],{"class":61}," zeroForOne",[39,389,378],{"class":53},[39,391,393,396,399],{"class":41,"line":392},4,[39,394,395],{"class":57},"    uint256",[39,397,398],{"class":61}," amountIn",[39,400,378],{"class":53},[39,402,404,406,409],{"class":41,"line":403},5,[39,405,395],{"class":57},[39,407,408],{"class":61}," minAmountOut",[39,410,378],{"class":53},[39,412,414,417,420],{"class":41,"line":413},6,[39,415,416],{"class":57},"    address",[39,418,419],{"class":61}," recipient",[39,421,378],{"class":53},[39,423,425,427],{"class":41,"line":424},7,[39,426,395],{"class":57},[39,428,429],{"class":61}," deadline\n",[39,431,433,435,437,440,442,444,446,449],{"class":41,"line":432},8,[39,434,65],{"class":53},[39,436,68],{"class":45},[39,438,439],{"class":45}," payable",[39,441,75],{"class":74},[39,443,78],{"class":53},[39,445,58],{"class":57},[39,447,448],{"class":61}," amountOut",[39,450,87],{"class":53},[14,452,453],{},"und einen für einen Wechsel über ETH, bei dem die verlassene Seite in ihrem ETH-Pool verkauft und das ganze erhaltene ETH im Pool der anderen ausgegeben wird:",[30,455,457],{"className":32,"code":456,"language":34,"meta":35,"style":35},"function swapThroughEth(\n    PoolKey calldata keyIn,\n    PoolKey calldata keyOut,\n    uint256 amountIn,\n    uint256 minAmountOut,\n    address recipient,\n    uint256 deadline\n) external returns (uint256 amountOut);\n",[25,458,459,468,479,490,498,506,514,520],{"__ignoreMap":35},[39,460,461,463,466],{"class":41,"line":42},[39,462,46],{"class":45},[39,464,465],{"class":49}," swapThroughEth",[39,467,364],{"class":53},[39,469,470,472,474,477],{"class":41,"line":90},[39,471,369],{"class":45},[39,473,372],{"class":45},[39,475,476],{"class":61}," keyIn",[39,478,378],{"class":53},[39,480,481,483,485,488],{"class":41,"line":381},[39,482,369],{"class":45},[39,484,372],{"class":45},[39,486,487],{"class":61}," keyOut",[39,489,378],{"class":53},[39,491,492,494,496],{"class":41,"line":392},[39,493,395],{"class":57},[39,495,398],{"class":61},[39,497,378],{"class":53},[39,499,500,502,504],{"class":41,"line":403},[39,501,395],{"class":57},[39,503,408],{"class":61},[39,505,378],{"class":53},[39,507,508,510,512],{"class":41,"line":413},[39,509,416],{"class":57},[39,511,419],{"class":61},[39,513,378],{"class":53},[39,515,516,518],{"class":41,"line":424},[39,517,395],{"class":57},[39,519,429],{"class":61},[39,521,522,524,526,528,530,532,534],{"class":41,"line":432},[39,523,65],{"class":53},[39,525,68],{"class":45},[39,527,75],{"class":74},[39,529,78],{"class":53},[39,531,58],{"class":57},[39,533,448],{"class":61},[39,535,87],{"class":53},[14,537,538,539,542,543,546,547,550,551,554,555,558],{},"Ein Verkauf in einen ETH-Pool von Duel, der beim Launch-Preis des Pools stoppt, weil sein ETH aufgebraucht ist, wird im selben Aufruf für den Rest erneut gesendet, sobald die Neuausrichtung des Hooks vom Pool zurückgekauft hat, was der Pool zwischen den Seiten aufnimmt: bis zu ",[25,540,541],{},"SALE_PASSES()"," (8) Swaps, solange der Preis des Pools unter dem Limit der Swaps liegt. Jeder zahlt die Gebühr des Hooks auf sein eigenes ETH, und ",[25,544,545],{},"minAmountOut"," zählt sie alle. Der V4 Quoter von Uniswap quotiert einen einzigen Swap: Über das hinaus, was dieser ausführt, antwortet er mit ",[25,548,549],{},"NotEnoughLiquidity",". Die App quotiert einen solchen Verkauf, indem sie den Router als der Trader ausführt (ein ",[25,552,553],{},"eth_call"," mit State Override, ",[25,556,557],{},"DuelSimulator",").",[14,560,561,562,565],{},"Was die Neuausrichtung nicht mehr zurückkaufen kann, führt ",[25,563,564],{},"sell"," über den Pool zwischen den Seiten weiter in den ETH-Pool der anderen Seite, in den die Neuausrichtungen das ETH verschoben haben, das dafür bezahlt:",[30,567,569],{"className":32,"code":568,"language":34,"meta":35,"style":35},"function sell(\n    PoolKey calldata keyIn,\n    PoolKey calldata keyCross,\n    PoolKey calldata keyOther,\n    uint256 amountIn,\n    uint256 minAmountOut,\n    address recipient,\n    uint256 deadline\n) external returns (uint256 amountOut);\n",[25,570,571,580,590,601,612,620,628,636,642],{"__ignoreMap":35},[39,572,573,575,578],{"class":41,"line":42},[39,574,46],{"class":45},[39,576,577],{"class":49}," sell",[39,579,364],{"class":53},[39,581,582,584,586,588],{"class":41,"line":90},[39,583,369],{"class":45},[39,585,372],{"class":45},[39,587,476],{"class":61},[39,589,378],{"class":53},[39,591,592,594,596,599],{"class":41,"line":381},[39,593,369],{"class":45},[39,595,372],{"class":45},[39,597,598],{"class":61}," keyCross",[39,600,378],{"class":53},[39,602,603,605,607,610],{"class":41,"line":392},[39,604,369],{"class":45},[39,606,372],{"class":45},[39,608,609],{"class":61}," keyOther",[39,611,378],{"class":53},[39,613,614,616,618],{"class":41,"line":403},[39,615,395],{"class":57},[39,617,398],{"class":61},[39,619,378],{"class":53},[39,621,622,624,626],{"class":41,"line":413},[39,623,395],{"class":57},[39,625,408],{"class":61},[39,627,378],{"class":53},[39,629,630,632,634],{"class":41,"line":424},[39,631,416],{"class":57},[39,633,419],{"class":61},[39,635,378],{"class":53},[39,637,638,640],{"class":41,"line":432},[39,639,395],{"class":57},[39,641,429],{"class":61},[39,643,645,647,649,651,653,655,657],{"class":41,"line":644},9,[39,646,65],{"class":53},[39,648,68],{"class":45},[39,650,75],{"class":74},[39,652,78],{"class":53},[39,654,58],{"class":57},[39,656,448],{"class":61},[39,658,87],{"class":53},[14,660,661,663,664,667,668,671,672,675,676,679,680,682,683,685,686,689,690,692,693,696,697,699],{},[25,662,564],{}," verkauft in ",[25,665,666],{},"keyIn"," wie ",[25,669,670],{},"swapExactIn",", dann den Rest über ",[25,673,674],{},"keyCross",", der alles aufnimmt (seine Wechselgebühr wird verbrannt, wie bei jedem Wechsel), und in ",[25,677,678],{},"keyOther",", ebenfalls Durchgang für Durchgang. ",[25,681,545],{}," zählt das ETH beider Pools. Was auch ",[25,684,678],{}," nicht zurückkaufen kann, erhält ",[25,687,688],{},"recipient"," in dessen Token, ohne dass es zum Mindestertrag zählt. Die App verkauft über ",[25,691,564],{},", wenn der V4 Quoter einen Verkauf ablehnt und ",[25,694,695],{},"DuelSimulator.simulateSale"," zeigt, dass ",[25,698,564],{}," alles gegen ETH verkauft.",[14,701,702],{},"Ein anderer V4-Router macht einen einzigen Swap. Der Hook lehnt einen Verkauf mit exaktem Input nicht ab, der über das hinausgeht, was das ETH des Pools bezahlt (seine Gebühr wird nach dem Swap erhoben, auf das ausgezahlte ETH): Der Verkauf wird teilweise ausgeführt, bis hinunter zum Launch-Preis des Pools, und der Rest bleibt beim Verkäufer. Setze den Mindestertrag auf das, was ausgeführt werden kann, und verkaufe den Rest in einer späteren Transaktion, in das hinein, was die Neuausrichtung zurückgekauft hat.",[14,704,705,706,708,709,152,712,211,715,718,719,722],{},"Sende ETH mit ",[25,707,670],{},", um zu kaufen. Zum Verkaufen oder Wechseln genehmige den Router für den Token oder lass einen Permit (EIP-2612) ihn in derselben Transaktion genehmigen: ",[25,710,711],{},"swapExactInWithPermit",[25,713,714],{},"swapThroughEthWithPermit",[25,716,717],{},"sellWithPermit"," nehmen dieselben Argumente und den Permit des Aufrufers über genau ",[25,720,721],{},"amountIn",", für den Router signiert:",[30,724,726],{"className":32,"code":725,"language":34,"meta":35,"style":35},"struct Permit {\n    uint256 deadline;\n    uint8 v;\n    bytes32 r;\n    bytes32 s;\n}\n",[25,727,728,739,750,760,770,779],{"__ignoreMap":35},[39,729,730,733,736],{"class":41,"line":42},[39,731,732],{"class":45},"struct",[39,734,735],{"class":57}," Permit",[39,737,738],{"class":53}," {\n",[39,740,741,743,747],{"class":41,"line":90},[39,742,395],{"class":57},[39,744,746],{"class":745},"s8w-G"," deadline",[39,748,749],{"class":53},";\n",[39,751,752,755,758],{"class":41,"line":381},[39,753,754],{"class":57},"    uint8",[39,756,757],{"class":745}," v",[39,759,749],{"class":53},[39,761,762,765,768],{"class":41,"line":392},[39,763,764],{"class":57},"    bytes32",[39,766,767],{"class":745}," r",[39,769,749],{"class":53},[39,771,772,774,777],{"class":41,"line":403},[39,773,764],{"class":57},[39,775,776],{"class":745}," s",[39,778,749],{"class":53},[39,780,781],{"class":41,"line":413},[39,782,783],{"class":53},"}\n",[14,785,786,787,790,791,794,795,798,799,801],{},"Die Wallet des Nutzers signiert die Permits eines Duel-Tokens in einer EIP-712-Domain namens ",[25,788,789],{},"Duel",", Version ",[25,792,793],{},"1",", auf der Adresse des Tokens (dessen ",[25,796,797],{},"eip712Domain()",", ERC-5267, sagt das). Der Router nutzt zuerst den Permit und ignoriert dessen Fehlschlag: Ein bereits von irgendwem gesendeter Permit hat die Allowance gesetzt, und ein fehlschlagender ändert nichts; der Swap nimmt dann, was die bestehende Allowance abdeckt, und wird rückgängig gemacht, wenn sie nicht reicht. Ein nur teilweise ausgeführter Swap lässt den ungenutzten Teil der durch den Permit erteilten Allowance bestehen. Die Deadline begrenzt die Gültigkeit der Permit-Signatur; eine bereits erteilte Allowance läuft dadurch nicht ab. Der Router zieht Token nur vom Aufrufer ab. Das ETH eines Wechsels bleibt im PoolManager, damit der zweite Pool es ausgibt; ein Duel-Pool gibt es ganz aus, oder der Hook macht den Swap rückgängig (",[25,800,318],{},"), und bei jedem anderen Pool wird dem Aufrufer zurückgezahlt, was er nicht ausgeben kann.",[18,803,805],{"id":804},"ein-duell-starten","Ein Duell starten",[14,807,808,811,812,815,816,152,819,152,822,152,825,828,829,152,832,152,835,838,839,152,842,844,845,848,849,852,853,856,857,860,861,558],{},[25,809,810],{},"DuelFactory.createPair(CreateParams)"," startet ein Duell; sende die Launch-Gebühr und die Launch-Käufe mit, ein Überschuss wird erstattet. ",[25,813,814],{},"CreateParams"," besteht aus ",[25,817,818],{},"nameA",[25,820,821],{},"symbolA",[25,823,824],{},"nameD",[25,826,827],{},"symbolD"," (Seite B), ",[25,830,831],{},"metadataURI",[25,833,834],{},"buyA",[25,836,837],{},"buyD"," (das ETH, das beim Launch auf jeder Seite ausgegeben wird, ohne Anti-Snipe-Steuer), ",[25,840,841],{},"supporter",[25,843,159],{}," (nach der Nummerierung der Kategorien in der App, 0 für keine) und ",[25,846,847],{},"config",", dem ",[25,850,851],{},"configHash()"," der Factory, wie du ihn gelesen hast: Der Launch wird mit ",[25,854,855],{},"ConfigChanged"," rückgängig gemacht, wenn sich die Konditionen seitdem geändert haben. Ein Name hat 1 bis 128 Bytes, ein Ticker 1 bis 40 und die Metadaten-URI höchstens 4096 (",[25,858,859],{},"InvalidMetadata","); ein Launch-Kauf über 5 % des Angebots einer Seite wird rückgängig gemacht (",[25,862,863],{},"CreatorBuyTooLarge",[14,865,866,867,870,871,874,875,878,879,882],{},"Die Factory startet mit pausierten Launches. Solange ",[25,868,869],{},"paused()"," true ist, kann nur ",[25,872,873],{},"owner()"," ein Duell starten; Aufrufe anderer werden mit ",[25,876,877],{},"CreationPaused"," rückgängig gemacht. Der Owner öffnet die Launches mit ",[25,880,881],{},"setPaused(false)",". Bestehende Duelle werden weiter gehandelt.",[18,884,886],{"id":885},"events","Events",[226,888,889,902],{},[229,890,891],{},[232,892,893,896,899],{},[235,894,895],{},"Vertrag",[235,897,898],{},"Event",[235,900,901],{},"Wann",[251,903,904,917,933,945,957,969,981,993,1005,1017,1029,1041,1057,1075,1087],{},[232,905,906,909,914],{},[256,907,908],{},"DuelFactory",[256,910,911],{},[25,912,913],{},"PairCreated(pairId, creator, tokenA, tokenD)",[256,915,916],{},"Ein Duell wurde gestartet",[232,918,919,922,927],{},[256,920,921],{},"DuelHook",[256,923,924],{},[25,925,926],{},"PairRegistered(pairId, tokenA, tokenD, creator, category)",[256,928,929,930,932],{},"Seine Pools wurden beim Hook registriert, in derselben Transaktion; ",[25,931,159],{}," ist sein Thema, nach der Nummerierung der Kategorien in der App (0 für keine)",[232,934,935,937,942],{},[256,936,921],{},[256,938,939],{},[25,940,941],{},"FeeTaken(pairId, fee, snipeTax)",[256,943,944],{},"Ein Trade gegen ETH hat seine Gebühr bezahlt",[232,946,947,949,954],{},[256,948,921],{},[256,950,951],{},[25,952,953],{},"SwitchFeeBurned(pairId, token, amount)",[256,955,956],{},"Ein Wechsel hat seine Gebühr verbrannt",[232,958,959,961,966],{},[256,960,921],{},[256,962,963],{},[25,964,965],{},"ArbitrageCaptured(pairId, profit)",[256,967,968],{},"Die Neuausrichtung hat den Pot gefüllt",[232,970,971,973,978],{},[256,972,921],{},[256,974,975],{},[25,976,977],{},"RoundSettled(pairId, roundIndex, averageTick, winner, ethSpent, tokensBurned)",[256,979,980],{},"Eine Runde wurde geschlossen",[232,982,983,985,990],{},[256,984,921],{},[256,986,987],{},[25,988,989],{},"CreatorFeesClaimed(pairId, to, amount)",[256,991,992],{},"Ein Creator wurde bezahlt",[232,994,995,997,1002],{},[256,996,908],{},[256,998,999],{},[25,1000,1001],{},"CreatorTransferStarted(pairId, creator, newCreator)",[256,1003,1004],{},"Ein Creator hat seine Rolle angeboten (an die Nulladresse: Angebot zurückgezogen)",[232,1006,1007,1009,1014],{},[256,1008,921],{},[256,1010,1011],{},[25,1012,1013],{},"CreatorChanged(pairId, from, to)",[256,1015,1016],{},"Die Creator-Rolle eines Duells hat den Besitzer gewechselt",[232,1018,1019,1021,1026],{},[256,1020,921],{},[256,1022,1023],{},[25,1024,1025],{},"CreatorFeesGivenUp(pairId, creator)",[256,1027,1028],{},"Der Creator hat seinen Anteil an künftigen Gebühren dauerhaft in die Pots umgeleitet",[232,1030,1031,1033,1038],{},[256,1032,921],{},[256,1034,1035],{},[25,1036,1037],{},"ProtocolFeesClaimed(to, amount)",[256,1039,1040],{},"Die Treasury wurde bezahlt",[232,1042,1043,1045,1050],{},[256,1044,921],{},[256,1046,1047],{},[25,1048,1049],{},"ProtocolRateSet(rateBps)",[256,1051,1052,1053,1056],{},"Der Anteil des Protokolls an der Swap-Gebühr aller Duelle hat sich sofort geändert: Es nimmt ",[25,1054,1055],{},"rateBps"," davon (10.000 für alles), der Rest geht in die Pots",[232,1058,1059,1061,1072],{},[256,1060,908],{},[256,1062,1063,152,1066,152,1069],{},[25,1064,1065],{},"ConfigProposed(config, eta)",[25,1067,1068],{},"ConfigApplied(config)",[25,1070,1071],{},"ConfigCancelled()",[256,1073,1074],{},"Launch-Konditionen für 48 Stunden später vorgeschlagen, angewendet, zurückgezogen",[232,1076,1077,1079,1084],{},[256,1078,908],{},[256,1080,1081],{},[25,1082,1083],{},"PausedSet(paused)",[256,1085,1086],{},"Launches pausiert oder fortgesetzt",[232,1088,1089,1092,1097],{},[256,1090,1091],{},"PoolManager",[256,1093,1094],{},[25,1095,1096],{},"Swap(id, sender, amount0, amount1, sqrtPriceX96, liquidity, tick, fee)",[256,1098,1099,1100,1103],{},"Jeder Trade, einschließlich der eigenen Neuausrichtung des Hooks (sein ",[25,1101,1102],{},"sender"," ist der Hook)",[14,1105,1106,1107,1110],{},"Trade-Listen lesen Swaps aus allen drei Pools; die Preis- und Verteilungscharts lesen nur die beiden ETH-Pools. Holder-Listen nutzen die ",[25,1108,1109],{},"Transfer","-Events der Token. Der Subgraph indexiert Swaps, Salden, Holder und abgerechnete Runden, damit die App die Historie laden kann, ohne die Chain seit dem Launch erneut abzuspielen.",[18,1112,1114],{"id":1113},"abrechnen-und-abholen","Abrechnen und Abholen",[1116,1117,1118,1125,1135,1153],"ul",{},[1119,1120,1121,1124],"li",{},[25,1122,1123],{},"settle(pairId)"," rechnet eine beendete Runde ab. Jeder kann sie aufrufen.",[1119,1126,1127,1130,1131,1134],{},[25,1128,1129],{},"claimCreatorFees(pairId)"," zahlt nur an den Creator des Duells, die Wallet, die es gestartet hat, oder die Adresse, an die sie ihre Rolle übergeben hat; ",[25,1132,1133],{},"claimProtocolFees()"," zahlt an die Treasury, die beim Abholen eingestellt ist. Jeder kann beide Abholungen auslösen. Die Treasury kann sich nach der 48-stündigen Wartezeit der Factory ändern; ein Aufrufer kann keinen anderen Empfänger wählen.",[1119,1136,1137,1140,1141,1144,1145,1148,1149,1152],{},[25,1138,1139],{},"transferCreator(pairId, newCreator)"," auf der Factory bietet die Creator-Rolle eines Duells an, die ",[25,1142,1143],{},"acceptCreator(pairId)"," von ",[25,1146,1147],{},"newCreator"," übernimmt; ",[25,1150,1151],{},"pendingCreator(pairId)"," liest das Angebot. Nur der Creator bietet sie an, und nur die angebotene Adresse übernimmt sie.",[1119,1154,1155,1158],{},[25,1156,1157],{},"giveUpCreatorFees(pairId)"," am Hook leitet den Creator-Anteil an künftigen Gebühren dauerhaft in die Pots um. Nur der aktuelle Creator kann die Funktion aufrufen. Bereits angesammelte Gebühren kann der Creator weiterhin abrufen, und die Creator-Rolle kann weiterhin übertragen werden.",[1160,1161,1162],"style",{},"html pre.shiki code .s5TCs, html code.shiki .s5TCs{--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .s_xSY, html code.shiki .s_xSY{--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .si6no, html code.shiki .si6no{--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .s_NWU, html code.shiki .s_NWU{--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .s9nN2, html code.shiki .s9nN2{--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .sTPum, html code.shiki .sTPum{--shiki-default:#1E754F;--shiki-dark:#4D9375}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s8w-G, html code.shiki .s8w-G{--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}",{"title":35,"searchDepth":90,"depth":381,"links":1164},[1165,1166,1167,1168,1169],{"id":20,"depth":90,"text":21},{"id":217,"depth":90,"text":218},{"id":804,"depth":90,"text":805},{"id":885,"depth":90,"text":886},{"id":1113,"depth":90,"text":1114},null,"Duelle mit DuelLens lesen, Pools über DuelRouter oder jeden Uniswap-V4-Router handeln, Events des Hooks verfolgen: Leitfaden für Bots und Aggregatoren.","md",{},true,"\u002Fde\u002Fdocs\u002Fduel\u002Fcontracts\u002Fintegrate",{"title":5,"description":1171},"de\u002Fdocs\u002Fduel\u002Fcontracts\u002Fintegrate","SmGsrMQYcESBMqv0_IOuuyGBl0320UO2vTzy55gH6zo",1791232793085]