@whetstone-research/doppler-sdk 1.0.21 → 1.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1157,6 +1157,64 @@ function estimateSlippage(amountIn, liquidity, currentTick, fee) {
1157
1157
  return Math.min(slippage, 100);
1158
1158
  }
1159
1159
 
1160
+ // src/evm/abis/multicurve/feeClaimsAbi.ts
1161
+ var feeClaimsInitializerAbi = [
1162
+ {
1163
+ type: "function",
1164
+ name: "getCumulatedFees0",
1165
+ inputs: [{ name: "poolId", type: "bytes32", internalType: "PoolId" }],
1166
+ outputs: [{ name: "", type: "uint256", internalType: "uint256" }],
1167
+ stateMutability: "view"
1168
+ },
1169
+ {
1170
+ type: "function",
1171
+ name: "getCumulatedFees1",
1172
+ inputs: [{ name: "poolId", type: "bytes32", internalType: "PoolId" }],
1173
+ outputs: [{ name: "", type: "uint256", internalType: "uint256" }],
1174
+ stateMutability: "view"
1175
+ },
1176
+ {
1177
+ type: "function",
1178
+ name: "getLastCumulatedFees0",
1179
+ inputs: [
1180
+ { name: "poolId", type: "bytes32", internalType: "PoolId" },
1181
+ { name: "user", type: "address", internalType: "address" }
1182
+ ],
1183
+ outputs: [{ name: "", type: "uint256", internalType: "uint256" }],
1184
+ stateMutability: "view"
1185
+ },
1186
+ {
1187
+ type: "function",
1188
+ name: "getLastCumulatedFees1",
1189
+ inputs: [
1190
+ { name: "poolId", type: "bytes32", internalType: "PoolId" },
1191
+ { name: "user", type: "address", internalType: "address" }
1192
+ ],
1193
+ outputs: [{ name: "", type: "uint256", internalType: "uint256" }],
1194
+ stateMutability: "view"
1195
+ },
1196
+ {
1197
+ type: "function",
1198
+ name: "getShares",
1199
+ inputs: [
1200
+ { name: "poolId", type: "bytes32", internalType: "PoolId" },
1201
+ { name: "user", type: "address", internalType: "address" }
1202
+ ],
1203
+ outputs: [{ name: "", type: "uint256", internalType: "uint256" }],
1204
+ stateMutability: "view"
1205
+ },
1206
+ {
1207
+ type: "function",
1208
+ name: "collectFees",
1209
+ inputs: [{ name: "poolId", type: "bytes32", internalType: "PoolId" }],
1210
+ outputs: [
1211
+ { name: "fees0", type: "uint128", internalType: "uint128" },
1212
+ { name: "fees1", type: "uint128", internalType: "uint128" }
1213
+ ],
1214
+ stateMutability: "nonpayable"
1215
+ }
1216
+ ];
1217
+
1160
1218
  // src/evm/abis/bytecodes/doppler.ts
1161
1219
  var doppler_default = "0x60a06040523461057b57604051601f615c0338819003918201601f19168301916001600160401b0383118484101761057f578084926101c09460405283398101031261057b5780516001600160a01b038116810361057b5760208201516040830151906060840151608085015160a08601519061007e60c088016105b3565b9161008b60e089016105b3565b91610100890151946100a06101208b016105b3565b976101408b0151978815988915810361057b576101608d01516101808e01516001600160a01b0381169e919d91908f0361057b576101a001519062ffffff821680920361057b576080525f6101a06100f6610593565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015282610140820152826101608201528261018082015201525f6101a0610154610593565b6001815260016020820152600160408201528260608201528260808201528260a0820152600160c0820152600160e082015260016101008201528261012082015282610140820152826101608201528261018082015201526120003016151560011480159061056a575b8015610559575b801561054c575b801561053f575b8015610532575b8015610522575b8015610512575b8015610502575b80156104f6575b80156104ea575b80156104de575b80156104d2575b80156104c6575b6104b35762ffffff1960165416176016558442116104a4578660020b8860020b91818303610463575b5050508484101561045457838503858111610440578a60020b5f811380159061042b575b61041c578915610408578982066103f9578c156103eb57600f8d116103eb578484116103dc5761029861029d928b81046017558b6105c1565b610658565b628000008110156103cf5762ffffff19601854169062ffffff1617601855600d55600e55600f5560105560115562ffffff6012549160181b65ffffff0000001692169065ffffffffffff1916171760125560135562ffffff63ff000000601454921560181b1692169063ffffffff1916171760145560155560018060a01b0319600c541617600c5560405161552f90816106d48239608051818181601c01528181610205015281816102a80152818161045c0152818161050c0152818161098701528181610a1e01528181610af501528181610b9201528181610c5a01528181610e8301528181610f3a0152818161103d015281816110b201528181611d2c01528181611de40152818161217801528181613b8301528181613c4d01528181613fe9015281816140f40152614be40152f35b6335278d125f526004601cfd5b638cc99b7b60e01b5f5260045ffd5b6287e39960e61b5f5260045ffd5b6388ac089760e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b6312469eb560e11b5f5260045ffd5b5061043a81610298848d6105c1565b1561025f565b634e487b7160e01b5f52601160045260245ffd5b63536a71af60e01b5f5260045ffd5b8061049b575b610483578a9182610491575b5050610483575f808061023b565b6264847d60e41b5f5260045ffd5b1390505f80610475565b50808212610469565b632ca4094f60e21b5f5260045ffd5b630732d7b560e51b5f523060045260245ffd5b50600130161515610212565b5060023016151561020b565b50600430161515610204565b506008301615156101fd565b506010301615156101f6565b50602030161515600114156101ef565b50604030161515600114156101e8565b50608030161515600114156101e1565b50610100301615156101da565b50610200301615156101d3565b50610400301615156101cc565b5061080030161515600114156101c5565b5061100030161515600114156101be565b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b604051906101c082016001600160401b0381118382101761057f57604052565b51908160020b820361057b57565b90670de0b6b3a76400008202905f19670de0b6b3a764000084099282808510940393808503948584111561057b571461065157670de0b6b3a764000082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b808202905f1983820990828083109203918083039283670de0b6b3a7640000111561057b57146106c2577faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066993670de0b6b3a7640000910990828211900360ee1b910360121c170290565b5050670de0b6b3a76400009150049056fe608080604052600436101561005b575b50361561001a575f80fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361004c57005b6393c866c160e01b5f5260045ffd5b5f905f3560e01c908163182148ef146111155750806318cb1700146110f357806321d0ee701461109f578063259982e51461102a578063392e53cd1461100857806339518b5e14610feb578063514ea4bf14610f96578063575e24b414610ee357806357d775f814610ec65780636c2bbe7e14610e705780636c47a6c314610e535780636fe7e6eb14610c19578063897479cb14610bfb57806390ebab0a14610bdd57806391dd734614610b5e5780639ce110d714610b355780639f063efc14610ade578063a4dee15514610ab9578063b137392914610a98578063b356603014610a74578063b47b2fb1146109c6578063b6a8b0fa14610970578063c19d93fb14610921578063c4e833ce146107b6578063c70dfb4f14610795578063ce5494bb146104cb578063d0c52e21146104a9578063d65b4cb91461048b578063dc4c90d314610446578063dc98354e14610276578063dcf93f3214610250578063e1b4af69146101ee5763ee4644300361000f57346101eb57806003193601126101eb576020600d54604051908152f35b80fd5b50346101eb57600490610200366112dc565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303925061024491505057630a85dc2960e01b8152fd5b63570c108560e11b8152fd5b50346101eb57806003193601126101eb57602060ff60145460181c166040519015158152f35b50346101eb5760e03660031901126101eb5761029061116b565b5060a03660231901126101eb576102a561128e565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036104375760085460ff81166104295760ff19166001176008556001600160a01b03602435908116908181036104255750600980546001600160a01b0319169190911790556044356001600160a01b038116908181036104255750600a80546001600160a01b03191691909117905560643562ffffff8116810361042157600a5461035a612061565b60b81b62ffffff60b81b169162ffffff60a01b9060a01b169065ffffffffffff60a01b19161717600a5560a43560018060a01b03811680910361042157600b80546001600160a01b031916919091179055601e6103b5612061565b60020b136104125760145460020b6103cb612061565b60020b9081156103fe570760020b6103ef57604051636e4c1aa760e11b8152602090f35b6312469eb560e11b8152600490fd5b634e487b7160e01b83526012600452602483fd5b63013840ad60e51b8152600490fd5b5080fd5b8280fd5b62dc149f60e41b8252600482fd5b63570c108560e11b8152600490fd5b50346101eb57806003193601126101eb576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346101eb57806003193601126101eb576020600f54604051908152f35b50346101eb57806003193601126101eb5760ff60209154166040519015158152f35b50346101eb5760203660031901126101eb576104e561116b565b600c546001600160a01b031633036107865760ff825460081c161580610765575b610756577f000000000000000000000000000000000000000000000000000000000000000061059d8361057561058360405161054181611333565b610549611f3d565b815260018060a01b03871660208201528360408201526001606082015260405192839160208301611f8a565b03601f1981018352826113b4565b604051809381926348c8949160e01b8352600483016112b2565b0381836001600160a01b0387165af190811561074b57916105d785926105e2959460e09791610729575b50602080825183010191016114d8565b600695919554613282565b9161064160018060a01b0360095416926106306105fe856145cf565b948761061f8761061760018060a01b03600a54166145cf565b9a8b94614611565b600a546001600160a01b0316614611565b60a061063a611f3d565b2090614754565b5050600954600a5492976001600160a01b039182169791909316946106879250610678906001600160801b03608086901d16611472565b926001600160801b0316611472565b906001600160801b0381111561071a57506001600160801b03915b506001600160801b0381111561070b57506001600160801b03935b604080516001600160a01b0397909716875260208701919091526001600160801b03608085811d821692880192909252918216606087015285019190915290811660a08401521660c0820152f35b6001600160801b0316936106bd565b6001600160801b0316916106a2565b61074591503d8086833e61073d81836113b4565b810190611fcb565b5f6105c7565b6040513d86823e3d90fd5b63051a2a5560e51b8252600482fd5b50600454600e5411158061077a575b15610506565b50601154421015610774565b638341a67960e01b8252600482fd5b50346101eb57806003193601126101eb57602060125460020b604051908152f35b50346101eb57806003193601126101eb576020816101c0926101a06040516107dd81611362565b82815282858201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015282610140820152826101608201528261018082015201528060405161083b81611362565b60018152838101600181526040820160018152606083018481526080840185815260a0850186815260c08601906001825260e087019260018452610100880194600186526101208901968a88526101408a01988b8a526101a06101608c019b8d8d5261018081019d8e52019c8d526040519d8e916001835251151591015251151560408d015251151560608c015251151560808b015251151560a08a015251151560c089015251151560e08801525115156101008701525115156101208601525115156101408501525115156101608401525115156101808301525115156101a0820152f35b50346101eb57806003193601126101eb5760c064ffffffffff600154166002546003546004546005549160065493604051958652602086015260408501526060840152608083015260a0820152f35b50346101eb57600490610982366112dc565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330392506102449150505763567d91d160e01b8152fd5b50346101eb576101603660031901126101eb576109e161116b565b5060a03660231901126101eb5760603660c31901126101eb57610144356001600160401b03811161042157610a1a903690600401611195565b50507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610437576040610a5a610124356140d7565b82516001600160e01b03199092168252600f0b6020820152f35b50346101eb57806003193601126101eb57602060125460181c60020b604051908152f35b50346101eb57806003193601126101eb57602060145460020b604051908152f35b50346101eb57806003193601126101eb5760ff6020915460081c166040519015158152f35b50346101eb57600490610af036611225565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330393506102449250505057630a85dc2960e01b8152fd5b50346101eb57806003193601126101eb57600c546040516001600160a01b039091168152602090f35b50346101eb5760203660031901126101eb576004356001600160401b03811161042157610b8f903690600401611195565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361043757610bd9610bcd848461168f565b604051918291826112b2565b0390f35b50346101eb57806003193601126101eb576020601554604051908152f35b50346101eb57806003193601126101eb576020600e54604051908152f35b5034610e4057610100366003190112610e4057610c3461116b565b60a0366023190112610e4057610c4861128e565b5060e435908160020b809203610e40577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169133839003610e445762ffffff6016541691833b15610e4057604051635275965160e01b815292602435906001600160a01b038216808303610e40576004860152604435946001600160a01b038616808703610e4057602482015260643562ffffff8116808203610e40576044830152608435918260020b808403610e4057606482015260a435936001600160a01b038516808603610e4057608483015260a48201525f8160c481838d5af18015610e3557610e07575b509488979461057594610da6948a9994610dc29960405196610d5a88611333565b60405194610d678661137e565b85526020850152604084015260608301526080820152835260018060a01b03166020830152604082015285606082015260405192839160208301611f8a565b6040519485809481936348c8949160e01b8352600483016112b2565b03925af18015610dfc57610de3575b604051636fe7e6eb60e01b8152602090f35b610df6913d8091833e61073d81836113b4565b5f610dd1565b6040513d84823e3d90fd5b610da69399509461057594610e245f610dc299949a959b986113b4565b5f9a94509450949791969095610d39565b6040513d5f823e3d90fd5b5f80fd5b63570c108560e11b5f5260045ffd5b34610e40575f366003190112610e40576020601154604051908152f35b34610e4057610e7e36611225565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633039350610e449250505057630a85dc2960e01b5f5260045ffd5b34610e40575f366003190112610e40576020601354604051908152f35b34610e4057610140366003190112610e4057610efd61116b565b5060a0366023190112610e405760603660c3190112610e4057610124356001600160401b038111610e4057610f36903690600401611195565b50507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610e4457606062ffffff610f766120bd565b906040939293519363ffffffff60e01b1684526020840152166040820152f35b34610e40576020366003190112610e40576004355f526007602052608060405f205460ff604051918060020b83528060181c60020b6020840152600180851b038160301c16604084015260b01c166060820152f35b34610e40575f366003190112610e40576020601054604051908152f35b34610e40575f366003190112610e4057602060ff600854166040519015158152f35b34610e4057611038366111c2565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633039050610e4457306001600160a01b03909116036110905760405163259982e560e01b8152602090f35b636d1ed89b60e01b5f5260045ffd5b34610e40576110ad366111c2565b5050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633039150610e44905057630a85dc2960e01b5f5260045ffd5b34610e40575f366003190112610e4057602062ffffff60165416604051908152f35b34610e40575f366003190112610e4057600954600a54600b546001600160a01b039283168452818316602085015260a082811c62ffffff16604086015260b89290921c60020b6060850152909116608083015290f35b600435906001600160a01b0382168203610e4057565b35906001600160a01b0382168203610e4057565b9181601f84011215610e40578235916001600160401b038311610e405760208381860195010111610e4057565b90610160600319830112610e40576004356001600160a01b0381168103610e40579160a0602319820112610e4057602491608060c319830112610e405760c49161014435906001600160401b038211610e405761122191600401611195565b9091565b906101a0600319830112610e40576004356001600160a01b0381168103610e40579160a0602319820112610e4057602491608060c319830112610e405760c4916101443591610164359161018435906001600160401b038211610e405761122191600401611195565b60c435906001600160a01b0382168203610e4057565b35908160020b8203610e4057565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b610120600319820112610e40576004356001600160a01b0381168103610e40579160a0602319830112610e405760249160c4359160e4359161010435906001600160401b038211610e405761122191600401611195565b608081019081106001600160401b0382111761134e57604052565b634e487b7160e01b5f52604160045260245ffd5b6101c081019081106001600160401b0382111761134e57604052565b60a081019081106001600160401b0382111761134e57604052565b606081019081106001600160401b0382111761134e57604052565b601f909101601f19168101906001600160401b0382119082101761134e57604052565b359062ffffff82168203610e4057565b91908260a0910312610e40576040516113ff8161137e565b608061144b81839561141081611181565b855261141e60208201611181565b602086015261142f604082016113d7565b6040860152611440606082016112a4565b606086015201611181565b910152565b600201908160021161145e57565b634e487b7160e01b5f52601160045260245ffd5b9190820180921161145e57565b9060405161148c81611333565b9154600281810b8452601882901c900b6020840152603081901c6001600160801b0316604084015260b01c60ff166060830152565b600f0b60016001607f1b0319811461145e575f0390565b9190826040910312610e40576020825192015190565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b9061016092611542836060936114ee565b805160020b60a0840152602081015160020b60c0840152604081015160e084015201516101008201526101406101208201525f6101408201520190565b6001600160a01b03918216815291166020820152604081019190915260600190565b9190820391821161145e57565b6001600160401b03811161134e5760051b60200190565b906115cf826115ae565b6115dc60405191826113b4565b82815280926115ed601f19916115ae565b01905f5b8281106115fd57505050565b60209060405161160c81611333565b5f81525f838201525f60408201525f6060820152828285010152016115f1565b8051156116395760200190565b634e487b7160e01b5f52603260045260245ffd5b8051600110156116395760400190565b80518210156116395760209160051b010190565b9081549060181b65ffffff000000169065ffffff0000001916179055565b919082015f61010084830312610e40576116b5604051926116af84611333565b856113e7565b938483526116c560a08201611181565b80602085015260e06116d960c084016112a4565b92836040870152013580151594858203610e40576060015260018060a01b03169060020b92611c4e5750600164ffffffffff1981541617600155606084019261173c845160020b61173761172c85614ef6565b60125460020b61209f565b614f2e565b6014549060ff8260181c165f14611c3b5761175a9160020b9061209f565b945b61176584613378565b61176e85613378565b956040519561177c87611399565b808752602087018181526118d8604089019a888c526118d0600d54956117a06136a5565b956118088c6118036117fa6117db6117d26117c96117c46117bf61480d565b614ea2565b6136c3565b60135490614e80565b60105490614ebe565b6117f46117eb60105480936115a1565b916011546115a1565b90615033565b600d5490615113565b6136d4565b8c929083811315611c2c5761186b9293508981115f14611c275750885b928d60185460020b835160020b8082135f14611c1f5750905b50818a5260145460181c60ff1615611c105761185f9150895160020b61209f565b905b5160020b90614f2e565b60020b60208701525b855160020b966020870197885160020b14155f14611c055760ff60145460181c166118c5836118a68a5160020b613378565b8b516001600160801b039491906118bf9060020b613378565b91614fcc565b1660408801526115a1565b90848861374b565b996118eb6118e68c51611450565b6115c5565b985160020b915160020b9060018060801b03905116906040519261190e84611333565b8352602083015260408201526001606082015261192a8861162c565b526119348761162c565b50805160020b915160020b90604060018060801b0391015116906040519261195b84611333565b835260208301526040820152600260608201526119778661164d565b526119818561164d565b50835b8751811015611a3457611997818961165d565b515160020b60206119a8838b61165d565b51015160020b6001600160801b0360406119c2858d61165d565b51015116836003019182600311611a2057611a1992600195949260ff92604051946119ec86611333565b855260208501526040840152166060820152611a0783611450565b90611a12828b61165d565b528861165d565b5001611984565b634e487b7160e01b89526011600452602489fd5b50611a429293969585613a82565b611a4b8261162c565b516001855260076020526040852090805162ffffff198354169062ffffff16178255611a7e602082015160020b83611671565b60408101518254606090920151600160301b600160b81b031990921660309190911b600160301b600160b01b03161760b09190911b60ff60b01b16179055611ac58261164d565b516002855260076020526040852090805162ffffff198354169062ffffff16178255611af8602082015160020b83611671565b60408101518254606090920151600160301b600160b81b031990921660309190911b600160301b600160b01b03161760b09190911b60ff60b01b16179055835b8351811015611be557611b53611b4d82611450565b8461165d565b518160030180600311611bd1579060019291875260076020526040872090805162ffffff198354169062ffffff16178255611b95602082015160020b83611671565b604081015190825490606060ff60b01b91015160b01b16918560301b8660b01b039060301b16908560301b8660b81b0319161717905501611b38565b634e487b7160e01b87526011600452602487fd5b509291505060405190611bf96020836113b4565b81525f36602083013790565b8b60408801526115a1565b611c199161335b565b90611861565b90509061183e565b611825565b50508087526020870152611874565b611c489160020b9061335b565b9461175c565b925f9250829160015b6015546003018060031161145e57811015611ddc57805f526007602052611c8060405f2061147f565b60408101516001600160801b031680611c9e575b5050600101611c57565b611d279160409160ff6014999598995460181c1691825f14611dce57805160020b925b15611db95760ff6060611ce3611cde602085015160020b95613263565b6114c1565b9201511691845193611cf485611333565b60020b845260020b6020840152600f0b838301526060820152815180938192632d35e7ed60e11b83528c60048401611531565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1918215610e3557600192611d7e925f905f92611d86575b50611d789192613282565b96613282565b93905f611c94565b611d789250611dac915060403d8111611db2575b611da481836113b4565b8101906114d8565b91611d6d565b503d611d9a565b60ff6060611ce3611cde845160020b95613263565b602081015160020b92611cc1565b5091929390947f000000000000000000000000000000000000000000000000000000000000000091611e1860018060a01b0383511630856132c4565b926020830192611e3260018060a01b0385511630846132c4565b945f8113611ed6575b5050848413611e6a575b5050505050604051916020830152604082015260408152611e676060826113b4565b90565b91516001600160a01b039283169216823b15611ed25791611ea6939185809460405196879586948593630b0d9c0960e01b85526004850161157f565b03925af18015610dfc57611ebd575b808080611e45565b611ec88280926113b4565b6101eb5780611eb5565b8480fd5b90516001600160a01b0383811692911690823b15610e4057611f1392855f809460405196879586948593630b0d9c0960e01b85526004850161157f565b03925af18015610e3557611f28575b80611e3b565b611f359195505f906113b4565b5f935f611f22565b60405190611f4a8261137e565b6009546001600160a01b039081168352600a54808216602085015260a081901c62ffffff16604085015260b81c60020b6060840152600b54166080830152565b91909160e06060610100830194611fa28482516114ee565b60208101516001600160a01b031660a0850152604081015160020b60c085015201511515910152565b602081830312610e40578051906001600160401b038211610e40570181601f82011215610e40578051906001600160401b03821161134e576040519261201b601f8401601f1916602001856113b4565b82845260208383010111610e4057815f9260208093018386015e8301015290565b600f91820b910b019060016001607f1b0319821260016001607f1b0383131761145e57565b6084358060020b8103610e405790565b60020b627fffff19811461145e575f0390565b60020b60010190627fffff8213627fffff1983121761145e57565b9060020b9060020b0190627fffff198212627fffff83131761145e57565b5f80549160ff8360081c16613254576010544210613245576120dd61480d565b64ffffffffff600154161015613234575f9260115442101580613229575b612e7e575b509060ff5f5416155f14612e105761211661480d565b9060015461212b64ffffffffff8216846115a1565b64ffffffffff1990911664ffffffffff84161760015560035460025f526007602052946121645f8051602061550383398151915261147f565b9461219c60a06121753660246113e7565b207f0000000000000000000000000000000000000000000000000000000000000000614754565b505050946121a986614841565b608435978860020b90818a14159283610e40578a6121c691614f2e565b905f916121d68d600554906136d4565b5f198a0194908a861161145e575f8f966121f26121f791613a72565b614fac565b80971115911280612e09575b15612cac575050506122249192505160020b9161221e615332565b90614ebe565b955b60018111612c165750612262908a60055561225c670de0b6b3a764000061224f89600254614ebe565b9880612c0d575b05614ef6565b9061209f565b90612c09578761227191614f2e565b9061228d8861173761172c670de0b6b3a76400005f9905614ef6565b9760145460ff8160181c165f14612bf6576122ab9060020b8a61209f565b955b8960ff60145460181c16809b811580612be6575b15612baa57505050612ba6576122d7908361209f565b945b6122e283613378565b986122ec87613378565b908b15612b9d5715612aea5760016123058c8c84615420565b91818060a01b038c1690828060a01b0316038060ff1d9081011891818060801b031661233183826150ca565b928260601b9109151516015b975b60155461234e6118e682611450565b9060018a52600760205261236460408b2061147f565b61236d8361162c565b526123778261162c565b5060028a52600760205261238d60408b2061147f565b6123968361164d565b526123a08261164d565b50895b818110612aa25750506123c1906123bb3660246113e7565b90614afa565b5060145460181c60ff1699908a156129fc576044356001600160a01b03811681036129f857612402906123f3906145cf565b6001600160801b038316611472565b6006549061241a906001600160801b038316906115a1565b916024356001600160a01b03811681036129f4579e6118e69f936124728e969461245d8c9561244b89879a506145cf565b9060801d6001600160801b0316611472565b60809190911d6001600160801b0316906115a1565b9e5b61247f3660246113e7565b906124886136a5565b958361299457505050505060020b80825260208201528260408201525b604081018051909c6125ab916125a391612591916001600160801b031615612985575b6124d33660246113e7565b906124fa6124df6136a5565b976118036117fa6117db6117d26117c96117c46117bf61480d565b88808213156129715750818111156129685750612555815b928d606060185460020b920191825160020b8082135f146129605750905b60020b90818b5260ff60145460181c165f14611c105761185f91508a5160020b61209f565b60020b60208801525b865160020b976020880198895160020b14155f14612956575060ff60145460181c166118c5836118a68a5160020b613378565b878561259e3660246113e7565b61374b565b9e8f51611450565b9b6020825160020b92015160020b9060018060801b0390511690604051926125d284611333565b835260208301526040820152600160608201526125ee8c61162c565b526125f88b61162c565b50805160020b915160020b90604060018060801b0391015116906040519261261f84611333565b8352602083015260408201526002606082015261263b8a61164d565b526126458961164d565b50875b8b518110156126f9578b602061266d83612662818561165d565b515160020b9361165d565b51015160020b8d60406126878560018060801b039361165d565b510151168360030191826003116126e5579260ff6126de938f9360019796604051946126b286611333565b8552602085015260408401521660608201526126d76126d085611450565b809361165d565b528c61165d565b5001612648565b634e487b7160e01b8d52601160045260248dfd5b50612719919293949596999a979a6127123660246113e7565b918a613a82565b6127228761162c565b5160018a52600760205260408a2090805162ffffff198354169062ffffff16178255612755602082015160020b83611671565b60408101518254606090920151600160301b600160b81b031990921660309190911b600160301b600160b01b03161760b09190911b60ff60b01b1617905561279c8761164d565b5160028a52600760205260408a2090805162ffffff198354169062ffffff161782556127cf602082015160020b83611671565b60408101518254606090920151600160301b600160b81b031990921660309190911b600160301b600160b01b03161760b09190911b60ff60b01b16179055885b6015548110156128fc578651811061285957806003018060031161284557906001918b5260076020528a60408120555b0161280f565b634e487b7160e01b8b52601160045260248bfd5b61286b61286582611450565b8961165d565b5181600301806003116128e85790600192918c52600760205260408c2090805162ffffff198354169062ffffff161782556128ad602082015160020b83611671565b604081015190825490606060ff60b01b91015160b01b16918560301b8660b01b039060301b16908560301b8660b81b0319161717905561283f565b634e487b7160e01b8c52601160045260248cfd5b5090919295507f223157ec47d7bd04fa3ed10c0a8adb38faf97b51ec856a777425a2e39253bd739450608093966040519360020b845260020b602084015260020b60408301526060820152a15b6315d7892d60e21b929190565b60408801526115a1565b905090612530565b61255590612512565b9250508b60020b808852602088015261255e565b602085015160020b85526124c8565b838111156129ad5750506129a89450614ca4565b6124a5565b92509350506129e991508c60020b84528960020b60208501526129cf8d613378565b6001600160801b0393906129e28c613378565b9115614fcc565b1660408201526124a5565b8c80fd5b8a80fd5b6024356001600160a01b03811681036129f857612a2f90612a1c906145cf565b608083901d6001600160801b0316611472565b60065490612a4b90608083901d6001600160801b0316906115a1565b916044356001600160a01b03811681036129f4579e6118e69f93612a9c8e9694612a8b8c95612a7c89879a506145cf565b906001600160801b0316611472565b6001600160801b03909116906115a1565b9e612474565b80600301806003116128e857906001918c526007602052612ae360408d20612ad2612acc84611450565b9161147f565b612adc828861165d565b528561165d565b50016123a3565b612af58b8b836153dd565b8a826001600160a01b0380831690821611612b92575b506001600160a01b038316918215612b865760601b600160601b600160e01b0316926001600160a01b03828116929190910316612b4982828661527d565b938215612b725709612b63575b808206151591040161233d565b906001019081612b56575b8880fd5b634e487b7160e01b8c52601260045260248cfd5b62bfc9218b526004601cfd5b8c935090505f612b0b565b5050869761233f565b8680fd5b91989392509081612bd5575b50612bc2575b506122d9565b612bce9196508361335b565b945f612bbc565b905060020b8460020b13155f612bb6565b508060020b8760020b12156122c1565b612c039060020b8a61335b565b956122ad565b8580fd5b89600255612256565b612c1f906136ec565b5f198101818111611a20576121f2612c3691613a72565b808c10612c44575b50612226565b612c59612c52989298615332565b918d615033565b670de0b6b3a76400000390670de0b6b3a76400008211612c9857612c8a612c919392670de0b6b3a764000092614e80565b0590614ebe565b955f612c3e565b634e487b7160e01b8a52601160045260248afd5b9192909115612d0957505083612b6e578a612cc691614f2e565b91612cd2612c52615332565b670de0b6b3a76400000390670de0b6b3a76400008211612c9857612c8a612d039392670de0b6b3a764000092614e80565b95612226565b93509350975050612d2f60125460020b670de0b6b3a76400006002540560020b9061209f565b60185460020b5f9381135f14612dfe57905b6014549260ff8460181c1692835f14612deb57612d61915160020b61209f565b915b829985610e4057612db394612d7b8e612dab96614f2e565b938315612dd857612d8f9160020b9061209f565b915b15612dc3578160020b8160020b135f14612dbc575061335b565b60020b614e5c565b955f9695612226565b905061335b565b8160020b8160020b125f14612dbc575061335b565b612de59160020b9061335b565b91612d91565b612df8915160020b61335b565b91612d63565b505f92508990612d41565b5080612203565b915060ff60145460181c168080612e67575b8115612e47575b50612e38576240000090612949565b63016ccb0760e01b5f5260045ffd5b90501580612e56575b5f612e29565b5060c4358015158114612e50575f80fd5b905060c43580159081158103610e40575090612e22565b600454600e54111561321a5760019060ff1916175f557fe8775e4a58023f399765c3455b45eebcc45ad6b99607a1163f02e1318430970c5f80a1612ed3612ecb60a06121753660246113e7565b505050614841565b601554612ee26118e682611450565b60015f52600760205290612f025f805160206154e383398151915261147f565b612f0b8361162c565b52612f158261162c565b5060025f526007602052612f355f8051602061550383398151915261147f565b612f3e8361164d565b52612f488261164d565b505f5b8181106131e9575050612f63906123bb3660246113e7565b5060145460181c60ff1690811561319e576044356001600160a01b0381168103610e4057612fce918491612fb8906001600160801b0390612fa3906145cf565b16600f0b60018060801b0392600f0b9061203c565b165b60035490612fc93660246113e7565b614ca4565b90604080519290612fdf81856113b4565b60018452601f19015f5b81811061316f575050805160020b6020820191825160020b90604060018060801b0391015116906040519261301d84611333565b835260208301526040820152600160608201526130398461162c565b526130438361162c565b505160020b901561314657608435928360020b8403610e405761308061307a613075613093948761309898509061209f565b613378565b91613378565b9061308c3660246113e7565b9184613a82565b61162c565b5160015f52600760205260405f2090805162ffffff198354169062ffffff161782556130cb602082015160020b83611671565b60408101518254606090920151600160301b600160b81b031990921660309190911b600160301b600160b01b03161760b09190911b60ff60b01b161790555f5b6015546001810180911161145e5781101561313f578061312c600192611450565b5f5260076020525f60408120550161310b565b505f612100565b608435928360020b8403610e405761308061307a6130756130939461225c886130989950612071565b60209060405161317e81611333565b5f81525f838201525f60408201525f606082015282828801015201612fe9565b6024356001600160a01b0381168103610e4057612fce9184916131e3906001600160801b03906131cd906145cf565b6001600160801b039360801d9116600f0b61203c565b16612fba565b80600301908160031161145e576001915f52600760205261321360405f20612ad2612acc84611450565b5001612f4b565b631ed9bcf960e01b5f5260045ffd5b5060ff8116156120fb565b6315d7892d60e21b92505f91508190565b630fc95b4360e01b5f5260045ffd5b636fce6c3960e01b5f5260045ffd5b6001607f1b81101561327557600f0b90565b6335278d125f526004601cfd5b6132a5906132978360801d8260801d01614ed9565b92600f0b90600f0b01614ed9565b60018060801b03169060801b1790565b90816020910312610e40575190565b6001600160a01b039182165f9081529282166020908152604093849020935163789add5560e11b815260048101949094529183916024918391165afa908115610e35575f91613311575090565b90506020813d602011613338575b8161332c602093836113b4565b81010312610e40575190565b3d915061331f565b60020b5f190190627fffff198212627fffff83131761145e57565b600291820b910b0390627fffff198212627fffff83131761145e57565b60020b908160ff1d82810118620d89e881116136925763ffffffff9192600182167001fffcb933bd6fad37aa2d162d1a59400102600160801b189160028116613676575b6004811661365a575b6008811661363e575b60108116613622575b60208116613606575b604081166135ea575b608081166135ce575b61010081166135b2575b6102008116613596575b610400811661357a575b610800811661355e575b6110008116613542575b6120008116613526575b614000811661350a575b61800081166134ee575b6201000081166134d2575b6202000081166134b7575b62040000811661349c575b6208000016613483575b5f1261347b575b0160201c90565b5f1904613474565b6b048a170391f7dc42444e8fa290910260801c9061346d565b6d2216e584f5fa1ea926041bedfe9890920260801c91613463565b916e5d6af8dedb81196699c329225ee6040260801c91613458565b916f09aa508b5b7a84e1c677de54f3e99bc90260801c9161344d565b916f31be135f97d08fd981231505542fcfa60260801c91613442565b916f70d869a156d2a1b890bb3df62baf32f70260801c91613438565b916fa9f746462d870fdf8a65dc1f90e061e50260801c9161342e565b916fd097f3bdfd2022b8845ad8f792aa58250260801c91613424565b916fe7159475a2c29b7443b29c7fa6e889d90260801c9161341a565b916ff3392b0822b70005940c7a398e4b70f30260801c91613410565b916ff987a7253ac413176f2b074cf7815e540260801c91613406565b916ffcbe86c7900a88aedcffc83b479aa3a40260801c916133fc565b916ffe5dee046a99a2a811c461f1969c30530260801c916133f2565b916fff2ea16466c96a3843ec78b326b528610260801c916133e9565b916fff973b41fa98c081472e6896dfb254c00260801c916133e0565b916fffcb9843d60f6159c9db58835c9266440260801c916133d7565b916fffe5caca7e10e4e61c3624eaa0941cd00260801c916133ce565b916ffff2e50f5f656932ef12357cf3c7fdcc0260801c916133c5565b916ffff97272373d413259a46990580e213a0260801c916133bc565b826345c3193d60e11b5f5260045260245ffd5b604051906136b282611399565b5f6040838281528260208201520152565b905f19820191821360011661145e57565b81810392915f13801582851316918412161761145e57565b801561145e575f190190565b60020b9060020b90811561371a57627fffff1981145f1983141661145e570590565b634e487b7160e01b5f52601260045260245ffd5b8181029291811591840414171561145e57565b811561371a570490565b9291909161375761480d565b613764601354809261372e565b906137726010548093611472565b9060115492838311613a46575b61378761480d565b6001810180911161145e576137a49261379f9161372e565b611472565b91808311613a3e575b50808214613a01576137e06137cf6137e6936117f46117eb60105480936115a1565b916117f46117eb60105480936115a1565b906115a1565b936015549384805b6139c0575b5061380a6020613814920194855160020b9061335b565b8560020b906136f8565b918461384b60ff60145460181c1694855f1461398657606085015160020b90818160020b125f1461397f57505b97600d5490615113565b9180613857838561372e565b1161396f575050925b5160020b9461386e856115ae565b9561387c60405197886113b4565b858752601f1961388b876115ae565b015f5b8181106139585750505f905b8682106138ab575050505050505090565b6138b5828961165d565b519060020b905260016138e76138d9846138cf858c61165d565b515160020b61209f565b606086015160020b90614f2e565b9160206138f4828b61165d565b51018360020b9052613939878a613932602061392786613921613917828761165d565b515160020b613378565b9461165d565b51015160020b613378565b9089614fcc565b6040613945838c61165d565b510190838060801b03169052019061389a565b6020906139636136a5565b82828c0101520161388e565b6139799250613741565b92613860565b9050613841565b60608501613997815160020b612071565b60020b8260020b125f146139ad57505b976117fa565b6139bb91505160020b612071565b6139a7565b945f19860186811161145e576139d590615001565b6139de87615001565b036139fb576139ef6139f5916136ec565b956136ec565b806137ee565b946137f3565b505050505050604051613a156020826113b4565b5f81525f805b818110613a2757505090565b602090613a326136a5565b82828601015201613a1b565b91505f6137ad565b83925061377f565b805115158252602080820151908301526040908101516001600160a01b0316910152565b600160ff1b811461145e575f0390565b9392916001600160a01b039182169116818103613f83575b50505f915f5b8451811015613c0d576001600160801b036040613abd838861165d565b51015116613ace575b600101613aa0565b613b7e90604060ff60145460181c16805f14613bf557613aee838961165d565b515160020b905b15613be1576020613b06848a61165d565b51015160020b5b613b2c6001600160801b0384613b23878d61165d565b51015116613263565b60ff6060613b3a878d61165d565b5101511691845193613b4b85611333565b60020b845260020b6020840152600f0b838301526060820152815180948192632d35e7ed60e11b83528860048401611531565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1918215610e3557600192613bc4575b509050613ac6565b613bdb9060403d8111611db257611da481836113b4565b50613bbc565b613beb838961165d565b515160020b613b0d565b6020613c01848a61165d565b51015160020b90613af5565b509190928051905f19820191821161145e57602091613c2b9161165d565b5101516018549060181b65ffffff000000169065ffffff0000001916176018557f0000000000000000000000000000000000000000000000000000000000000000613c8060018060a01b0385511630836132c4565b906020850194613c9a60018060a01b0387511630846132c4565b925f8113613f1c575b848413613ea7575b848112613db4575b5050828212613cc4575b5050509050565b84516001600160a01b039081169591169190823b15613db05760405195632961046560e21b87526004870152838660248183875af195861561074b57849596613d93575b505160209291613d2d916001600160a01b0316908390613d2790613a72565b91614611565b600460405180958193630476982d60e21b83525af1908115613d875750613d58575b80808392613cbd565b613d799060203d602011613d80575b613d7181836113b4565b8101906132b5565b505f613d4f565b503d613d67565b604051903d90823e3d90fd5b84613da29195929394956113b4565b613db057908392915f613d08565b8380fd5b81516001600160a01b03848116939116833b15612ba65760405190632961046560e21b82526004820152868160248183885af18015613e9c57908791613e87575b505080516001600160a01b031680613e73575b50516001600160a01b0316613e6957613e22602091613a72565b915b600460405180948193630476982d60e21b83525af1801561074b57613e4a575b80613cb3565b613e629060203d602011613d8057613d7181836113b4565b505f613e44565b5060208491613e24565b613e819084613d2785613a72565b5f613e08565b81613e91916113b4565b612c0957855f613df5565b6040513d89823e3d90fd5b86516001600160a01b038481169116813b15612ba65785613ee392889283604051809681958294630b0d9c0960e01b845230906004850161157f565b03925af18015613f1157908691613efc575b5050613cab565b81613f06916113b4565b611ed257845f613ef5565b6040513d88823e3d90fd5b81516001600160a01b03908116908416803b15610e4057825f91613f599383604051809681958294630b0d9c0960e01b845230906004850161157f565b03925af18015610e3557613f6e575b50613ca3565b613f7b9195505f906113b4565b5f935f613f68565b60405191613f9083611399565b81108252600160208301526040820152613fc860405191633cf3645360e21b8352613fbe60048401856114ee565b60a4830190613a4e565b6101206101048201525f610124820152602081610144815f60018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165af18015610e355761401c575b80613a9a565b6140349060203d602011613d8057613d7181836113b4565b505f614016565b6101409290916140c391906001600160a01b0361405782611181565b1684526001600160a01b0361406e60208301611181565b16602085015262ffffff614084604083016113d7565b166040850152614096606082016112a4565b60020b60608501526001600160a01b03906140b390608001611181565b16608084015260a0830190613a4e565b6101206101008201525f6101208201520190565b60ff5f54166145c1576141299060a06140f13660246113e7565b207f00000000000000000000000000000000000000000000000000000000000000009061411e8183614754565b949290969150614841565b60145460181c60ff1680156145ae5760185460181c60020b8260020b135b60015f5260076020525f805160206154e38339815191525460020b9082156145a257818460020b12905b156144c05750505050906141ea91602060ff60145460181c16805f146144ac576141a561307560185460181c60020b612084565b604051916141b283611399565b151582526001838301526001600160a01b031660408083019190915251633cf3645360e21b815294859182919060246004840161403b565b03815f6001600160a01b0386165af18015610e3557614479575b61420e9250614754565b50509050925b60c435908115158203610e405762ffffff91610fff9182911561447057165b169116620f42408183020491010360ff60145460181c165f146143c757608082901d5f600f82900b1261438257600354614276916001600160801b031690611472565b6003555b600f82900b5f81126143285750505f805160206154c3833981519152916142ad60609260018060801b03166004546115a1565b6004555b600454600f548110156142e4575b600354906040519260020b835260208301526040820152a163b47b2fb160e01b905f90565b61010061ff00195f5416175f557f628a470bfdde264ef77cd19acfbfca22b3e4413adaf5837ec9fbc0043e35793f602061431c61480d565b604051908152a16142bf565b62ffffff919250614338906114c1565b9116620f42400391620f4240831161145e575f805160206154c38339815191529260609261437a91614372916001600160801b031661518e565b600454611472565b6004556142b1565b61438b906114c1565b62ffffff8216620f42400390620f4240821161145e576143bf916143b7916001600160801b031661518e565b6003546115a1565b60035561427a565b90600f81900b5f811261443357506003546143ec906001600160801b03831690611472565b6003555b60801d905f600f83900b1261442557505f805160206154c38339815191529161437a60609260018060801b03166004546115a1565b9061433862ffffff916114c1565b61443c906114c1565b62ffffff8316620f42400390620f4240821161145e57614468916143b7916001600160801b031661518e565b6003556143f0565b600c1c16614233565b6020833d6020116144a4575b81614492602093836113b4565b81010312610e405761420e9250614204565b3d9150614485565b6141a561307560185460181c60020b613340565b97949392976144d3575b50505050614214565b614534949750906144f0602092825f146145995761307590613340565b604051916144fd83611399565b1582526001838301526001600160a01b031660408083019190915251633cf3645360e21b815294859182919060246004840161403b565b03815f6001600160a01b0386165af18015610e3557614566575b6145589250614754565b50509050925f8080806144ca565b6020833d602011614591575b8161457f602093836113b4565b81010312610e4057614558925061454e565b3d9150614572565b61307590612084565b818460020b1390614171565b60185460181c60020b8260020b12614147565b5063b47b2fb160e01b905f90565b6001600160a01b0316806145e257504790565b6020602491604051928380926370a0823160e01b82523060048301525afa908115610e35575f91613311575090565b9091906001600160a01b038116908161469f5750505f80808093855af1156146365750565b6040516390bfb86560e01b81526001600160a01b0390911660048201525f602482018190526080604483015260a03d601f01601f191690810160648401523d6084840152903d9060a484013e808201600460a482015260c4633d2cec6f60e21b91015260e40190fd5b60205f604481949682604095865198899363a9059cbb60e01b855260018060a01b0316600485015260248401525af13d15601f3d116001855114161716928281528260208201520152156146f05750565b6040516390bfb86560e01b8152600481019190915263a9059cbb60e01b602482015260806044820152601f3d01601f191660a0810160648301523d60848301523d5f60a484013e808201600460a482015260c4633c9fd93960e21b91015260e40190fd5b919060209060405182810191825260066040820152604081526147786060826113b4565b519020604051631e2eaeaf60e01b8152600481019190915292839060249082906001600160a01b03165afa918215610e35575f926147d9575b506001600160a01b0382169160a081901c60020b9162ffffff60b883901c81169260d01c1690565b9091506020813d602011614805575b816147f5602093836113b4565b81010312610e405751905f6147b1565b3d91506147e8565b60105480421061483b5761482461482d91426115a1565b60135490613741565b6001810180911161145e5790565b50600190565b73fffd8963efd1fc6a506488495d951d51639616826401000276a21982016001600160a01b031611614ada57602081901b600160201b600160c01b0316808015610e4057693627a301d71055774c859160ff8260018060801b031060071b83811c60018060401b031060061b1783811c63ffffffff1060051b1783811c61ffff1060041b1783811c821060031b177b01c1818141808140018080c0814100004181408140c0c100414140c160221b6f8421084210842108cc6318c6db6d54be85831c1c601f161a17169160808310155f14614ace5750607e1982011c5b800280607f1c8160ff1c1c800280607f1c8160ff1c1c800280607f1c8160ff1c1c800280607f1c8160ff1c1c800280607f1c8160ff1c1c800280607f1c8160ff1c1c80029081607f1c8260ff1c1c80029283607f1c8460ff1c1c80029485607f1c8660ff1c1c80029687607f1c8860ff1c1c80029889607f1c8a60ff1c1c80029a8b607f1c8c60ff1c1c80029c8d80607f1c9060ff1c1c600160321b90800260cd1c169d600160331b9060cc1c169c600160341b9060cb1c169b600160351b9060ca1c169a600160361b9060c91c1699600160371b9060c81c1698600160381b9060c71c1697600160391b9060c61c16966001603a1b9060c51c16956001603b1b9060c41c16946001603c1b9060c31c16936001603d1b9060c21c16926001603e1b9060c11c16916001603f1b9060c01c1690607f190160401b1717171717171717171717171717026fdb2df09e81959a81455e260799a0632f6f028f6481ab7f045a5af012a19d003aa919820160801d60020b910160801d60020b918282145f14614aaa5750905090565b6001600160a01b0390811690614abf84613378565b1611614ac9575090565b905090565b905081607f031b61491e565b6318521d4960e21b5f9081526001600160a01b0391909116600452602490fd5b91905f905f905f5b8551811015614c8d576001600160801b036040614b1f838961165d565b51015116614b30575b600101614b02565b9192614bdf604060ff60145460181c16805f14614c7557614b51868a61165d565b515160020b905b15614c61576020614b69878b61165d565b51015160020b5b8960ff6060614b9b8a6139216001600160801b0389614b8f848961165d565b51015116600f0b6114c1565b5101511691845193614bac85611333565b60020b845260020b6020840152600f0b838301526060820152815180938192632d35e7ed60e11b83528760048401611531565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1918215610e3557600192614c36925f905f92614c3e575b50614c309192613282565b95613282565b929050614b28565b614c309250614c5b915060403d8111611db257611da481836113b4565b91614c25565b614c6b868a61165d565b515160020b614b70565b6020614c81878b61165d565b51015160020b90614b58565b505091909250614c9f82600654613282565b600655565b9093929193614cb16136a5565b9480614e0457505f5b6001600160a01b031680614cde5750505060020b80835260208301525f6040830152565b919250614de991614d9090606090614d829060b56001600160881b03821160071b82811c6001600160481b031060061b1782811c64ffffffffff1060051b1782811c62ffffff1060041b17600181811c9290921b9083901c62010000010260121c80830401811c80830401811c80830401811c80830401811c80830401811c80830401811c80830401901c908190048111900360301b6001600160a01b0316614841565b940193845160020b90614f2e565b92614dd1602087019460020b9182865260ff60145460181c1692835f14614df15750614dc690865160020b905160020b9061335b565b60020b808852613378565b93516001600160801b0394906129e29060020b613378565b166040830152565b614dff915160020b9061209f565b614dc6565b8160ff60145460181c165f14614e3d5750600654614e3891614e329160801d6001600160801b0316906115a1565b826152fd565b614cba565b600654614e3892614e57916001600160801b0316906115a1565b6152fd565b90670de0b6b3a7640000820291808305670de0b6b3a7640000149015171561145e57565b81810292915f8212600160ff1b82141661145e57818405149015171561145e57565b9060018201915f60018412911290801582169115161761145e57565b9190915f838201938412911290801582169115161761145e57565b9081600f0b918203614ee757565b6393dafdf160e01b5f5260045ffd5b80628000000160181c15614f11576335278d125f526004601cfd5b60020b90565b9060020b9060020b02908160020b91820361145e57565b9060ff60145460181c165f14614f7a575f8260020b125f14614f6d57614f6881614f63614f5e82611e679661335b565b612084565b6136f8565b614f17565b614f6881611e67936136f8565b5f8260020b125f14614f9357614f6881611e67936136f8565b614f6881614f63614fa782611e679661209f565b613340565b6117fa6117db6117d26117c96117c4611e6795614fc761480d565b614ebe565b90929091908015614ffb575f19810190811161145e57915b15614ff257611e6792615420565b611e67926153dd565b91614fe4565b61501c6150136150259261379f61480d565b6013549061372e565b60105490611472565b601154808211614ac9575090565b90670de0b6b3a76400008202905f19670de0b6b3a7640000840992828085109403938085039485841115610e4057146150c357670de0b6b3a764000082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b81810291905f1982820991838084109303928084039384600160601b1115610e40571461510a57600160601b910990828211900360a01b910360601c1790565b50505060601c90565b808202905f1983820990828083109203918083039283670de0b6b3a76400001115610e40571461517d577faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066993670de0b6b3a7640000910990828211900360ee1b910360121c170290565b5050670de0b6b3a764000091500490565b808202905f1983820990828083109203918083039283620f42401115610e4057146151ee577fde8f6cefed634549b62c77574f722e1ac57e23f24d8fd5cb790fb65668c2613993620f4240910990828211900360fa1b910360061c170290565b5050620f424091500490565b90606082901b905f19600160601b840992828085109403938085039485841115610e4057146150c3578190600160601b900981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b91818302915f1981850993838086109503948086039586851115610e4057146152f5579082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b505091500490565b90615307916151fa565b6001600160a01b03811161532d57600160a01b811015613275576001600160a01b031690565b505f90565b615378612dab615348612ecb60a0612175611f3d565b60145460181c60ff16156153ac5760125460020b808260020b135f146153a557505b60125460181c60020b61335b565b61538a614824601154601054906115a1565b90811561371a57600160ff1b81145f1983141661145e570590565b905061536a565b60125460020b808260020b125f146153a5575061536a565b6001600160a01b03918216908216039190821161145e57565b611e67926154159290916001600160a01b038083169082161161541a575b6001600160a01b039161540e91906153c4565b16906151fa565b615474565b906153fb565b611e6792615415929091906001600160a01b038082169083161161546e575b6154676154586001600160a01b038381169085166150ca565b926001600160a01b03926153c4565b169161527d565b9061543f565b6001600160801b0381169190820361548857565b60405162461bcd60e51b81526020600482015260126024820152716c6971756964697479206f766572666c6f7760701b6044820152606490fdfe27db09392d7d230eb65a11bd84925fb8da90df8a067ca8a4fc2933b4f637262bb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b828b7c774451310d1be4108bc180d1b52823cb0ee0274a6c0081bcaf94f115fb96da164736f6c634300081a000a";
1162
1220
 
@@ -12319,6 +12377,550 @@ var DynamicAuction = class {
12319
12377
  return value;
12320
12378
  }
12321
12379
  };
12380
+ var ABSENT_POOL_ERROR_ABI = [
12381
+ { type: "error", name: "PoolNotFound", inputs: [] },
12382
+ { type: "error", name: "PoolNotInitialized", inputs: [] }
12383
+ ];
12384
+ async function findMulticurveInitializerForPool({
12385
+ client,
12386
+ tokenAddress,
12387
+ addresses
12388
+ }) {
12389
+ const initializersToTry = getMulticurveInitializerCandidates(addresses);
12390
+ if (initializersToTry.length === 0) {
12391
+ throw new Error(
12392
+ "No V4 multicurve initializer addresses configured for this chain"
12393
+ );
12394
+ }
12395
+ const triedInitializers = [];
12396
+ const failedInitializers = [];
12397
+ for (const initializer of initializersToTry) {
12398
+ const { address: initializerAddress, kind } = initializer;
12399
+ triedInitializers.push(initializerAddress);
12400
+ let stateData;
12401
+ try {
12402
+ stateData = await client.readContract({
12403
+ address: initializerAddress,
12404
+ abi: getMulticurveInitializerAbi(kind),
12405
+ functionName: "getState",
12406
+ args: [tokenAddress]
12407
+ });
12408
+ } catch (error) {
12409
+ if (!isAbsentPoolReadFailure(error)) {
12410
+ throw error;
12411
+ }
12412
+ const reason = error instanceof Error ? error.message : String(error);
12413
+ failedInitializers.push(
12414
+ new Error(`${initializerAddress} getState failed: ${reason}`)
12415
+ );
12416
+ continue;
12417
+ }
12418
+ const discoveryResult = parseMulticurveInitializerDiscoveryResult({
12419
+ tokenAddress,
12420
+ initializerAddress,
12421
+ kind,
12422
+ stateData
12423
+ });
12424
+ if (isInitializedMulticurvePoolKey(discoveryResult.state.poolKey)) {
12425
+ return discoveryResult;
12426
+ }
12427
+ }
12428
+ const notFoundError = new Error(
12429
+ `Pool not found for token ${tokenAddress}. Tried initializers: ${triedInitializers.join(", ")}` + (failedInitializers.length > 0 ? `. Failed initializers: ${failedInitializers.map((error) => error.message).join(" | ")}` : "")
12430
+ );
12431
+ if (failedInitializers.length > 0) {
12432
+ notFoundError.cause = new AggregateError(
12433
+ failedInitializers,
12434
+ `Initializer discovery failed for token ${tokenAddress}`
12435
+ );
12436
+ }
12437
+ throw notFoundError;
12438
+ }
12439
+ function parseMulticurvePoolKey(rawPoolKey) {
12440
+ const poolKeyStruct = rawPoolKey;
12441
+ return {
12442
+ currency0: poolKeyStruct.currency0 ?? poolKeyStruct[0],
12443
+ currency1: poolKeyStruct.currency1 ?? poolKeyStruct[1],
12444
+ fee: Number(poolKeyStruct.fee ?? poolKeyStruct[2]),
12445
+ tickSpacing: Number(poolKeyStruct.tickSpacing ?? poolKeyStruct[3]),
12446
+ hooks: poolKeyStruct.hooks ?? poolKeyStruct[4]
12447
+ };
12448
+ }
12449
+ function getMulticurveInitializerCandidates(addresses) {
12450
+ return [
12451
+ {
12452
+ address: addresses.v4MulticurveInitializer,
12453
+ kind: "standard"
12454
+ },
12455
+ {
12456
+ address: addresses.v4ScheduledMulticurveInitializer,
12457
+ kind: "standard"
12458
+ },
12459
+ {
12460
+ address: addresses.v4DecayMulticurveInitializer,
12461
+ kind: "standard"
12462
+ },
12463
+ {
12464
+ address: addresses.dopplerHookInitializer,
12465
+ kind: "dopplerHook"
12466
+ }
12467
+ ].filter(
12468
+ (entry) => Boolean(entry.address && entry.address !== viem.zeroAddress)
12469
+ );
12470
+ }
12471
+ function getMulticurveInitializerAbi(kind) {
12472
+ return kind === "dopplerHook" ? dopplerHookInitializerAbi : v4MulticurveInitializerAbi;
12473
+ }
12474
+ function parseMulticurveInitializerDiscoveryResult({
12475
+ tokenAddress,
12476
+ initializerAddress,
12477
+ kind,
12478
+ stateData
12479
+ }) {
12480
+ const parsedState = kind === "dopplerHook" ? parseDopplerHookInitializerState(stateData) : parseStandardInitializerState(stateData);
12481
+ const { numeraire, status, poolKey, farTick } = parsedState;
12482
+ return {
12483
+ initializerAddress,
12484
+ state: {
12485
+ asset: tokenAddress,
12486
+ numeraire,
12487
+ fee: poolKey.fee,
12488
+ tickSpacing: poolKey.tickSpacing,
12489
+ status,
12490
+ poolKey,
12491
+ farTick: Number(farTick)
12492
+ }
12493
+ };
12494
+ }
12495
+ function isInitializedMulticurvePoolKey(poolKey) {
12496
+ return poolKey.hooks !== viem.zeroAddress && poolKey.tickSpacing !== 0;
12497
+ }
12498
+ function isAbsentPoolRevertData(data) {
12499
+ if (data === "0x") {
12500
+ return false;
12501
+ }
12502
+ try {
12503
+ const decodedError = viem.decodeErrorResult({
12504
+ abi: ABSENT_POOL_ERROR_ABI,
12505
+ data
12506
+ });
12507
+ return decodedError.errorName === "PoolNotFound" || decodedError.errorName === "PoolNotInitialized";
12508
+ } catch (error) {
12509
+ if (error instanceof Error) {
12510
+ return false;
12511
+ }
12512
+ throw error;
12513
+ }
12514
+ }
12515
+ function parseStandardInitializerState(stateData) {
12516
+ const state = stateData;
12517
+ return {
12518
+ numeraire: state.numeraire ?? state[0],
12519
+ status: Number(state.status ?? state[1]),
12520
+ poolKey: parseMulticurvePoolKey(state.poolKey ?? state[2]),
12521
+ farTick: Number(state.farTick ?? state[3])
12522
+ };
12523
+ }
12524
+ function parseDopplerHookInitializerState(stateData) {
12525
+ const state = stateData;
12526
+ return {
12527
+ numeraire: state.numeraire ?? state[0],
12528
+ status: Number(state.status ?? state[4]),
12529
+ poolKey: parseMulticurvePoolKey(state.poolKey ?? state[5]),
12530
+ farTick: Number(state.farTick ?? state[6])
12531
+ };
12532
+ }
12533
+ function isAbsentPoolReadFailure(error) {
12534
+ if (!(error instanceof viem.BaseError)) {
12535
+ return false;
12536
+ }
12537
+ const revertedError = error.walk(
12538
+ (cause) => cause instanceof viem.ContractFunctionRevertedError
12539
+ );
12540
+ if (!(revertedError instanceof viem.ContractFunctionRevertedError)) {
12541
+ return false;
12542
+ }
12543
+ return revertedError.data?.errorName === "PoolNotFound" || revertedError.data?.errorName === "PoolNotInitialized";
12544
+ }
12545
+
12546
+ // src/evm/entities/auction/multicurve/multicurveFeeCollection.ts
12547
+ async function collectMulticurveFees({
12548
+ client,
12549
+ walletClient,
12550
+ initializerAddress,
12551
+ state,
12552
+ addresses
12553
+ }) {
12554
+ if (state.status === 2 /* Locked */) {
12555
+ const poolId = computePoolId(state.poolKey);
12556
+ const collectFeesAbi = initializerAddress === addresses.dopplerHookInitializer ? dopplerHookInitializerAbi : v4MulticurveInitializerAbi;
12557
+ return collectFeesFromContract({
12558
+ client,
12559
+ walletClient,
12560
+ contractAddress: initializerAddress,
12561
+ abi: collectFeesAbi,
12562
+ poolId
12563
+ });
12564
+ }
12565
+ throw new Error("Multicurve pool is not locked or was migrated");
12566
+ }
12567
+ async function collectFeesFromContract({
12568
+ client,
12569
+ walletClient,
12570
+ contractAddress,
12571
+ abi,
12572
+ poolId
12573
+ }) {
12574
+ const { request, result } = await client.simulateContract({
12575
+ address: contractAddress,
12576
+ abi,
12577
+ functionName: "collectFees",
12578
+ args: [poolId],
12579
+ account: walletClient.account
12580
+ });
12581
+ const hash = await walletClient.writeContract(request);
12582
+ await client.waitForTransactionReceipt({ hash, confirmations: 1 });
12583
+ const [fees0, fees1] = result;
12584
+ return {
12585
+ fees0,
12586
+ fees1,
12587
+ transactionHash: hash
12588
+ };
12589
+ }
12590
+ async function getMulticurveFeeSchedule(client, state) {
12591
+ if (state.poolKey.fee !== DYNAMIC_FEE_FLAG) {
12592
+ return null;
12593
+ }
12594
+ const poolId = computePoolId(state.poolKey);
12595
+ try {
12596
+ const scheduleData = await client.readContract({
12597
+ address: state.poolKey.hooks,
12598
+ abi: decayMulticurveInitializerHookAbi,
12599
+ functionName: "getFeeScheduleOf",
12600
+ args: [poolId]
12601
+ });
12602
+ return {
12603
+ startingTime: Number(readStructField(scheduleData, "startingTime", 0)),
12604
+ startFee: Number(readStructField(scheduleData, "startFee", 1)),
12605
+ endFee: Number(readStructField(scheduleData, "endFee", 2)),
12606
+ lastFee: Number(readStructField(scheduleData, "lastFee", 3)),
12607
+ durationSeconds: Number(
12608
+ readStructField(scheduleData, "durationSeconds", 4)
12609
+ )
12610
+ };
12611
+ } catch (error) {
12612
+ if (!isMissingFeeScheduleHook(error)) {
12613
+ throw error;
12614
+ }
12615
+ throw new Error(
12616
+ `Dynamic multicurve hook at ${state.poolKey.hooks} does not expose getFeeScheduleOf(poolId)`,
12617
+ { cause: error }
12618
+ );
12619
+ }
12620
+ }
12621
+ function isMissingFeeScheduleHook(error) {
12622
+ if (!(error instanceof viem.BaseError)) {
12623
+ return false;
12624
+ }
12625
+ return Boolean(
12626
+ error.walk(
12627
+ (cause) => cause instanceof viem.ContractFunctionZeroDataError || cause instanceof viem.ContractFunctionRevertedError && !cause.data && !cause.reason && !cause.signature
12628
+ )
12629
+ );
12630
+ }
12631
+ function readStructField(value, fieldName, tupleIndex) {
12632
+ if (Array.isArray(value)) {
12633
+ return value[tupleIndex] ?? 0;
12634
+ }
12635
+ if (typeof value === "object" && value !== null && fieldName in value) {
12636
+ return value[fieldName] ?? 0;
12637
+ }
12638
+ return 0;
12639
+ }
12640
+ function getMulticall3Address(client) {
12641
+ const multicall3Address = client.chain?.contracts?.multicall3?.address;
12642
+ if (!multicall3Address || multicall3Address === viem.zeroAddress) {
12643
+ throw new Error(
12644
+ "Multicall3 address is not configured on this chain. Configure the viem chain multicall3 contract before previewing pending fees."
12645
+ );
12646
+ }
12647
+ return multicall3Address;
12648
+ }
12649
+ async function callAggregate3(client, calls) {
12650
+ const response = await client.call({
12651
+ to: getMulticall3Address(client),
12652
+ data: viem.encodeFunctionData({
12653
+ abi: viem.multicall3Abi,
12654
+ functionName: "aggregate3",
12655
+ args: [calls]
12656
+ })
12657
+ });
12658
+ if (!response.data) {
12659
+ throw new Error("Multicall3 aggregate3 returned no data");
12660
+ }
12661
+ return viem.decodeFunctionResult({
12662
+ abi: viem.multicall3Abi,
12663
+ functionName: "aggregate3",
12664
+ data: response.data
12665
+ });
12666
+ }
12667
+ var PENDING_FEE_CALL_ORDER = [
12668
+ "collectFees",
12669
+ "getShares",
12670
+ "getCumulatedFees0",
12671
+ "getCumulatedFees1",
12672
+ "getLastCumulatedFees0",
12673
+ "getLastCumulatedFees1"
12674
+ ];
12675
+ var PENDING_FEE_PREVIEW_CALL_COUNT = PENDING_FEE_CALL_ORDER.length;
12676
+ function createPendingFeePreviewCalls(target, poolId, beneficiary) {
12677
+ return PENDING_FEE_CALL_ORDER.map((functionName) => ({
12678
+ target,
12679
+ allowFailure: true,
12680
+ callData: viem.encodeFunctionData({
12681
+ abi: feeClaimsInitializerAbi,
12682
+ functionName,
12683
+ args: functionName === "collectFees" || functionName === "getCumulatedFees0" || functionName === "getCumulatedFees1" ? [poolId] : [poolId, beneficiary]
12684
+ })
12685
+ }));
12686
+ }
12687
+ function calculatePendingFees(callResults) {
12688
+ const preview = decodePendingFeePreview(callResults);
12689
+ if (preview.cumulatedFees0 < preview.lastCumulatedFees0) {
12690
+ throw new Error("Accumulated fees are below beneficiary checkpoint");
12691
+ }
12692
+ if (preview.cumulatedFees1 < preview.lastCumulatedFees1) {
12693
+ throw new Error("Accumulated fees are below beneficiary checkpoint");
12694
+ }
12695
+ return {
12696
+ fees0: (preview.cumulatedFees0 - preview.lastCumulatedFees0) * preview.shares / WAD,
12697
+ fees1: (preview.cumulatedFees1 - preview.lastCumulatedFees1) * preview.shares / WAD
12698
+ };
12699
+ }
12700
+ function decodePendingFeePreview(callResults) {
12701
+ if (callResults.length !== PENDING_FEE_CALL_ORDER.length) {
12702
+ throw new Error("Multicall3 aggregate3 returned an incomplete pool result");
12703
+ }
12704
+ for (const [index, result] of callResults.entries()) {
12705
+ const functionName = PENDING_FEE_CALL_ORDER[index];
12706
+ if (!result.success) {
12707
+ throw new Error(`${functionName} call failed`);
12708
+ }
12709
+ if (!result.returnData || result.returnData === "0x") {
12710
+ throw new Error(`${functionName} returned no data`);
12711
+ }
12712
+ }
12713
+ viem.decodeFunctionResult({
12714
+ abi: feeClaimsInitializerAbi,
12715
+ functionName: "collectFees",
12716
+ data: callResults[0].returnData
12717
+ });
12718
+ return {
12719
+ shares: decodeUint256("getShares", callResults[1].returnData),
12720
+ cumulatedFees0: decodeUint256(
12721
+ "getCumulatedFees0",
12722
+ callResults[2].returnData
12723
+ ),
12724
+ cumulatedFees1: decodeUint256(
12725
+ "getCumulatedFees1",
12726
+ callResults[3].returnData
12727
+ ),
12728
+ lastCumulatedFees0: decodeUint256(
12729
+ "getLastCumulatedFees0",
12730
+ callResults[4].returnData
12731
+ ),
12732
+ lastCumulatedFees1: decodeUint256(
12733
+ "getLastCumulatedFees1",
12734
+ callResults[5].returnData
12735
+ )
12736
+ };
12737
+ }
12738
+ function decodeUint256(functionName, data) {
12739
+ const value = viem.decodeFunctionResult({
12740
+ abi: feeClaimsInitializerAbi,
12741
+ functionName,
12742
+ data
12743
+ });
12744
+ if (typeof value !== "bigint") {
12745
+ throw new Error(`${functionName} returned invalid data`);
12746
+ }
12747
+ return value;
12748
+ }
12749
+
12750
+ // src/evm/entities/auction/multicurve/multicurvePendingFeeReader.ts
12751
+ async function getPendingFeesForMulticurvePool({
12752
+ client,
12753
+ beneficiary,
12754
+ poolContext
12755
+ }) {
12756
+ const pendingFees = await getPendingFeesForDiscoveredMulticurvePools({
12757
+ client,
12758
+ beneficiary,
12759
+ poolContexts: [poolContext]
12760
+ });
12761
+ const poolPendingFees = pendingFees[0];
12762
+ if (!poolPendingFees) {
12763
+ throw new Error("Pending fee preview returned no pool result");
12764
+ }
12765
+ return {
12766
+ fees0: poolPendingFees.fees0,
12767
+ fees1: poolPendingFees.fees1
12768
+ };
12769
+ }
12770
+ async function getPendingFeesForMulticurveTokens({
12771
+ client,
12772
+ beneficiary,
12773
+ tokenAddresses
12774
+ }) {
12775
+ if (tokenAddresses.length === 0) {
12776
+ return [];
12777
+ }
12778
+ const feeClient = client;
12779
+ const poolContexts = await discoverMulticurveFeePoolContexts(
12780
+ feeClient,
12781
+ tokenAddresses
12782
+ );
12783
+ return getPendingFeesForDiscoveredMulticurvePools({
12784
+ client: feeClient,
12785
+ beneficiary,
12786
+ poolContexts
12787
+ });
12788
+ }
12789
+ async function discoverMulticurveFeePoolContexts(client, tokenAddresses) {
12790
+ const chainId = await client.getChainId();
12791
+ const addresses = getAddresses(chainId);
12792
+ const initializers = getMulticurveInitializerCandidates(addresses);
12793
+ if (initializers.length === 0) {
12794
+ throw new Error(
12795
+ "No V4 multicurve initializer addresses configured for this chain"
12796
+ );
12797
+ }
12798
+ const discoveryContexts = createDiscoveryCallContexts(
12799
+ tokenAddresses,
12800
+ initializers
12801
+ );
12802
+ const discoveryResults = await callAggregate3(
12803
+ client,
12804
+ createDiscoveryCalls(discoveryContexts)
12805
+ );
12806
+ if (discoveryResults.length !== discoveryContexts.length) {
12807
+ throw new Error(
12808
+ "Multicall3 aggregate3 returned an incomplete initializer discovery result"
12809
+ );
12810
+ }
12811
+ return tokenAddresses.map(
12812
+ (tokenAddress, tokenIndex) => findInitializedPoolForToken({
12813
+ tokenAddress,
12814
+ initializers,
12815
+ discoveryResults: discoveryResults.slice(
12816
+ tokenIndex * initializers.length,
12817
+ (tokenIndex + 1) * initializers.length
12818
+ )
12819
+ })
12820
+ );
12821
+ }
12822
+ function createDiscoveryCallContexts(tokenAddresses, initializers) {
12823
+ return tokenAddresses.flatMap(
12824
+ (tokenAddress) => initializers.map((initializer) => ({
12825
+ tokenAddress,
12826
+ initializer
12827
+ }))
12828
+ );
12829
+ }
12830
+ function createDiscoveryCalls(contexts) {
12831
+ return contexts.map(({ tokenAddress, initializer }) => ({
12832
+ target: initializer.address,
12833
+ allowFailure: true,
12834
+ callData: viem.encodeFunctionData({
12835
+ abi: getMulticurveInitializerAbi(initializer.kind),
12836
+ functionName: "getState",
12837
+ args: [tokenAddress]
12838
+ })
12839
+ }));
12840
+ }
12841
+ function findInitializedPoolForToken({
12842
+ tokenAddress,
12843
+ initializers,
12844
+ discoveryResults
12845
+ }) {
12846
+ for (const [index, result] of discoveryResults.entries()) {
12847
+ const initializer = initializers[index];
12848
+ if (!initializer) {
12849
+ throw new Error(
12850
+ "Multicall3 aggregate3 returned an incomplete initializer discovery result"
12851
+ );
12852
+ }
12853
+ if (!result.success) {
12854
+ if (isAbsentPoolRevertData(result.returnData)) {
12855
+ continue;
12856
+ }
12857
+ throw new Error(
12858
+ `${initializer.address} getState failed for token ${tokenAddress}`
12859
+ );
12860
+ }
12861
+ if (!result.returnData || result.returnData === "0x") {
12862
+ throw new Error(
12863
+ `${initializer.address} getState returned no data for token ${tokenAddress}`
12864
+ );
12865
+ }
12866
+ const discoveryResult = parseMulticurveInitializerDiscoveryResult({
12867
+ tokenAddress,
12868
+ initializerAddress: initializer.address,
12869
+ kind: initializer.kind,
12870
+ stateData: viem.decodeFunctionResult({
12871
+ abi: getMulticurveInitializerAbi(initializer.kind),
12872
+ functionName: "getState",
12873
+ data: result.returnData
12874
+ })
12875
+ });
12876
+ if (isInitializedMulticurvePoolKey(discoveryResult.state.poolKey)) {
12877
+ assertPendingFeePreviewable(discoveryResult);
12878
+ return discoveryResult;
12879
+ }
12880
+ }
12881
+ throw new Error(
12882
+ `Pool not found for token ${tokenAddress}. Tried initializers: ${initializers.map((initializer) => initializer.address).join(", ")}`
12883
+ );
12884
+ }
12885
+ function assertPendingFeePreviewable(discoveryResult) {
12886
+ const { asset, status } = discoveryResult.state;
12887
+ if (status === 3 /* Exited */) {
12888
+ throw new Error(
12889
+ `Pending fee preview is only supported for initializer-side multicurve pools: ${asset}`
12890
+ );
12891
+ }
12892
+ if (status !== 2 /* Locked */) {
12893
+ throw new Error(`Multicurve pool is not locked or was migrated: ${asset}`);
12894
+ }
12895
+ }
12896
+ async function getPendingFeesForDiscoveredMulticurvePools({
12897
+ client,
12898
+ beneficiary,
12899
+ poolContexts
12900
+ }) {
12901
+ for (const poolContext of poolContexts) {
12902
+ assertPendingFeePreviewable(poolContext);
12903
+ }
12904
+ const previewCalls = poolContexts.flatMap(
12905
+ ({ initializerAddress, state }) => createPendingFeePreviewCalls(
12906
+ initializerAddress,
12907
+ computePoolId(state.poolKey),
12908
+ beneficiary
12909
+ )
12910
+ );
12911
+ const previewResults = await callAggregate3(client, previewCalls);
12912
+ return poolContexts.map(({ state }, index) => ({
12913
+ tokenAddress: state.asset,
12914
+ ...calculatePendingFees(
12915
+ previewResults.slice(
12916
+ index * PENDING_FEE_PREVIEW_CALL_COUNT,
12917
+ (index + 1) * PENDING_FEE_PREVIEW_CALL_COUNT
12918
+ )
12919
+ )
12920
+ }));
12921
+ }
12922
+
12923
+ // src/evm/entities/auction/MulticurvePool.ts
12322
12924
  var MulticurvePool = class {
12323
12925
  client;
12324
12926
  walletClient;
@@ -12359,130 +12961,47 @@ var MulticurvePool = class {
12359
12961
  async findInitializerForPool() {
12360
12962
  const chainId = await this.rpc.getChainId();
12361
12963
  const addresses = getAddresses(chainId);
12362
- const initializersToTry = [
12363
- {
12364
- address: addresses.v4MulticurveInitializer,
12365
- kind: "standard"
12366
- },
12367
- {
12368
- address: addresses.v4ScheduledMulticurveInitializer,
12369
- kind: "standard"
12370
- },
12371
- {
12372
- address: addresses.v4DecayMulticurveInitializer,
12373
- kind: "standard"
12374
- },
12375
- {
12376
- address: addresses.dopplerHookInitializer,
12377
- kind: "dopplerHook"
12378
- }
12379
- ].filter(
12380
- (entry) => entry.address !== void 0 && entry.address !== viem.zeroAddress
12381
- );
12382
- if (initializersToTry.length === 0) {
12383
- throw new Error(
12384
- "No V4 multicurve initializer addresses configured for this chain"
12385
- );
12386
- }
12387
- const triedInitializers = [];
12388
- for (const initializer of initializersToTry) {
12389
- const { address: initializerAddress, kind } = initializer;
12390
- triedInitializers.push(initializerAddress);
12391
- const stateData = await this.rpc.readContract({
12392
- address: initializerAddress,
12393
- abi: kind === "dopplerHook" ? dopplerHookInitializerAbi : v4MulticurveInitializerAbi,
12394
- functionName: "getState",
12395
- args: [this.tokenAddress]
12396
- });
12397
- const parsedState = kind === "dopplerHook" ? this.parseDopplerHookInitializerState(stateData) : this.parseStandardInitializerState(stateData);
12398
- const { numeraire, status, poolKey, farTick } = parsedState;
12399
- if (poolKey.hooks !== viem.zeroAddress && poolKey.tickSpacing !== 0) {
12400
- const state = {
12401
- asset: this.tokenAddress,
12402
- numeraire,
12403
- fee: poolKey.fee,
12404
- tickSpacing: poolKey.tickSpacing,
12405
- status,
12406
- poolKey,
12407
- farTick: Number(farTick)
12408
- };
12409
- return { initializerAddress, state };
12410
- }
12411
- }
12412
- throw new Error(
12413
- `Pool not found for token ${this.tokenAddress}. Tried initializers: ${triedInitializers.join(", ")}`
12414
- );
12964
+ return findMulticurveInitializerForPool({
12965
+ client: this.rpc,
12966
+ tokenAddress: this.tokenAddress,
12967
+ addresses
12968
+ });
12415
12969
  }
12416
12970
  /**
12417
- * Collect fees from the pool and distribute to beneficiaries
12971
+ * Collect fees from a locked initializer-side pool.
12418
12972
  *
12419
- * This function can be called by any beneficiary to trigger fee collection
12420
- * and distribution. Fees are automatically distributed according to the
12421
- * configured beneficiary shares.
12973
+ * This function can be called by any account to pull pool fees into the
12974
+ * initializer. If the caller is a configured beneficiary, their pending share
12975
+ * is released as part of the same transaction.
12422
12976
  *
12423
- * @returns Object containing the amounts of fees0 and fees1 distributed, and the transaction hash
12977
+ * @returns Object containing the contract's collectFees return values and the transaction hash.
12978
+ * The returned fee amounts are newly collected pool fees, not necessarily the caller's beneficiary payout.
12424
12979
  */
12425
12980
  async collectFees() {
12426
- if (!this.walletClient) {
12981
+ const walletClient = this.walletClient;
12982
+ if (!walletClient) {
12427
12983
  throw new Error("Wallet client required to collect fees");
12428
12984
  }
12429
12985
  const chainId = await this.rpc.getChainId();
12430
12986
  const addresses = getAddresses(chainId);
12431
12987
  const { initializerAddress, state } = await this.findInitializerForPool();
12432
- if (state.status === 2 /* Locked */) {
12433
- const poolId = computePoolId(state.poolKey);
12434
- const collectFeesAbi = initializerAddress === addresses.dopplerHookInitializer ? dopplerHookInitializerAbi : v4MulticurveInitializerAbi;
12435
- return this.collectFeesFromContract(
12436
- initializerAddress,
12437
- collectFeesAbi,
12438
- poolId
12439
- );
12440
- }
12441
- if (state.status === 3 /* Exited */) {
12442
- if (!addresses.v4Migrator) {
12443
- throw new Error(
12444
- "V4 multicurve migrator address not configured for this chain"
12445
- );
12446
- }
12447
- const assetData = await this.rpc.readContract({
12448
- address: addresses.v4Migrator,
12449
- abi: v4MulticurveMigratorAbi,
12450
- functionName: "getAssetData",
12451
- args: [state.poolKey.currency0, state.poolKey.currency1]
12452
- });
12453
- const migratorPoolKey = this.parsePoolKey(
12454
- assetData.poolKey ?? assetData[1]
12455
- );
12456
- const poolId = computePoolId(migratorPoolKey);
12457
- const beneficiaries = assetData.beneficiaries ?? assetData[4] ?? [];
12458
- if (!Array.isArray(beneficiaries) || beneficiaries.length === 0) {
12459
- throw new Error(
12460
- "Migrated multicurve pool has no beneficiaries configured"
12461
- );
12462
- }
12463
- const lockerAddress = await this.resolveLockerAddress(
12464
- addresses.v4Migrator,
12465
- addresses.streamableFeesLocker
12466
- );
12467
- const streamData = await this.rpc.readContract({
12468
- address: lockerAddress,
12469
- abi: streamableFeesLockerAbi,
12470
- functionName: "streams",
12471
- args: [poolId]
12472
- });
12473
- const startDate = Number(
12474
- streamData.startDate ?? streamData[2] ?? 0
12475
- );
12476
- if (startDate === 0) {
12477
- throw new Error("Migrated multicurve stream not initialized");
12478
- }
12479
- return this.collectFeesFromContract(
12480
- lockerAddress,
12481
- streamableFeesLockerAbi,
12482
- poolId
12483
- );
12484
- }
12485
- throw new Error("Multicurve pool is not locked or migrated");
12988
+ return collectMulticurveFees({
12989
+ client: this.rpc,
12990
+ walletClient,
12991
+ initializerAddress,
12992
+ state,
12993
+ addresses
12994
+ });
12995
+ }
12996
+ /**
12997
+ * Preview pending fees for a beneficiary on an initializer-side multicurve pool.
12998
+ */
12999
+ async getPendingFees(beneficiary) {
13000
+ return getPendingFeesForMulticurvePool({
13001
+ client: this.rpc,
13002
+ beneficiary,
13003
+ poolContext: await this.findInitializerForPool()
13004
+ });
12486
13005
  }
12487
13006
  /**
12488
13007
  * Get the numeraire address for this pool
@@ -12498,93 +13017,58 @@ var MulticurvePool = class {
12498
13017
  */
12499
13018
  async getFeeSchedule() {
12500
13019
  const { state } = await this.findInitializerForPool();
12501
- if (state.poolKey.fee !== DYNAMIC_FEE_FLAG) {
12502
- return null;
13020
+ return getMulticurveFeeSchedule(this.rpc, state);
13021
+ }
13022
+ };
13023
+
13024
+ // src/evm/entities/auction/MulticurveFees.ts
13025
+ var MulticurveFees = class {
13026
+ client;
13027
+ tokenAddresses;
13028
+ options;
13029
+ constructor(client, _walletClient, tokenAddresses, options = {}) {
13030
+ this.client = client;
13031
+ this.tokenAddresses = [...tokenAddresses];
13032
+ this.options = { ...options };
13033
+ }
13034
+ async getPendingFees(beneficiary, tokenAddressesOrOptions, options) {
13035
+ const hasTokenAddressOverride = isTokenAddressList(tokenAddressesOrOptions);
13036
+ const tokenAddresses = hasTokenAddressOverride ? tokenAddressesOrOptions : this.tokenAddresses;
13037
+ const callOptions = hasTokenAddressOverride ? options : tokenAddressesOrOptions;
13038
+ const tokenBatchSize = getTokenBatchSize(
13039
+ callOptions?.tokenBatchSize ?? this.options.tokenBatchSize
13040
+ );
13041
+ if (!tokenBatchSize || tokenAddresses.length <= tokenBatchSize) {
13042
+ return getPendingFeesForMulticurveTokens({
13043
+ client: this.client,
13044
+ beneficiary,
13045
+ tokenAddresses
13046
+ });
12503
13047
  }
12504
- const poolId = computePoolId(state.poolKey);
12505
- try {
12506
- const scheduleData = await this.rpc.readContract({
12507
- address: state.poolKey.hooks,
12508
- abi: decayMulticurveInitializerHookAbi,
12509
- functionName: "getFeeScheduleOf",
12510
- args: [poolId]
13048
+ let pendingFees = [];
13049
+ for (let index = 0; index < tokenAddresses.length; index += tokenBatchSize) {
13050
+ const batchPendingFees = await getPendingFeesForMulticurveTokens({
13051
+ client: this.client,
13052
+ beneficiary,
13053
+ tokenAddresses: tokenAddresses.slice(index, index + tokenBatchSize)
12511
13054
  });
12512
- const scheduleStruct = scheduleData;
12513
- return {
12514
- startingTime: Number(
12515
- scheduleStruct.startingTime ?? scheduleStruct[0] ?? 0
12516
- ),
12517
- startFee: Number(scheduleStruct.startFee ?? scheduleStruct[1] ?? 0),
12518
- endFee: Number(scheduleStruct.endFee ?? scheduleStruct[2] ?? 0),
12519
- lastFee: Number(scheduleStruct.lastFee ?? scheduleStruct[3] ?? 0),
12520
- durationSeconds: Number(
12521
- scheduleStruct.durationSeconds ?? scheduleStruct[4] ?? 0
12522
- )
12523
- };
12524
- } catch {
12525
- throw new Error(
12526
- `Dynamic multicurve hook at ${state.poolKey.hooks} does not expose getFeeScheduleOf(poolId)`
12527
- );
13055
+ pendingFees = [...pendingFees, ...batchPendingFees];
12528
13056
  }
13057
+ return pendingFees;
12529
13058
  }
12530
- parsePoolKey(rawPoolKey) {
12531
- const poolKeyStruct = rawPoolKey;
12532
- return {
12533
- currency0: poolKeyStruct.currency0 ?? poolKeyStruct[0],
12534
- currency1: poolKeyStruct.currency1 ?? poolKeyStruct[1],
12535
- fee: Number(poolKeyStruct.fee ?? poolKeyStruct[2]),
12536
- tickSpacing: Number(poolKeyStruct.tickSpacing ?? poolKeyStruct[3]),
12537
- hooks: poolKeyStruct.hooks ?? poolKeyStruct[4]
12538
- };
12539
- }
12540
- parseStandardInitializerState(stateData) {
12541
- const state = stateData;
12542
- return {
12543
- numeraire: state.numeraire ?? state[0],
12544
- status: Number(state.status ?? state[1]),
12545
- poolKey: this.parsePoolKey(state.poolKey ?? state[2]),
12546
- farTick: Number(state.farTick ?? state[3])
12547
- };
12548
- }
12549
- parseDopplerHookInitializerState(stateData) {
12550
- const state = stateData;
12551
- return {
12552
- numeraire: state.numeraire ?? state[0],
12553
- status: Number(state.status ?? state[4]),
12554
- poolKey: this.parsePoolKey(state.poolKey ?? state[5]),
12555
- farTick: Number(state.farTick ?? state[6])
12556
- };
13059
+ };
13060
+ function isTokenAddressList(value) {
13061
+ return Array.isArray(value);
13062
+ }
13063
+ function getTokenBatchSize(tokenBatchSize) {
13064
+ if (tokenBatchSize === void 0) {
13065
+ return void 0;
12557
13066
  }
12558
- async resolveLockerAddress(migratorAddress, configuredLocker) {
12559
- if (configuredLocker) {
12560
- return configuredLocker;
12561
- }
12562
- const lockerAddress = await this.rpc.readContract({
12563
- address: migratorAddress,
12564
- abi: v4MulticurveMigratorAbi,
12565
- functionName: "locker",
12566
- args: []
12567
- });
12568
- return lockerAddress;
13067
+ if (!Number.isInteger(tokenBatchSize) || tokenBatchSize < 1) {
13068
+ throw new Error("tokenBatchSize must be a positive integer");
12569
13069
  }
12570
- async collectFeesFromContract(contractAddress, abi, poolId) {
12571
- const { request, result } = await this.rpc.simulateContract({
12572
- address: contractAddress,
12573
- abi,
12574
- functionName: "collectFees",
12575
- args: [poolId],
12576
- account: this.walletClient.account
12577
- });
12578
- const hash = await this.walletClient.writeContract(request);
12579
- await this.rpc.waitForTransactionReceipt({ hash, confirmations: 1 });
12580
- const [fees0, fees1] = result;
12581
- return {
12582
- fees0,
12583
- fees1,
12584
- transactionHash: hash
12585
- };
12586
- }
12587
- };
13070
+ return tokenBatchSize;
13071
+ }
12588
13072
 
12589
13073
  // src/evm/entities/auction/RehypeDopplerHook.ts
12590
13074
  var RehypeDopplerHook = class {
@@ -18828,6 +19312,7 @@ exports.MAX_TICK = MAX_TICK;
18828
19312
  exports.MIN_SQRT_RATIO = MIN_SQRT_RATIO;
18829
19313
  exports.MIN_TICK = MIN_TICK;
18830
19314
  exports.MulticurveBuilder = MulticurveBuilder;
19315
+ exports.MulticurveFees = MulticurveFees;
18831
19316
  exports.MulticurvePool = MulticurvePool;
18832
19317
  exports.NO_OP_ENABLED_CHAIN_IDS = NO_OP_ENABLED_CHAIN_IDS;
18833
19318
  exports.OPENING_AUCTION_FLAGS = OPENING_AUCTION_FLAGS;
@@ -18888,6 +19373,7 @@ exports.dopplerLensAbi = dopplerLensAbi;
18888
19373
  exports.encodeRehypeDopplerHookMigratorCalldata = encodeRehypeDopplerHookMigratorCalldata;
18889
19374
  exports.estimatePriceAtEpoch = estimatePriceAtEpoch;
18890
19375
  exports.estimateSlippage = estimateSlippage;
19376
+ exports.feeClaimsInitializerAbi = feeClaimsInitializerAbi;
18891
19377
  exports.formatTickAsPrice = formatTickAsPrice;
18892
19378
  exports.getAddresses = getAddresses;
18893
19379
  exports.getAirlockBeneficiary = getAirlockBeneficiary;