[{"data":1,"prerenderedAt":1174},["ShallowReactive",2],{"docs:pt:\u002Fdocs\u002Fduel\u002Fcontracts\u002Fintegrate":3},{"id":4,"title":5,"body":6,"cover":1165,"description":1166,"extension":1167,"meta":1168,"navigation":1169,"path":1170,"seo":1171,"stem":1172,"__hash__":1173},"docs\u002Fpt\u002Fdocs\u002Fduel\u002Fcontracts\u002Fintegrate.md","Construir no Duel",{"type":7,"value":8,"toc":1158},"minimark",[9,13,17,22,29,131,187,215,219,225,306,313,338,344,350,451,454,536,559,566,659,695,698,718,779,797,801,859,878,882,1099,1106,1110,1154],[10,11,5],"h1",{"id":12},"construir-no-duel",[14,15,16],"p",{},"Os pools do Duel são pools padrão da Uniswap V4 com um hook, e todo número que o app mostra vem de visões e eventos públicos. Bots, terminais, dashboards e agregadores podem construir em cima dele sem pedir permissão.",[18,19,21],"h2",{"id":20},"ler-um-duelo","Ler um duelo",[14,23,24,28],{},[25,26,27],"code",{},"DuelLens"," reúne tudo sobre um duelo em uma única chamada:",[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],{},"Um ",[25,135,81],{}," contém o id do duelo, o criador e a URI dos metadados dele, os dois lados (token, nome, símbolo, supply, preço e tick do pool, ETH por token, ETH real no pool), as três chaves de pool, a divisão ao vivo (",[25,138,139],{},"gaugeBps",", a parte do lado A em pontos-base), a média da rodada até agora (",[25,142,143],{},"roundGaugeBps","), o pote, as taxas do criador, o volume e as recompras acumulados, o imposto antissnipe atual, o índice, o início e o fim da rodada e se ela teve negociações (",[25,146,147],{},"roundTraded","), o horário e o tick de lançamento (",[25,150,151],{},"launchTime",", ",[25,154,155],{},"startTick","), se é um duelo solidário, a categoria dele (",[25,158,159],{},"category",", conforme a numeração do app, 0 para nenhuma), os termos de taxa dele (",[25,162,163],{},"fees",") e a fração da própria parte com que o protocolo fica agora (",[25,166,167],{},"protocolRateBps",", sobre 10.000): o protocolo recebe ",[25,170,171],{},"fees.protocolShareBps × protocolRateBps \u002F 10.000"," da taxa de swap, e o pote o resto dessa parte. Nos contratos e nas ABIs deles, o lado 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],{},"O hook tem visões menores: ",[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()"," e ",[25,213,214],{},"firstRoundEnd(launchTime)",[18,216,218],{"id":217},"negociar","Negociar",[14,220,221,222,224],{},"Qualquer router da Uniswap V4 pode negociar nos pools de um duelo. Monte as chaves de pool a partir de ",[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],{},"o endereço de token menor",[256,299,300],{},"o maior",[256,302,270],{},[256,304,305],{},"60",[14,307,308,309,312],{},"O hook cobra as taxas por meio de return deltas, então cote com o V4 Quoter: as respostas dele incluem todas as taxas e impostos. Uma troca via ETH é o ",[25,310,311],{},"quoteExactInput"," dele ao longo do caminho token → ETH → o outro token.",[14,314,315,316,319,320,211,322,325,326,329,330,333,334,337],{},"Um swap cuja taxa o hook cobra antes de rodar (uma compra ou troca de entrada exata, uma venda de saída exata) precisa se completar por inteiro: um swap que o limite de preço dele, ou um pool de ETH sem ETH suficiente, interromperia antes reverte com ",[25,317,318],{},"PartialFill",". O PoolManager encapsula o erro de um hook: ",[25,321,318],{},[25,323,324],{},"ArbitrageStarved"," chegam dentro de ",[25,327,328],{},"WrappedError(address target, bytes4 selector, bytes reason, bytes details)",", e dentro de ",[25,331,332],{},"UnexpectedRevertBytes(bytes revertData)"," quando é o V4 Quoter que os relata. Decodifique ",[25,335,336],{},"reason"," para ler o erro do hook.",[14,339,340,341,343],{},"Cada operação termina com o realinhamento do hook, que precisa de gás próprio: um swap que deixa pouco gás para ele reverte com ",[25,342,324],{}," em vez de pulá-lo. Envie os swaps com o gás que uma estimativa dá, nunca menos, e com folga: o primeiro swap depois do fechamento de uma rodada também liquida a rodada (a recompra dela e depois um realinhamento, cerca de 170.000 de gás a mais), o que uma estimativa feita antes do fechamento não conta. O app soma 500.000 de gás a cada estimativa.",[14,345,346,349],{},[25,347,348],{},"DuelRouter"," oferece uma chamada para um swap em um 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],{},"e outra para uma troca via ETH, em que o lado que você deixa é vendido no pool de ETH dele e todo o ETH obtido é gasto no do outro:",[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],{},"Uma venda em um pool de ETH do Duel que para no preço de lançamento do pool, com seu ETH esgotado, é enviada de novo pelo resto na mesma chamada, depois que o realinhamento do hook recompra do pool o que o pool entre os lados absorve: até ",[25,540,541],{},"SALE_PASSES()"," (8) swaps, enquanto o preço do pool estiver abaixo do limite dos swaps. Cada um paga a taxa do hook sobre o próprio ETH, e ",[25,544,545],{},"minAmountOut"," conta todos eles. O V4 Quoter da Uniswap cota um único swap: além do que ele executa, responde ",[25,548,549],{},"NotEnoughLiquidity",". O app cota uma venda assim executando o router como o trader (um ",[25,552,553],{},"eth_call"," com state override, ",[25,556,557],{},"DuelSimulator",").",[14,560,561,562,565],{},"O que o realinhamento já não consegue recomprar, ",[25,563,564],{},"sell"," leva pelo pool entre os lados até o pool de ETH do outro lado, para onde os realinhamentos moveram o ETH que paga por isso:",[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,662,665,666,669,670,673,674,677,678,680,681,683,684,687,688,690,691,694],{},"Vende em ",[25,663,664],{},"keyIn"," como faz ",[25,667,668],{},"swapExactIn",", depois o que sobra por ",[25,671,672],{},"keyCross",", que absorve tudo (a taxa de troca dele é queimada, como em qualquer troca), e em ",[25,675,676],{},"keyOther",", também passagem após passagem. ",[25,679,545],{}," conta o ETH dos dois pools. O que ",[25,682,676],{}," também não consegue recomprar é pago a ",[25,685,686],{},"recipient"," no token desse pool, fora do mínimo. O app vende com ",[25,689,564],{}," quando o V4 Quoter recusa uma venda e ",[25,692,693],{},"DuelSimulator.simulateSale"," mostra que assim tudo é vendido por ETH.",[14,696,697],{},"Outro router V4 faz um único swap. O hook não recusa uma venda de entrada exata que passe do que o ETH do pool consegue pagar (a taxa dele é cobrada depois do swap, sobre o ETH pago): a venda é executada em parte, até o preço de lançamento do pool, e o resto fica com o vendedor. Defina o mínimo recebido para o que pode ser executado e venda o resto em uma transação posterior, contra o que o realinhamento tiver recomprado.",[14,699,700,701,703,704,152,707,211,710,713,714,717],{},"Envie ETH com ",[25,702,668],{}," para comprar. Para vender ou trocar, aprove o router para o token, ou deixe um permit (EIP-2612) aprová-lo na mesma transação: ",[25,705,706],{},"swapExactInWithPermit",[25,708,709],{},"swapThroughEthWithPermit",[25,711,712],{},"sellWithPermit"," recebem os mesmos argumentos e o permit de quem chama para exatamente ",[25,715,716],{},"amountIn",", assinado para o router:",[30,719,721],{"className":32,"code":720,"language":34,"meta":35,"style":35},"struct Permit {\n    uint256 deadline;\n    uint8 v;\n    bytes32 r;\n    bytes32 s;\n}\n",[25,722,723,734,745,755,765,774],{"__ignoreMap":35},[39,724,725,728,731],{"class":41,"line":42},[39,726,727],{"class":45},"struct",[39,729,730],{"class":57}," Permit",[39,732,733],{"class":53}," {\n",[39,735,736,738,742],{"class":41,"line":90},[39,737,395],{"class":57},[39,739,741],{"class":740},"s8w-G"," deadline",[39,743,744],{"class":53},";\n",[39,746,747,750,753],{"class":41,"line":381},[39,748,749],{"class":57},"    uint8",[39,751,752],{"class":740}," v",[39,754,744],{"class":53},[39,756,757,760,763],{"class":41,"line":392},[39,758,759],{"class":57},"    bytes32",[39,761,762],{"class":740}," r",[39,764,744],{"class":53},[39,766,767,769,772],{"class":41,"line":403},[39,768,759],{"class":57},[39,770,771],{"class":740}," s",[39,773,744],{"class":53},[39,775,776],{"class":41,"line":413},[39,777,778],{"class":53},"}\n",[14,780,781,782,785,786,789,790,793,794,796],{},"A carteira do usuário assina os permits de cada token do Duel em um domínio EIP-712 chamado ",[25,783,784],{},"Duel",", versão ",[25,787,788],{},"1",", com o endereço do token (o ",[25,791,792],{},"eip712Domain()"," dele, ERC-5267, indica isso). O router usa o permit primeiro e ignora a falha dele: um permit já enviado por qualquer pessoa já definiu a autorização, e um que falha não muda nada; o swap então usa o que a autorização já existente cobre e reverte se não for suficiente. Um swap que se completa só em parte mantém válida a parte não utilizada da autorização. O prazo do permit limita até quando a assinatura pode ser apresentada, mas não faz expirar a autorização já concedida. O router só puxa tokens de quem chama. O ETH de uma troca fica no PoolManager para o segundo pool gastar; um pool do Duel gasta tudo ou o hook reverte o swap (",[25,795,318],{},"), e em qualquer outro pool o que ele não consegue gastar é devolvido a quem chama.",[18,798,800],{"id":799},"lançar-um-duelo","Lançar um duelo",[14,802,803,806,807,810,811,152,814,152,817,152,820,823,824,152,827,152,830,833,834,152,837,839,840,843,844,847,848,851,852,855,856,558],{},[25,804,805],{},"DuelFactory.createPair(CreateParams)"," lança um duelo; envie com a chamada a taxa de lançamento e as compras de lançamento, e o excedente é reembolsado. ",[25,808,809],{},"CreateParams"," contém ",[25,812,813],{},"nameA",[25,815,816],{},"symbolA",[25,818,819],{},"nameD",[25,821,822],{},"symbolD"," (o lado B), ",[25,825,826],{},"metadataURI",[25,828,829],{},"buyA",[25,831,832],{},"buyD"," (o ETH gasto em cada lado no lançamento, sem o imposto antissnipe), ",[25,835,836],{},"supporter",[25,838,159],{}," (conforme a numeração de categorias do app, 0 para nenhuma) e ",[25,841,842],{},"config",", o ",[25,845,846],{},"configHash()"," da fábrica como você o leu: o lançamento reverte com ",[25,849,850],{},"ConfigChanged"," se os termos mudaram desde então. Um nome ocupa de 1 a 128 bytes, um ticker de 1 a 40 e a URI dos metadados no máximo 4.096 (",[25,853,854],{},"InvalidMetadata","); uma compra de lançamento acima de 5% do supply de um lado reverte (",[25,857,858],{},"CreatorBuyTooLarge",[14,860,861,862,865,866,869,870,873,874,877],{},"A fábrica começa com os lançamentos pausados. Enquanto ",[25,863,864],{},"paused()"," for true, só ",[25,867,868],{},"owner()"," pode lançar um duelo; as chamadas dos demais revertem com ",[25,871,872],{},"CreationPaused",". O dono abre os lançamentos com ",[25,875,876],{},"setPaused(false)",". Os duelos existentes continuam sendo negociados.",[18,879,881],{"id":880},"eventos","Eventos",[226,883,884,897],{},[229,885,886],{},[232,887,888,891,894],{},[235,889,890],{},"Contrato",[235,892,893],{},"Evento",[235,895,896],{},"Quando",[251,898,899,912,928,940,952,964,976,988,1000,1012,1024,1036,1052,1070,1082],{},[232,900,901,904,909],{},[256,902,903],{},"DuelFactory",[256,905,906],{},[25,907,908],{},"PairCreated(pairId, creator, tokenA, tokenD)",[256,910,911],{},"Um duelo foi lançado",[232,913,914,917,922],{},[256,915,916],{},"DuelHook",[256,918,919],{},[25,920,921],{},"PairRegistered(pairId, tokenA, tokenD, creator, category)",[256,923,924,925,927],{},"Os pools dele foram registrados no hook, na mesma transação; ",[25,926,159],{}," é o tema dele, conforme a numeração de categorias do app (0 para nenhuma)",[232,929,930,932,937],{},[256,931,916],{},[256,933,934],{},[25,935,936],{},"FeeTaken(pairId, fee, snipeTax)",[256,938,939],{},"Uma negociação contra ETH pagou a taxa",[232,941,942,944,949],{},[256,943,916],{},[256,945,946],{},[25,947,948],{},"SwitchFeeBurned(pairId, token, amount)",[256,950,951],{},"Uma troca queimou a taxa",[232,953,954,956,961],{},[256,955,916],{},[256,957,958],{},[25,959,960],{},"ArbitrageCaptured(pairId, profit)",[256,962,963],{},"O realinhamento encheu o pote",[232,965,966,968,973],{},[256,967,916],{},[256,969,970],{},[25,971,972],{},"RoundSettled(pairId, roundIndex, averageTick, winner, ethSpent, tokensBurned)",[256,974,975],{},"Uma rodada foi fechada",[232,977,978,980,985],{},[256,979,916],{},[256,981,982],{},[25,983,984],{},"CreatorFeesClaimed(pairId, to, amount)",[256,986,987],{},"Um criador foi pago",[232,989,990,992,997],{},[256,991,903],{},[256,993,994],{},[25,995,996],{},"CreatorTransferStarted(pairId, creator, newCreator)",[256,998,999],{},"Um criador ofereceu o papel (para o endereço zero: oferta retirada)",[232,1001,1002,1004,1009],{},[256,1003,916],{},[256,1005,1006],{},[25,1007,1008],{},"CreatorChanged(pairId, from, to)",[256,1010,1011],{},"O papel de criador de um duelo mudou de mãos",[232,1013,1014,1016,1021],{},[256,1015,916],{},[256,1017,1018],{},[25,1019,1020],{},"CreatorFeesGivenUp(pairId, creator)",[256,1022,1023],{},"O criador destinou permanentemente sua parte das taxas futuras aos potes",[232,1025,1026,1028,1033],{},[256,1027,916],{},[256,1029,1030],{},[25,1031,1032],{},"ProtocolFeesClaimed(to, amount)",[256,1034,1035],{},"A tesouraria foi paga",[232,1037,1038,1040,1045],{},[256,1039,916],{},[256,1041,1042],{},[25,1043,1044],{},"ProtocolRateSet(rateBps)",[256,1046,1047,1048,1051],{},"A parte do protocolo na taxa de swap de todos os duelos mudou na hora: ele fica com ",[25,1049,1050],{},"rateBps"," dela (10.000 para toda), o resto vai para os potes",[232,1053,1054,1056,1067],{},[256,1055,903],{},[256,1057,1058,152,1061,152,1064],{},[25,1059,1060],{},"ConfigProposed(config, eta)",[25,1062,1063],{},"ConfigApplied(config)",[25,1065,1066],{},"ConfigCancelled()",[256,1068,1069],{},"Termos de lançamento propostos com 48 horas de antecedência, aplicados, retirados",[232,1071,1072,1074,1079],{},[256,1073,903],{},[256,1075,1076],{},[25,1077,1078],{},"PausedSet(paused)",[256,1080,1081],{},"Lançamentos pausados ou retomados",[232,1083,1084,1087,1092],{},[256,1085,1086],{},"PoolManager",[256,1088,1089],{},[25,1090,1091],{},"Swap(id, sender, amount0, amount1, sqrtPriceX96, liquidity, tick, fee)",[256,1093,1094,1095,1098],{},"Cada negociação, incluindo o próprio realinhamento do hook (o ",[25,1096,1097],{},"sender"," dele é o hook)",[14,1100,1101,1102,1105],{},"As listas de negociações leem os swaps dos três pools; os gráficos de preço e de divisão leem só os dois pools de ETH. As listas de holders usam os eventos ",[25,1103,1104],{},"Transfer"," dos tokens. O subgraph indexa swaps, saldos, holders e rodadas liquidadas para que o app possa carregar o histórico sem reprocessar a rede desde o lançamento.",[18,1107,1109],{"id":1108},"liquidar-e-resgatar","Liquidar e resgatar",[1111,1112,1113,1120,1130,1148],"ul",{},[1114,1115,1116,1119],"li",{},[25,1117,1118],{},"settle(pairId)"," liquida uma rodada encerrada. Qualquer pessoa pode chamá-la.",[1114,1121,1122,1125,1126,1129],{},[25,1123,1124],{},"claimCreatorFees(pairId)"," paga só o criador do duelo, a carteira que o lançou ou o endereço para o qual ela passou o papel; ",[25,1127,1128],{},"claimProtocolFees()"," paga a tesouraria configurada no momento do resgate. Qualquer pessoa pode acionar qualquer um dos dois resgates. A tesouraria pode mudar depois do prazo de 48 horas da fábrica; quem chama não pode escolher outro destinatário.",[1114,1131,1132,1135,1136,1139,1140,1143,1144,1147],{},[25,1133,1134],{},"transferCreator(pairId, newCreator)"," na fábrica oferece o papel de criador de um duelo, que ",[25,1137,1138],{},"acceptCreator(pairId)"," chamado por ",[25,1141,1142],{},"newCreator"," aceita; ",[25,1145,1146],{},"pendingCreator(pairId)"," lê a oferta. Só o criador oferece, e só o endereço a quem foi oferecido aceita.",[1114,1149,1150,1153],{},[25,1151,1152],{},"giveUpCreatorFees(pairId)"," no hook envia permanentemente a parte do criador nas taxas futuras para os potes. Só o criador atual pode chamá-lo. As taxas já acumuladas continuam disponíveis para o criador resgatar, e o papel de criador ainda pode ser passado adiante.",[1155,1156,1157],"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":1159},[1160,1161,1162,1163,1164],{"id":20,"depth":90,"text":21},{"id":217,"depth":90,"text":218},{"id":799,"depth":90,"text":800},{"id":880,"depth":90,"text":881},{"id":1108,"depth":90,"text":1109},null,"Leia duelos com o DuelLens, negocie os pools deles com o DuelRouter ou qualquer router V4 e acompanhe os eventos do hook: o guia para bots e agregadores.","md",{},true,"\u002Fpt\u002Fdocs\u002Fduel\u002Fcontracts\u002Fintegrate",{"title":5,"description":1166},"pt\u002Fdocs\u002Fduel\u002Fcontracts\u002Fintegrate","DXaUFLJMa5tM7HCRPAbjU--9o2qtsGY9ZlT45Nnjue8",1791232790268]