@whetstone-research/doppler-sdk 1.0.20 → 1.0.22

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,335 @@ var DynamicAuction = class {
12319
12377
  return value;
12320
12378
  }
12321
12379
  };
12380
+ function getMulticall3Address(client) {
12381
+ const multicall3Address = client.chain?.contracts?.multicall3?.address;
12382
+ if (!multicall3Address || multicall3Address === viem.zeroAddress) {
12383
+ throw new Error(
12384
+ "Multicall3 address is not configured on this chain. Configure the viem chain multicall3 contract before previewing pending fees."
12385
+ );
12386
+ }
12387
+ return multicall3Address;
12388
+ }
12389
+ async function callAggregate3(client, calls) {
12390
+ const response = await client.call({
12391
+ to: getMulticall3Address(client),
12392
+ data: viem.encodeFunctionData({
12393
+ abi: viem.multicall3Abi,
12394
+ functionName: "aggregate3",
12395
+ args: [calls]
12396
+ })
12397
+ });
12398
+ if (!response.data) {
12399
+ throw new Error("Multicall3 aggregate3 returned no data");
12400
+ }
12401
+ return viem.decodeFunctionResult({
12402
+ abi: viem.multicall3Abi,
12403
+ functionName: "aggregate3",
12404
+ data: response.data
12405
+ });
12406
+ }
12407
+ var PENDING_FEE_CALL_ORDER = [
12408
+ "collectFees",
12409
+ "getShares",
12410
+ "getCumulatedFees0",
12411
+ "getCumulatedFees1",
12412
+ "getLastCumulatedFees0",
12413
+ "getLastCumulatedFees1"
12414
+ ];
12415
+ function createPendingFeePreviewCalls(target, poolId, beneficiary) {
12416
+ return PENDING_FEE_CALL_ORDER.map((functionName) => ({
12417
+ target,
12418
+ allowFailure: true,
12419
+ callData: viem.encodeFunctionData({
12420
+ abi: feeClaimsInitializerAbi,
12421
+ functionName,
12422
+ args: functionName === "collectFees" || functionName === "getCumulatedFees0" || functionName === "getCumulatedFees1" ? [poolId] : [poolId, beneficiary]
12423
+ })
12424
+ }));
12425
+ }
12426
+ function calculatePendingFees(callResults) {
12427
+ const preview = decodePendingFeePreview(callResults);
12428
+ if (preview.cumulatedFees0 < preview.lastCumulatedFees0) {
12429
+ throw new Error("Accumulated fees are below beneficiary checkpoint");
12430
+ }
12431
+ if (preview.cumulatedFees1 < preview.lastCumulatedFees1) {
12432
+ throw new Error("Accumulated fees are below beneficiary checkpoint");
12433
+ }
12434
+ return {
12435
+ fees0: (preview.cumulatedFees0 - preview.lastCumulatedFees0) * preview.shares / WAD,
12436
+ fees1: (preview.cumulatedFees1 - preview.lastCumulatedFees1) * preview.shares / WAD
12437
+ };
12438
+ }
12439
+ function decodePendingFeePreview(callResults) {
12440
+ if (callResults.length !== PENDING_FEE_CALL_ORDER.length) {
12441
+ throw new Error("Multicall3 aggregate3 returned an incomplete pool result");
12442
+ }
12443
+ for (const [index, result] of callResults.entries()) {
12444
+ const functionName = PENDING_FEE_CALL_ORDER[index];
12445
+ if (!result.success) {
12446
+ throw new Error(`${functionName} call failed`);
12447
+ }
12448
+ if (!result.returnData || result.returnData === "0x") {
12449
+ throw new Error(`${functionName} returned no data`);
12450
+ }
12451
+ }
12452
+ viem.decodeFunctionResult({
12453
+ abi: feeClaimsInitializerAbi,
12454
+ functionName: "collectFees",
12455
+ data: callResults[0].returnData
12456
+ });
12457
+ return {
12458
+ shares: decodeUint256("getShares", callResults[1].returnData),
12459
+ cumulatedFees0: decodeUint256(
12460
+ "getCumulatedFees0",
12461
+ callResults[2].returnData
12462
+ ),
12463
+ cumulatedFees1: decodeUint256(
12464
+ "getCumulatedFees1",
12465
+ callResults[3].returnData
12466
+ ),
12467
+ lastCumulatedFees0: decodeUint256(
12468
+ "getLastCumulatedFees0",
12469
+ callResults[4].returnData
12470
+ ),
12471
+ lastCumulatedFees1: decodeUint256(
12472
+ "getLastCumulatedFees1",
12473
+ callResults[5].returnData
12474
+ )
12475
+ };
12476
+ }
12477
+ function decodeUint256(functionName, data) {
12478
+ const value = viem.decodeFunctionResult({
12479
+ abi: feeClaimsInitializerAbi,
12480
+ functionName,
12481
+ data
12482
+ });
12483
+ if (typeof value !== "bigint") {
12484
+ throw new Error(`${functionName} returned invalid data`);
12485
+ }
12486
+ return value;
12487
+ }
12488
+ async function findMulticurveInitializerForPool({
12489
+ client,
12490
+ tokenAddress,
12491
+ addresses
12492
+ }) {
12493
+ const initializersToTry = getInitializerCandidates(addresses);
12494
+ if (initializersToTry.length === 0) {
12495
+ throw new Error(
12496
+ "No V4 multicurve initializer addresses configured for this chain"
12497
+ );
12498
+ }
12499
+ const triedInitializers = [];
12500
+ const failedInitializers = [];
12501
+ for (const initializer of initializersToTry) {
12502
+ const { address: initializerAddress, kind } = initializer;
12503
+ triedInitializers.push(initializerAddress);
12504
+ let stateData;
12505
+ try {
12506
+ stateData = await client.readContract({
12507
+ address: initializerAddress,
12508
+ abi: kind === "dopplerHook" ? dopplerHookInitializerAbi : v4MulticurveInitializerAbi,
12509
+ functionName: "getState",
12510
+ args: [tokenAddress]
12511
+ });
12512
+ } catch (error) {
12513
+ if (!isAbsentPoolReadFailure(error)) {
12514
+ throw error;
12515
+ }
12516
+ const reason = error instanceof Error ? error.message : String(error);
12517
+ failedInitializers.push(
12518
+ new Error(`${initializerAddress} getState failed: ${reason}`)
12519
+ );
12520
+ continue;
12521
+ }
12522
+ const parsedState = kind === "dopplerHook" ? parseDopplerHookInitializerState(stateData) : parseStandardInitializerState(stateData);
12523
+ const { numeraire, status, poolKey, farTick } = parsedState;
12524
+ if (poolKey.hooks !== viem.zeroAddress && poolKey.tickSpacing !== 0) {
12525
+ return {
12526
+ initializerAddress,
12527
+ state: {
12528
+ asset: tokenAddress,
12529
+ numeraire,
12530
+ fee: poolKey.fee,
12531
+ tickSpacing: poolKey.tickSpacing,
12532
+ status,
12533
+ poolKey,
12534
+ farTick: Number(farTick)
12535
+ }
12536
+ };
12537
+ }
12538
+ }
12539
+ const notFoundError = new Error(
12540
+ `Pool not found for token ${tokenAddress}. Tried initializers: ${triedInitializers.join(", ")}` + (failedInitializers.length > 0 ? `. Failed initializers: ${failedInitializers.map((error) => error.message).join(" | ")}` : "")
12541
+ );
12542
+ if (failedInitializers.length > 0) {
12543
+ notFoundError.cause = new AggregateError(
12544
+ failedInitializers,
12545
+ `Initializer discovery failed for token ${tokenAddress}`
12546
+ );
12547
+ }
12548
+ throw notFoundError;
12549
+ }
12550
+ function parseMulticurvePoolKey(rawPoolKey) {
12551
+ const poolKeyStruct = rawPoolKey;
12552
+ return {
12553
+ currency0: poolKeyStruct.currency0 ?? poolKeyStruct[0],
12554
+ currency1: poolKeyStruct.currency1 ?? poolKeyStruct[1],
12555
+ fee: Number(poolKeyStruct.fee ?? poolKeyStruct[2]),
12556
+ tickSpacing: Number(poolKeyStruct.tickSpacing ?? poolKeyStruct[3]),
12557
+ hooks: poolKeyStruct.hooks ?? poolKeyStruct[4]
12558
+ };
12559
+ }
12560
+ function getInitializerCandidates(addresses) {
12561
+ return [
12562
+ {
12563
+ address: addresses.v4MulticurveInitializer,
12564
+ kind: "standard"
12565
+ },
12566
+ {
12567
+ address: addresses.v4ScheduledMulticurveInitializer,
12568
+ kind: "standard"
12569
+ },
12570
+ {
12571
+ address: addresses.v4DecayMulticurveInitializer,
12572
+ kind: "standard"
12573
+ },
12574
+ {
12575
+ address: addresses.dopplerHookInitializer,
12576
+ kind: "dopplerHook"
12577
+ }
12578
+ ].filter(
12579
+ (entry) => Boolean(entry.address && entry.address !== viem.zeroAddress)
12580
+ );
12581
+ }
12582
+ function parseStandardInitializerState(stateData) {
12583
+ const state = stateData;
12584
+ return {
12585
+ numeraire: state.numeraire ?? state[0],
12586
+ status: Number(state.status ?? state[1]),
12587
+ poolKey: parseMulticurvePoolKey(state.poolKey ?? state[2]),
12588
+ farTick: Number(state.farTick ?? state[3])
12589
+ };
12590
+ }
12591
+ function parseDopplerHookInitializerState(stateData) {
12592
+ const state = stateData;
12593
+ return {
12594
+ numeraire: state.numeraire ?? state[0],
12595
+ status: Number(state.status ?? state[4]),
12596
+ poolKey: parseMulticurvePoolKey(state.poolKey ?? state[5]),
12597
+ farTick: Number(state.farTick ?? state[6])
12598
+ };
12599
+ }
12600
+ function isAbsentPoolReadFailure(error) {
12601
+ if (!(error instanceof viem.BaseError)) {
12602
+ return false;
12603
+ }
12604
+ const revertedError = error.walk(
12605
+ (cause) => cause instanceof viem.ContractFunctionRevertedError
12606
+ );
12607
+ if (!(revertedError instanceof viem.ContractFunctionRevertedError)) {
12608
+ return false;
12609
+ }
12610
+ return revertedError.data?.errorName === "PoolNotFound" || revertedError.data?.errorName === "PoolNotInitialized";
12611
+ }
12612
+
12613
+ // src/evm/entities/auction/multicurve/multicurveFeeCollection.ts
12614
+ async function collectMulticurveFees({
12615
+ client,
12616
+ walletClient,
12617
+ initializerAddress,
12618
+ state,
12619
+ addresses
12620
+ }) {
12621
+ if (state.status === 2 /* Locked */) {
12622
+ const poolId = computePoolId(state.poolKey);
12623
+ const collectFeesAbi = initializerAddress === addresses.dopplerHookInitializer ? dopplerHookInitializerAbi : v4MulticurveInitializerAbi;
12624
+ return collectFeesFromContract({
12625
+ client,
12626
+ walletClient,
12627
+ contractAddress: initializerAddress,
12628
+ abi: collectFeesAbi,
12629
+ poolId
12630
+ });
12631
+ }
12632
+ throw new Error("Multicurve pool is not locked or was migrated");
12633
+ }
12634
+ async function collectFeesFromContract({
12635
+ client,
12636
+ walletClient,
12637
+ contractAddress,
12638
+ abi,
12639
+ poolId
12640
+ }) {
12641
+ const { request, result } = await client.simulateContract({
12642
+ address: contractAddress,
12643
+ abi,
12644
+ functionName: "collectFees",
12645
+ args: [poolId],
12646
+ account: walletClient.account
12647
+ });
12648
+ const hash = await walletClient.writeContract(request);
12649
+ await client.waitForTransactionReceipt({ hash, confirmations: 1 });
12650
+ const [fees0, fees1] = result;
12651
+ return {
12652
+ fees0,
12653
+ fees1,
12654
+ transactionHash: hash
12655
+ };
12656
+ }
12657
+ async function getMulticurveFeeSchedule(client, state) {
12658
+ if (state.poolKey.fee !== DYNAMIC_FEE_FLAG) {
12659
+ return null;
12660
+ }
12661
+ const poolId = computePoolId(state.poolKey);
12662
+ try {
12663
+ const scheduleData = await client.readContract({
12664
+ address: state.poolKey.hooks,
12665
+ abi: decayMulticurveInitializerHookAbi,
12666
+ functionName: "getFeeScheduleOf",
12667
+ args: [poolId]
12668
+ });
12669
+ return {
12670
+ startingTime: Number(readStructField(scheduleData, "startingTime", 0)),
12671
+ startFee: Number(readStructField(scheduleData, "startFee", 1)),
12672
+ endFee: Number(readStructField(scheduleData, "endFee", 2)),
12673
+ lastFee: Number(readStructField(scheduleData, "lastFee", 3)),
12674
+ durationSeconds: Number(
12675
+ readStructField(scheduleData, "durationSeconds", 4)
12676
+ )
12677
+ };
12678
+ } catch (error) {
12679
+ if (!isMissingFeeScheduleHook(error)) {
12680
+ throw error;
12681
+ }
12682
+ throw new Error(
12683
+ `Dynamic multicurve hook at ${state.poolKey.hooks} does not expose getFeeScheduleOf(poolId)`,
12684
+ { cause: error }
12685
+ );
12686
+ }
12687
+ }
12688
+ function isMissingFeeScheduleHook(error) {
12689
+ if (!(error instanceof viem.BaseError)) {
12690
+ return false;
12691
+ }
12692
+ return Boolean(
12693
+ error.walk(
12694
+ (cause) => cause instanceof viem.ContractFunctionZeroDataError || cause instanceof viem.ContractFunctionRevertedError && !cause.data && !cause.reason && !cause.signature
12695
+ )
12696
+ );
12697
+ }
12698
+ function readStructField(value, fieldName, tupleIndex) {
12699
+ if (Array.isArray(value)) {
12700
+ return value[tupleIndex] ?? 0;
12701
+ }
12702
+ if (typeof value === "object" && value !== null && fieldName in value) {
12703
+ return value[fieldName] ?? 0;
12704
+ }
12705
+ return 0;
12706
+ }
12707
+
12708
+ // src/evm/entities/auction/MulticurvePool.ts
12322
12709
  var MulticurvePool = class {
12323
12710
  client;
12324
12711
  walletClient;
@@ -12359,130 +12746,57 @@ var MulticurvePool = class {
12359
12746
  async findInitializerForPool() {
12360
12747
  const chainId = await this.rpc.getChainId();
12361
12748
  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
- );
12749
+ return findMulticurveInitializerForPool({
12750
+ client: this.rpc,
12751
+ tokenAddress: this.tokenAddress,
12752
+ addresses
12753
+ });
12415
12754
  }
12416
12755
  /**
12417
- * Collect fees from the pool and distribute to beneficiaries
12756
+ * Collect fees from a locked initializer-side pool.
12418
12757
  *
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.
12758
+ * This function can be called by any account to pull pool fees into the
12759
+ * initializer. If the caller is a configured beneficiary, their pending share
12760
+ * is released as part of the same transaction.
12422
12761
  *
12423
- * @returns Object containing the amounts of fees0 and fees1 distributed, and the transaction hash
12762
+ * @returns Object containing the contract's collectFees return values and the transaction hash.
12763
+ * The returned fee amounts are newly collected pool fees, not necessarily the caller's beneficiary payout.
12424
12764
  */
12425
12765
  async collectFees() {
12426
- if (!this.walletClient) {
12766
+ const walletClient = this.walletClient;
12767
+ if (!walletClient) {
12427
12768
  throw new Error("Wallet client required to collect fees");
12428
12769
  }
12429
12770
  const chainId = await this.rpc.getChainId();
12430
12771
  const addresses = getAddresses(chainId);
12431
12772
  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
- }
12773
+ return collectMulticurveFees({
12774
+ client: this.rpc,
12775
+ walletClient,
12776
+ initializerAddress,
12777
+ state,
12778
+ addresses
12779
+ });
12780
+ }
12781
+ /**
12782
+ * Preview pending fees for a beneficiary on an initializer-side multicurve pool.
12783
+ */
12784
+ async getPendingFees(beneficiary) {
12785
+ const { initializerAddress, state } = await this.findInitializerForPool();
12441
12786
  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
12787
+ throw new Error(
12788
+ "Pending fee preview is only supported for initializer-side multicurve pools"
12483
12789
  );
12484
12790
  }
12485
- throw new Error("Multicurve pool is not locked or migrated");
12791
+ if (state.status !== 2 /* Locked */) {
12792
+ throw new Error("Multicurve pool is not locked or was migrated");
12793
+ }
12794
+ const poolId = computePoolId(state.poolKey);
12795
+ const callResults = await callAggregate3(
12796
+ this.rpc,
12797
+ createPendingFeePreviewCalls(initializerAddress, poolId, beneficiary)
12798
+ );
12799
+ return calculatePendingFees(callResults);
12486
12800
  }
12487
12801
  /**
12488
12802
  * Get the numeraire address for this pool
@@ -12498,91 +12812,7 @@ var MulticurvePool = class {
12498
12812
  */
12499
12813
  async getFeeSchedule() {
12500
12814
  const { state } = await this.findInitializerForPool();
12501
- if (state.poolKey.fee !== DYNAMIC_FEE_FLAG) {
12502
- return null;
12503
- }
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]
12511
- });
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
- );
12528
- }
12529
- }
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
- };
12557
- }
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;
12569
- }
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
- };
12815
+ return getMulticurveFeeSchedule(this.rpc, state);
12586
12816
  }
12587
12817
  };
12588
12818
 
@@ -18888,6 +19118,7 @@ exports.dopplerLensAbi = dopplerLensAbi;
18888
19118
  exports.encodeRehypeDopplerHookMigratorCalldata = encodeRehypeDopplerHookMigratorCalldata;
18889
19119
  exports.estimatePriceAtEpoch = estimatePriceAtEpoch;
18890
19120
  exports.estimateSlippage = estimateSlippage;
19121
+ exports.feeClaimsInitializerAbi = feeClaimsInitializerAbi;
18891
19122
  exports.formatTickAsPrice = formatTickAsPrice;
18892
19123
  exports.getAddresses = getAddresses;
18893
19124
  exports.getAirlockBeneficiary = getAirlockBeneficiary;