[{"data":1,"prerenderedAt":1178},["ShallowReactive",2],{"docs:pl:\u002Fdocs\u002Fduel\u002Fcontracts\u002Fintegrate":3},{"id":4,"title":5,"body":6,"cover":1169,"description":1170,"extension":1171,"meta":1172,"navigation":1173,"path":1174,"seo":1175,"stem":1176,"__hash__":1177},"docs\u002Fpl\u002Fdocs\u002Fduel\u002Fcontracts\u002Fintegrate.md","Budowanie na Duel",{"type":7,"value":8,"toc":1162},"minimark",[9,13,17,22,29,131,186,214,218,224,305,312,337,343,349,450,453,535,558,565,658,699,702,722,783,801,805,863,882,886,1103,1110,1114,1158],[10,11,5],"h1",{"id":12},"budowanie-na-duel",[14,15,16],"p",{},"Pule Duel to standardowe pule Uniswap V4 z hookiem, a każda liczba, którą pokazuje aplikacja, pochodzi z publicznych widoków i zdarzeń. Boty, terminale, dashboardy i agregatory mogą na tym budować bez pytania o zgodę.",[18,19,21],"h2",{"id":20},"odczyt-pojedynku","Odczyt pojedynku",[14,23,24,28],{},[25,26,27],"code",{},"DuelLens"," zbiera wszystko o pojedynku w jednym wywołaniu:",[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,135,136,139,140,143,144,147,148,151,152,155,156,159,160,163,164,167,168,171,172,175,176,151,179,151,182,185],{},[25,134,81],{}," zawiera ID pojedynku, jego twórcę i URI metadanych, obie strony (token, nazwę, symbol, podaż, cenę i tick puli, ETH za token, prawdziwy ETH w puli), trzy klucze pul, bieżący podział (",[25,137,138],{},"gaugeBps",", udział strony A w punktach bazowych), dotychczasową średnią rundy (",[25,141,142],{},"roundGaugeBps","), pulę nagród, opłaty twórcy, łączny wolumen i odkupy, bieżący podatek antysnajperski, numer, początek i koniec rundy oraz to, czy w niej handlowano (",[25,145,146],{},"roundTraded","), czas i tick startu (",[25,149,150],{},"launchTime",", ",[25,153,154],{},"startTick","), to, czy jest pojedynkiem wspierającym, jego kategorię (",[25,157,158],{},"category",", według numeracji aplikacji, 0 oznacza brak), jego warunki opłat (",[25,161,162],{},"fees",") i to, jaką część swojego udziału protokół teraz bierze (",[25,165,166],{},"protocolRateBps",", na 10 000): protokół dostaje ",[25,169,170],{},"fees.protocolShareBps × protocolRateBps \u002F 10 000"," opłaty za swap, a pula nagród resztę tego udziału. W kontraktach i ich ABI strona B to ",[25,173,174],{},"D",": ",[25,177,178],{},"d",[25,180,181],{},"tokenD",[25,183,184],{},"keyD",".",[14,187,188,189,151,192,151,195,151,198,151,201,151,204,151,207,210,211,185],{},"Hook ma mniejsze widoki: ",[25,190,191],{},"pairCount()",[25,193,194],{},"getPair(pairId)",[25,196,197],{},"poolKeys(pairId)",[25,199,200],{},"gaugeBps(pairId)",[25,202,203],{},"snipeTaxBps(pairId)",[25,205,206],{},"protocolRateBps()",[25,208,209],{},"protocolFees()"," i ",[25,212,213],{},"firstRoundEnd(launchTime)",[18,215,217],{"id":216},"handel","Handel",[14,219,220,221,223],{},"Dowolny router Uniswap V4 może handlować w pulach pojedynku. Zbuduj klucze pul z ",[25,222,197],{},":",[225,226,227,249],"table",{},[228,229,230],"thead",{},[231,232,233,237,240,243,246],"tr",{},[234,235,236],"th",{},"Pula",[234,238,239],{},"currency0",[234,241,242],{},"currency1",[234,244,245],{},"fee",[234,247,248],{},"tickSpacing",[250,251,252,273,289],"tbody",{},[231,253,254,258,264,267,270],{},[255,256,257],"td",{},"ETH \u002F A",[255,259,260,261,65],{},"ETH (",[25,262,263],{},"address(0)",[255,265,266],{},"token A",[255,268,269],{},"0",[255,271,272],{},"200",[231,274,275,278,282,285,287],{},[255,276,277],{},"ETH \u002F B",[255,279,260,280,65],{},[25,281,263],{},[255,283,284],{},"token B",[255,286,269],{},[255,288,272],{},[231,290,291,294,297,300,302],{},[255,292,293],{},"A \u002F B",[255,295,296],{},"niższy adres tokena",[255,298,299],{},"wyższy",[255,301,269],{},[255,303,304],{},"60",[14,306,307,308,311],{},"Hook pobiera opłaty przez return deltas, więc wyceniaj przez V4 Quoter: jego odpowiedzi uwzględniają wszystkie opłaty i podatki. Zmiana strony przez ETH to jego ",[25,309,310],{},"quoteExactInput"," na ścieżce token → ETH → drugi token.",[14,313,314,315,318,319,210,321,324,325,328,329,332,333,336],{},"Swap, którego opłatę hook pobiera przed wykonaniem (kupno lub zmiana strony z dokładnym wejściem, sprzedaż z dokładnym wyjściem), musi wypełnić się w całości: swap, który jego limit ceny albo pula ETH z niedoborem ETH zatrzymałyby wcześniej, jest cofany z ",[25,316,317],{},"PartialFill",". PoolManager opakowuje błąd hooka: ",[25,320,317],{},[25,322,323],{},"ArbitrageStarved"," przychodzą wewnątrz ",[25,326,327],{},"WrappedError(address target, bytes4 selector, bytes reason, bytes details)",", a wewnątrz ",[25,330,331],{},"UnexpectedRevertBytes(bytes revertData)",", gdy zgłasza je V4 Quoter. Zdekoduj ",[25,334,335],{},"reason",", aby odczytać błąd hooka.",[14,338,339,340,342],{},"Każda transakcja kończy się wyrównaniem przez hook, które potrzebuje własnego gazu: swap, który zostawia mu go za mało, jest cofany z ",[25,341,323],{}," zamiast je pominąć. Wysyłaj swapy z gazem z oszacowania, nigdy mniejszym, i z zapasem: pierwszy swap po zamknięciu rundy rozlicza też rundę (jej odkup, potem wyrównanie, około 170 000 gazu więcej), czego oszacowanie zrobione przed zamknięciem nie uwzględnia. Aplikacja dodaje 500 000 gazu do każdego oszacowania.",[14,344,345,348],{},[25,346,347],{},"DuelRouter"," oferuje jedno wywołanie dla swapu w jednej puli:",[30,350,352],{"className":32,"code":351,"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,353,354,364,378,389,400,410,421,429],{"__ignoreMap":35},[39,355,356,358,361],{"class":41,"line":42},[39,357,46],{"class":45},[39,359,360],{"class":49}," swapExactIn",[39,362,363],{"class":53},"(\n",[39,365,366,369,372,375],{"class":41,"line":90},[39,367,368],{"class":45},"    PoolKey",[39,370,371],{"class":45}," calldata",[39,373,374],{"class":61}," key",[39,376,377],{"class":53},",\n",[39,379,381,384,387],{"class":41,"line":380},3,[39,382,383],{"class":57},"    bool",[39,385,386],{"class":61}," zeroForOne",[39,388,377],{"class":53},[39,390,392,395,398],{"class":41,"line":391},4,[39,393,394],{"class":57},"    uint256",[39,396,397],{"class":61}," amountIn",[39,399,377],{"class":53},[39,401,403,405,408],{"class":41,"line":402},5,[39,404,394],{"class":57},[39,406,407],{"class":61}," minAmountOut",[39,409,377],{"class":53},[39,411,413,416,419],{"class":41,"line":412},6,[39,414,415],{"class":57},"    address",[39,417,418],{"class":61}," recipient",[39,420,377],{"class":53},[39,422,424,426],{"class":41,"line":423},7,[39,425,394],{"class":57},[39,427,428],{"class":61}," deadline\n",[39,430,432,434,436,439,441,443,445,448],{"class":41,"line":431},8,[39,433,65],{"class":53},[39,435,68],{"class":45},[39,437,438],{"class":45}," payable",[39,440,75],{"class":74},[39,442,78],{"class":53},[39,444,58],{"class":57},[39,446,447],{"class":61}," amountOut",[39,449,87],{"class":53},[14,451,452],{},"i jedno dla zmiany strony przez ETH, w której opuszczana strona jest sprzedawana w swojej puli ETH, a cały uzyskany ETH wydawany w puli drugiej:",[30,454,456],{"className":32,"code":455,"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,457,458,467,478,489,497,505,513,519],{"__ignoreMap":35},[39,459,460,462,465],{"class":41,"line":42},[39,461,46],{"class":45},[39,463,464],{"class":49}," swapThroughEth",[39,466,363],{"class":53},[39,468,469,471,473,476],{"class":41,"line":90},[39,470,368],{"class":45},[39,472,371],{"class":45},[39,474,475],{"class":61}," keyIn",[39,477,377],{"class":53},[39,479,480,482,484,487],{"class":41,"line":380},[39,481,368],{"class":45},[39,483,371],{"class":45},[39,485,486],{"class":61}," keyOut",[39,488,377],{"class":53},[39,490,491,493,495],{"class":41,"line":391},[39,492,394],{"class":57},[39,494,397],{"class":61},[39,496,377],{"class":53},[39,498,499,501,503],{"class":41,"line":402},[39,500,394],{"class":57},[39,502,407],{"class":61},[39,504,377],{"class":53},[39,506,507,509,511],{"class":41,"line":412},[39,508,415],{"class":57},[39,510,418],{"class":61},[39,512,377],{"class":53},[39,514,515,517],{"class":41,"line":423},[39,516,394],{"class":57},[39,518,428],{"class":61},[39,520,521,523,525,527,529,531,533],{"class":41,"line":431},[39,522,65],{"class":53},[39,524,68],{"class":45},[39,526,75],{"class":74},[39,528,78],{"class":53},[39,530,58],{"class":57},[39,532,447],{"class":61},[39,534,87],{"class":53},[14,536,537,538,541,542,545,546,549,550,553,554,557],{},"Sprzedaż do puli ETH Duel, która zatrzymuje się na cenie startowej puli po wyczerpaniu jej ETH, jest wysyłana ponownie po resztę w tym samym wywołaniu, gdy wyrównanie hooka odkupi od puli to, co przyjmie pula między stronami: do ",[25,539,540],{},"SALE_PASSES()"," (8) swapów, dopóki cena puli jest poniżej limitu swapów. Każdy płaci opłatę hooka od własnego ETH, a ",[25,543,544],{},"minAmountOut"," liczy je wszystkie. V4 Quoter Uniswapa wycenia jeden swap: ponad to, co on wykona, odpowiada ",[25,547,548],{},"NotEnoughLiquidity",". Aplikacja wycenia taką sprzedaż, wykonując router jako trader (",[25,551,552],{},"eth_call"," z nadpisaniem stanu, ",[25,555,556],{},"DuelSimulator",").",[14,559,560,561,564],{},"To, czego wyrównanie nie może już odkupić, ",[25,562,563],{},"sell"," kieruje dalej przez pulę między stronami do puli ETH drugiej strony, do której wyrównania przeniosły ETH, który za to płaci:",[30,566,568],{"className":32,"code":567,"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,569,570,579,589,600,611,619,627,635,641],{"__ignoreMap":35},[39,571,572,574,577],{"class":41,"line":42},[39,573,46],{"class":45},[39,575,576],{"class":49}," sell",[39,578,363],{"class":53},[39,580,581,583,585,587],{"class":41,"line":90},[39,582,368],{"class":45},[39,584,371],{"class":45},[39,586,475],{"class":61},[39,588,377],{"class":53},[39,590,591,593,595,598],{"class":41,"line":380},[39,592,368],{"class":45},[39,594,371],{"class":45},[39,596,597],{"class":61}," keyCross",[39,599,377],{"class":53},[39,601,602,604,606,609],{"class":41,"line":391},[39,603,368],{"class":45},[39,605,371],{"class":45},[39,607,608],{"class":61}," keyOther",[39,610,377],{"class":53},[39,612,613,615,617],{"class":41,"line":402},[39,614,394],{"class":57},[39,616,397],{"class":61},[39,618,377],{"class":53},[39,620,621,623,625],{"class":41,"line":412},[39,622,394],{"class":57},[39,624,407],{"class":61},[39,626,377],{"class":53},[39,628,629,631,633],{"class":41,"line":423},[39,630,415],{"class":57},[39,632,418],{"class":61},[39,634,377],{"class":53},[39,636,637,639],{"class":41,"line":431},[39,638,394],{"class":57},[39,640,428],{"class":61},[39,642,644,646,648,650,652,654,656],{"class":41,"line":643},9,[39,645,65],{"class":53},[39,647,68],{"class":45},[39,649,75],{"class":74},[39,651,78],{"class":53},[39,653,58],{"class":57},[39,655,447],{"class":61},[39,657,87],{"class":53},[14,659,660,662,663,666,667,670,671,674,675,678,679,681,682,684,685,688,689,691,692,695,696,698],{},[25,661,563],{}," sprzedaje do puli ",[25,664,665],{},"keyIn"," tak jak ",[25,668,669],{},"swapExactIn",", potem to, co zostało, przez pulę ",[25,672,673],{},"keyCross",", która przyjmuje wszystko (jej opłata za zmianę strony jest spalana, jak przy każdej zmianie strony), i do puli ",[25,676,677],{},"keyOther",", również w kolejnych przebiegach. ",[25,680,544],{}," liczy ETH z obu pul. To, czego pula ",[25,683,677],{}," też nie może odkupić, trafia do ",[25,686,687],{},"recipient"," w jej tokenie i nie wlicza się do minimalnego wyniku. Aplikacja sprzedaje przez ",[25,690,563],{},", gdy V4 Quoter odrzuca sprzedaż, a ",[25,693,694],{},"DuelSimulator.simulateSale"," pokazuje, że ",[25,697,563],{}," sprzeda wszystko za ETH.",[14,700,701],{},"Inny router V4 wykonuje jeden swap. Hook nie odrzuca sprzedaży z dokładnym wejściem wykraczającej poza to, za co płaci ETH puli (jego opłata jest pobierana po swapie, od wypłaconego ETH): sprzedaż wykonuje się częściowo, aż do ceny startowej puli, a reszta zostaje u sprzedającego. Ustaw minimalny wynik na to, co może się wykonać, a resztę sprzedaj w późniejszej transakcji, do tego, co odkupiło wyrównanie.",[14,703,704,705,707,708,151,711,210,714,717,718,721],{},"Aby kupić, wyślij ETH z ",[25,706,669],{},". Aby sprzedać lub zmienić stronę, zatwierdź router dla tokena albo pozwól, by permit (EIP-2612) zatwierdził go w tej samej transakcji: ",[25,709,710],{},"swapExactInWithPermit",[25,712,713],{},"swapThroughEthWithPermit",[25,715,716],{},"sellWithPermit"," przyjmują te same argumenty oraz permit wywołującego na dokładnie ",[25,719,720],{},"amountIn",", podpisany dla routera:",[30,723,725],{"className":32,"code":724,"language":34,"meta":35,"style":35},"struct Permit {\n    uint256 deadline;\n    uint8 v;\n    bytes32 r;\n    bytes32 s;\n}\n",[25,726,727,738,749,759,769,778],{"__ignoreMap":35},[39,728,729,732,735],{"class":41,"line":42},[39,730,731],{"class":45},"struct",[39,733,734],{"class":57}," Permit",[39,736,737],{"class":53}," {\n",[39,739,740,742,746],{"class":41,"line":90},[39,741,394],{"class":57},[39,743,745],{"class":744},"s8w-G"," deadline",[39,747,748],{"class":53},";\n",[39,750,751,754,757],{"class":41,"line":380},[39,752,753],{"class":57},"    uint8",[39,755,756],{"class":744}," v",[39,758,748],{"class":53},[39,760,761,764,767],{"class":41,"line":391},[39,762,763],{"class":57},"    bytes32",[39,765,766],{"class":744}," r",[39,768,748],{"class":53},[39,770,771,773,776],{"class":41,"line":402},[39,772,763],{"class":57},[39,774,775],{"class":744}," s",[39,777,748],{"class":53},[39,779,780],{"class":41,"line":412},[39,781,782],{"class":53},"}\n",[14,784,785,786,789,790,793,794,797,798,800],{},"Dla każdego tokena Duel właściciel portfela podpisuje permity w domenie EIP-712 o nazwie ",[25,787,788],{},"Duel",", wersji ",[25,791,792],{},"1",", powiązanej z adresem tego tokena (mówi o tym jego ",[25,795,796],{},"eip712Domain()",", ERC-5267). Router najpierw używa permitu i ignoruje jego niepowodzenie: permit wysłany już przez kogokolwiek ustawił zgodę, a nieudany niczego nie zmienia; swap bierze wtedy to, co pokrywa już istniejąca zgoda, i jest cofany, jeśli to za mało. Po częściowym wypełnieniu swapa niewykorzystana część zgody pozostaje aktywna: termin permitu ogranicza, kiedy można użyć podpisu, ale nie wygasza już udzielonej zgody. Router pobiera tokeny tylko od wywołującego. ETH ze zmiany strony zostaje w PoolManagerze, aby wydała go druga pula; pula Duel wydaje go w całości albo hook cofa swap (",[25,799,317],{},"), a w każdej innej puli to, czego nie może ona wydać, wraca do wywołującego.",[18,802,804],{"id":803},"uruchomienie-pojedynku","Uruchomienie pojedynku",[14,806,807,810,811,814,815,151,818,151,821,151,824,827,828,151,831,151,834,837,838,151,841,843,844,847,848,851,852,855,856,859,860,557],{},[25,808,809],{},"DuelFactory.createPair(CreateParams)"," uruchamia pojedynek; wyślij razem z wywołaniem opłatę za start i zakupy przy starcie, nadwyżka jest zwracana. ",[25,812,813],{},"CreateParams"," to ",[25,816,817],{},"nameA",[25,819,820],{},"symbolA",[25,822,823],{},"nameD",[25,825,826],{},"symbolD"," (strona B), ",[25,829,830],{},"metadataURI",[25,832,833],{},"buyA",[25,835,836],{},"buyD"," (ETH wydawany na każdą stronę przy starcie, bez podatku antysnajperskiego), ",[25,839,840],{},"supporter",[25,842,158],{}," (według numeracji kategorii w aplikacji, 0 oznacza brak) i ",[25,845,846],{},"config",", czyli ",[25,849,850],{},"configHash()"," fabryki w odczytanej przez ciebie postaci: start jest cofany z ",[25,853,854],{},"ConfigChanged",", jeśli warunki zmieniły się od tego czasu. Nazwa ma od 1 do 128 bajtów, ticker od 1 do 40, a URI metadanych najwyżej 4096 (",[25,857,858],{},"InvalidMetadata","); zakup przy starcie powyżej 5% podaży strony jest cofany (",[25,861,862],{},"CreatorBuyTooLarge",[14,864,865,866,869,870,873,874,877,878,881],{},"Fabryka rozpoczyna działanie ze wstrzymanym uruchamianiem pojedynków. Dopóki ",[25,867,868],{},"paused()"," ma wartość true, tylko ",[25,871,872],{},"owner()"," może uruchomić pojedynek; wywołania innych osób są wycofywane z błędem ",[25,875,876],{},"CreationPaused",". Właściciel otwiera uruchamianie przez ",[25,879,880],{},"setPaused(false)",". Handel istniejącymi pojedynkami trwa nadal.",[18,883,885],{"id":884},"zdarzenia","Zdarzenia",[225,887,888,901],{},[228,889,890],{},[231,891,892,895,898],{},[234,893,894],{},"Kontrakt",[234,896,897],{},"Zdarzenie",[234,899,900],{},"Kiedy",[250,902,903,916,932,944,956,968,980,992,1004,1016,1028,1040,1056,1074,1086],{},[231,904,905,908,913],{},[255,906,907],{},"DuelFactory",[255,909,910],{},[25,911,912],{},"PairCreated(pairId, creator, tokenA, tokenD)",[255,914,915],{},"Uruchomiono pojedynek",[231,917,918,921,926],{},[255,919,920],{},"DuelHook",[255,922,923],{},[25,924,925],{},"PairRegistered(pairId, tokenA, tokenD, creator, category)",[255,927,928,929,931],{},"Jego pule zarejestrowano w hooku, w tej samej transakcji; ",[25,930,158],{}," to jego temat, według numeracji kategorii w aplikacji (0 oznacza brak)",[231,933,934,936,941],{},[255,935,920],{},[255,937,938],{},[25,939,940],{},"FeeTaken(pairId, fee, snipeTax)",[255,942,943],{},"Transakcja z ETH zapłaciła opłatę",[231,945,946,948,953],{},[255,947,920],{},[255,949,950],{},[25,951,952],{},"SwitchFeeBurned(pairId, token, amount)",[255,954,955],{},"Zmiana strony spaliła swoją opłatę",[231,957,958,960,965],{},[255,959,920],{},[255,961,962],{},[25,963,964],{},"ArbitrageCaptured(pairId, profit)",[255,966,967],{},"Wyrównanie zasiliło pulę nagród",[231,969,970,972,977],{},[255,971,920],{},[255,973,974],{},[25,975,976],{},"RoundSettled(pairId, roundIndex, averageTick, winner, ethSpent, tokensBurned)",[255,978,979],{},"Runda się zamknęła",[231,981,982,984,989],{},[255,983,920],{},[255,985,986],{},[25,987,988],{},"CreatorFeesClaimed(pairId, to, amount)",[255,990,991],{},"Twórca otrzymał wypłatę",[231,993,994,996,1001],{},[255,995,907],{},[255,997,998],{},[25,999,1000],{},"CreatorTransferStarted(pairId, creator, newCreator)",[255,1002,1003],{},"Twórca zaproponował swoją rolę (adresowi zerowemu: propozycja wycofana)",[231,1005,1006,1008,1013],{},[255,1007,920],{},[255,1009,1010],{},[25,1011,1012],{},"CreatorChanged(pairId, from, to)",[255,1014,1015],{},"Rola twórcy pojedynku przeszła w inne ręce",[231,1017,1018,1020,1025],{},[255,1019,920],{},[255,1021,1022],{},[25,1023,1024],{},"CreatorFeesGivenUp(pairId, creator)",[255,1026,1027],{},"Twórca na stałe przekierował swój udział w przyszłych opłatach do pul",[231,1029,1030,1032,1037],{},[255,1031,920],{},[255,1033,1034],{},[25,1035,1036],{},"ProtocolFeesClaimed(to, amount)",[255,1038,1039],{},"Skarbiec otrzymał wypłatę",[231,1041,1042,1044,1049],{},[255,1043,920],{},[255,1045,1046],{},[25,1047,1048],{},"ProtocolRateSet(rateBps)",[255,1050,1051,1052,1055],{},"Udział protokołu w opłacie za swap wszystkich pojedynków zmienił się od razu: bierze z niego ",[25,1053,1054],{},"rateBps"," (10 000 to całość), reszta trafia do pul nagród",[231,1057,1058,1060,1071],{},[255,1059,907],{},[255,1061,1062,151,1065,151,1068],{},[25,1063,1064],{},"ConfigProposed(config, eta)",[25,1066,1067],{},"ConfigApplied(config)",[25,1069,1070],{},"ConfigCancelled()",[255,1072,1073],{},"Warunki startu zaproponowane z 48-godzinnym wyprzedzeniem, zastosowane, wycofane",[231,1075,1076,1078,1083],{},[255,1077,907],{},[255,1079,1080],{},[25,1081,1082],{},"PausedSet(paused)",[255,1084,1085],{},"Starty wstrzymane lub wznowione",[231,1087,1088,1091,1096],{},[255,1089,1090],{},"PoolManager",[255,1092,1093],{},[25,1094,1095],{},"Swap(id, sender, amount0, amount1, sqrtPriceX96, liquidity, tick, fee)",[255,1097,1098,1099,1102],{},"Każda transakcja, łącznie z wyrównaniem samego hooka (jego ",[25,1100,1101],{},"sender"," to hook)",[14,1104,1105,1106,1109],{},"Listy transakcji odczytują swapy ze wszystkich trzech pul; wykresy ceny i podziału odczytują tylko dwie pule ETH. Listy posiadaczy korzystają ze zdarzeń ",[25,1107,1108],{},"Transfer"," tokenów. Subgraph indeksuje swapy, salda, posiadaczy i rozliczone rundy, aby aplikacja mogła wczytać historię bez odtwarzania sieci od startu.",[18,1111,1113],{"id":1112},"rozliczanie-i-odbiór","Rozliczanie i odbiór",[1115,1116,1117,1124,1134,1152],"ul",{},[1118,1119,1120,1123],"li",{},[25,1121,1122],{},"settle(pairId)"," rozlicza zakończoną rundę. Może ją wywołać każdy.",[1118,1125,1126,1129,1130,1133],{},[25,1127,1128],{},"claimCreatorFees(pairId)"," płaci tylko twórcy pojedynku: portfelowi, który go uruchomił, lub adresowi, któremu przekazał rolę; ",[25,1131,1132],{},"claimProtocolFees()"," płaci skarbcowi ustawionemu w chwili odbioru. Każdy może wywołać każdy z tych odbiorów. Skarbiec może się zmienić po 48-godzinnym terminie fabryki; wywołujący nie może wybrać innego odbiorcy.",[1118,1135,1136,1139,1140,1143,1144,1147,1148,1151],{},[25,1137,1138],{},"transferCreator(pairId, newCreator)"," w fabryce proponuje rolę twórcy pojedynku, którą przejmuje ",[25,1141,1142],{},"acceptCreator(pairId)"," wywołane przez ",[25,1145,1146],{},"newCreator","; ",[25,1149,1150],{},"pendingCreator(pairId)"," odczytuje propozycję. Proponuje ją tylko twórca, a przejmuje tylko adres, któremu ją zaproponowano.",[1118,1153,1154,1157],{},[25,1155,1156],{},"giveUpCreatorFees(pairId)"," na hooku na stałe przekazuje udział twórcy w przyszłych opłatach do pul rund. Funkcję może wywołać tylko obecny twórca. Zgromadzone wcześniej opłaty nadal może odebrać twórca, a jego rolę nadal można przekazać.",[1159,1160,1161],"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":380,"links":1163},[1164,1165,1166,1167,1168],{"id":20,"depth":90,"text":21},{"id":216,"depth":90,"text":217},{"id":803,"depth":90,"text":804},{"id":884,"depth":90,"text":885},{"id":1112,"depth":90,"text":1113},null,"Odczyt pojedynków przez DuelLens, handel ich pulami przez DuelRouter lub dowolny router Uniswap V4, zdarzenia hooka: przewodnik dla botów i agregatorów.","md",{},true,"\u002Fpl\u002Fdocs\u002Fduel\u002Fcontracts\u002Fintegrate",{"title":5,"description":1170},"pl\u002Fdocs\u002Fduel\u002Fcontracts\u002Fintegrate","nq3Q8riqO0VM-cl77UkQVIkgzZ82kTpJAGfbMreG87A",1791232799585]