@zoralabs/coins 2.2.1 → 2.3.1

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.
Files changed (88) hide show
  1. package/.turbo/turbo-build$colon$js.log +125 -106
  2. package/CHANGELOG.md +50 -5
  3. package/README.md +5 -0
  4. package/abis/AddressConstants.json +7 -0
  5. package/abis/BaseCoin.json +0 -5
  6. package/abis/BaseTest.json +62 -0
  7. package/abis/BuySupplyWithV4SwapHook.json +429 -0
  8. package/abis/ContentCoin.json +0 -5
  9. package/abis/CreatorCoin.json +0 -5
  10. package/abis/FeeEstimatorHook.json +94 -1
  11. package/abis/IUniswapV4Router04.json +484 -0
  12. package/abis/IUpgradeableDestinationV4HookWithUpdateableFee.json +95 -0
  13. package/abis/IZoraFactory.json +69 -0
  14. package/abis/MockAirlock.json +39 -0
  15. package/abis/SimpleERC20.json +326 -0
  16. package/abis/ZoraFactoryImpl.json +69 -0
  17. package/abis/ZoraV4CoinHook.json +94 -1
  18. package/addresses/8453.json +8 -10
  19. package/audits/report-cantinacode-zora-0827.pdf +3498 -4
  20. package/audits/report-cantinacode-zora-1021.pdf +0 -0
  21. package/dist/index.cjs +161 -22
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.js +160 -21
  24. package/dist/index.js.map +1 -1
  25. package/dist/wagmiGenerated.d.ts +259 -40
  26. package/dist/wagmiGenerated.d.ts.map +1 -1
  27. package/foundry.toml +3 -3
  28. package/package/wagmiGenerated.ts +160 -21
  29. package/package.json +1 -1
  30. package/script/DeployPostDeploymentHooks.s.sol +1 -3
  31. package/script/TestBackingCoinSwap.s.sol +0 -2
  32. package/script/TestV4Swap.s.sol +0 -2
  33. package/src/BaseCoin.sol +4 -12
  34. package/src/ContentCoin.sol +3 -4
  35. package/src/CreatorCoin.sol +8 -10
  36. package/src/ZoraFactoryImpl.sol +115 -83
  37. package/src/deployment/CoinsDeployerBase.sol +9 -8
  38. package/src/hook-registry/ZoraHookRegistry.sol +4 -0
  39. package/src/hooks/ZoraV4CoinHook.sol +66 -9
  40. package/src/hooks/deployment/BuySupplyWithV4SwapHook.sol +310 -0
  41. package/src/interfaces/IUpgradeableV4Hook.sol +18 -0
  42. package/src/interfaces/IZoraFactory.sol +21 -2
  43. package/src/libs/CoinConstants.sol +51 -8
  44. package/src/libs/CoinDopplerMultiCurve.sol +11 -11
  45. package/src/libs/CoinRewardsV4.sol +26 -33
  46. package/src/libs/CoinSetup.sol +2 -9
  47. package/src/libs/DopplerMath.sol +2 -2
  48. package/src/libs/V4Liquidity.sol +79 -15
  49. package/src/utils/AutoSwapper.sol +1 -1
  50. package/src/version/ContractVersionBase.sol +1 -1
  51. package/test/BuySupplyWithV4SwapHook.t.sol +509 -0
  52. package/test/Coin.t.sol +26 -14
  53. package/test/CoinRewardsV4.t.sol +33 -0
  54. package/test/CoinUniV4.t.sol +3 -5
  55. package/test/ContentCoinRewards.t.sol +44 -3
  56. package/test/CreatorCoin.t.sol +54 -33
  57. package/test/CreatorCoinRewards.t.sol +1 -3
  58. package/test/DeploymentHooks.t.sol +54 -2
  59. package/test/Factory.t.sol +3 -3
  60. package/test/LiquidityMigration.t.sol +145 -7
  61. package/test/MultiOwnable.t.sol +4 -4
  62. package/test/Upgrades.t.sol +26 -17
  63. package/test/V4Liquidity.t.sol +178 -0
  64. package/test/ZoraHookRegistry.t.sol +19 -9
  65. package/test/mocks/MockAirlock.sol +22 -0
  66. package/test/mocks/SimpleERC20.sol +8 -0
  67. package/test/utils/BaseTest.sol +155 -3
  68. package/test/utils/RewardTestHelpers.sol +4 -4
  69. package/test/utils/hookmate/README.md +50 -0
  70. package/test/utils/hookmate/artifacts/DeployHelper.sol +20 -0
  71. package/test/utils/hookmate/artifacts/Permit2.sol +16 -0
  72. package/test/utils/hookmate/artifacts/UniversalRouter.sol +29 -0
  73. package/test/utils/hookmate/artifacts/V4PoolManager.sol +17 -0
  74. package/test/utils/hookmate/artifacts/V4PositionManager.sol +23 -0
  75. package/test/utils/hookmate/artifacts/V4Quoter.sol +17 -0
  76. package/test/utils/hookmate/artifacts/V4Router.sol +18 -0
  77. package/test/utils/hookmate/constants/AddressConstants.sol +193 -0
  78. package/test/utils/hookmate/interfaces/router/IUniswapV4Router04.sol +173 -0
  79. package/test/utils/hookmate/interfaces/router/PathKey.sol +34 -0
  80. package/test/utils/hookmate/test/utils/SwapFeeEventAsserter.sol +24 -0
  81. package/wagmi.config.ts +1 -1
  82. package/abis/CoinConstants.json +0 -54
  83. package/abis/CoinRewardsV4.json +0 -67
  84. package/src/libs/CreatorCoinConstants.sol +0 -15
  85. package/src/libs/MarketConstants.sol +0 -23
  86. package/src/utils/uniswap/BytesLib.sol +0 -35
  87. package/src/utils/uniswap/Path.sol +0 -31
  88. /package/abis/{VmContractHelper227.json → VmContractHelper239.json} +0 -0
@@ -0,0 +1,23 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.26;
3
+
4
+ import {DeployHelper} from "./DeployHelper.sol";
5
+
6
+ library V4PositionManagerDeployer {
7
+ function deploy(
8
+ address poolManager,
9
+ address permit2,
10
+ uint256 unsubscribeGasLimit,
11
+ address positionDescriptor,
12
+ address weth
13
+ ) internal returns (address manager) {
14
+ bytes memory args = abi.encode(poolManager, permit2, unsubscribeGasLimit, positionDescriptor, weth);
15
+ bytes memory initcode_ = abi.encodePacked(initcode(), args);
16
+ manager = DeployHelper.deploy(initcode_);
17
+ }
18
+
19
+ function initcode() internal pure returns (bytes memory) {
20
+ return
21
+ hex"61018080604052346105365760a0816162a38038038091610020828561053a565b8339810103126105365780516001600160a01b03811681036105365760208201516001600160a01b03811681036105365760408301516060840151936001600160a01b03851685036105365760800151926001600160a01b03841684036105365760405161008f60408261053a565b6018815260208101907f556e697377617020763420506f736974696f6e73204e4654000000000000000082526040516100c960408261053a565b600b81526a554e492d56342d504f534d60a81b602082015281516001600160401b03811161044a575f54600181811c9116801561052c575b602082101461042c57601f81116104ca575b50806020601f8211600114610469575f9161045e575b508160011b915f199060031b1c1916175f555b8051906001600160401b03821161044a5760015490600182811c92168015610440575b602083101461042c5781601f8493116103be575b50602090601f8311600114610358575f9261034d575b50508160011b915f199060031b1c1916176001555b5190208060c0524660a05260405160208101917f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86683526040820152466060820152306080820152608081526101f460a08261053a565b51902060805260e052610100526101205261014052600160085561016052604051615d45908161055e8239608051816124d5015260a051816124af015260c05181612524015260e051818181610af601528181610eb501528181611174015281816118c001528181611c3c01528181611cd1015281816120a1015281816121980152818161295801528181612a2c01528181612f1b01528181613d4601528181613e3901528181613edc01528181613ff30152818161431b0152818161457401528181614ae901528181614c6601528181614de401528181614ec901528181614f59015261576f01526101005181818161144001526131fb01526101205181818161039c01528181610a0e01528181610dc90152614efa015261014051818181611482015281816129ca01528181613a4201528181613a9e01528181613bc20152613c4b0152610160518181816116350152611fab0152f35b015190505f80610189565b60015f9081528281209350601f198516905b8181106103a6575090846001959493921061038e575b505050811b0160015561019e565b01515f1960f88460031b161c191690555f8080610380565b9293602060018192878601518155019501930161036a565b60015f529091507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f840160051c81019160208510610422575b90601f859493920160051c01905b8181106104145750610173565b5f8155849350600101610407565b90915081906103f9565b634e487b7160e01b5f52602260045260245ffd5b91607f169161015f565b634e487b7160e01b5f52604160045260245ffd5b90508301515f610129565b5f8080528181209250601f198416905b8181106104b25750908360019493921061049a575b5050811b015f5561013c565b8501515f1960f88460031b161c191690555f8061048e565b9192602060018192868a015181550194019201610479565b5f80527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563601f830160051c81019160208410610522575b601f0160051c01905b8181106105175750610113565b5f815560010161050a565b9091508190610501565b90607f1690610101565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761044a5760405256fe60806040526004361015610022575b3615610018575f80fd5b6100206129c0565b005b5f3560e01c80622a3e3a1461029057806301ffc9a71461028b57806305c1ee201461028657806306fdde0314610281578063081812fc1461027c578063095ea7b3146102775780630f5730f11461027257806312261ee71461026d57806316a24131146102685780631efeed331461026357806323b872dd1461025e5780632b67b570146102595780632b9261de146102545780633644e5151461024f5780633aea60f01461024a57806342842e0e146102455780634767565f146102405780634aa4a4fc1461023b5780634afe393c14610236578063502e1a16146102315780635a9d7a681461022c5780636352211e1461022757806370a082311461022257806375794a3c1461021d5780637ba03aad1461021857806386b6be7d1461021357806389097a6a1461020e57806391dd73461461020957806395d89b4114610204578063a22cb465146101ff578063ac9650d8146101fa578063ad0b27fb146101f5578063b88d4fde146101f0578063c87b56dd146101eb578063d737d0c7146101e6578063dc4c90d3146101e1578063dd46508f146101dc578063e985e9c5146101d75763f70204050361000e576122ae565b612248565b6120c5565b612082565b61203d565b611f56565b611c7c565b611c28565b611b2b565b611a7b565b6119c6565b611884565b61185a565b6117be565b61174f565b611732565b611688565b611659565b611616565b6115cc565b6114d7565b611463565b611429565b611161565b611088565b611057565b610e72565b610d58565b610ae2565b610a65565b610a32565b6109ef565b6108e0565b610839565b610806565b6106ef565b61063e565b61056c565b61033c565b6001600160a01b038116036102a657565b5f80fd5b35906102b582610295565b565b9181601f840112156102a65782359167ffffffffffffffff83116102a657602083818601950101116102a657565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602080948051918291828752018686015e5f8582860101520116010190565b9060206103399281815201906102e5565b90565b60606003193601126102a65760043561035481610295565b6024359067ffffffffffffffff82116102a6578136039160606003198401126102a65760443567ffffffffffffffff81116102a6576103979036906004016102b7565b6060947f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031693909290843b156102a6576001600160a01b03604051967f2a2d80d10000000000000000000000000000000000000000000000000000000088521660048701526060602487015260c48601937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd826004013591018112156102a65781016024600482013591019467ffffffffffffffff82116102a6578160071b360386136102a65760606064890152819052869460e48601949392915f5b81811061051a575050506104cb5f9694869488946044856104b36104a360248b99016102aa565b6001600160a01b03166084890152565b013560a48601526003198584030160448601526123c0565b03925af19081610500575b506104f757506104f36104e7612466565b60405191829182610328565b0390f35b6104f3906104e7565b8061050e5f610514936106ae565b80610656565b5f6104d6565b91965091929394608080826105316001948b612361565b01970191019188969594939261047c565b7fffffffff000000000000000000000000000000000000000000000000000000008116036102a657565b346102a65760206003193601126102a65760207fffffffff000000000000000000000000000000000000000000000000000000006004356105ac81610542565b167f01ffc9a7000000000000000000000000000000000000000000000000000000008114908115610614575b81156105ea575b506040519015158152f35b7f5b5e139f000000000000000000000000000000000000000000000000000000009150145f6105df565b7f80ac58cd00000000000000000000000000000000000000000000000000000000811491506105d8565b60206003193601126102a65761002060043533612a54565b5f9103126102a657565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60a0810190811067ffffffffffffffff8211176106a957604052565b610660565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106a957604052565b346102a6575f6003193601126102a6576040515f80548060011c90600181169081156107fc575b6020831082146107cf5782855260208501919081156107985750600114610748575b6104f3846104e7818603826106ae565b5f8080529250907f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b818410610784575050016104e782610738565b805484840152602090930192600101610771565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682525090151560051b0190506104e782610738565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f1691610716565b346102a65760206003193601126102a6576004355f52600460205260206001600160a01b0360405f205416604051908152f35b346102a65760406003193601126102a65760043561085681610295565b602435805f5260026020526001600160a01b0360405f2054169182331415806108af575b6108875761002092612ab5565b7f82b42900000000000000000000000000000000000000000000000000000000005f5260045ffd5b50825f52600560205260ff6108d83360405f20906001600160a01b03165f5260205260405f2090565b54161561087a565b60a06003193601126102a6576004356108f881610295565b602435604435916064359260843567ffffffffffffffff81116102a6576109239036906004016102b7565b948242116109c7576109bc856109c293610020986109b6885f8099868252600260205281896001600160a01b036040832054169c8d9981604051977f49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9ad89526001600160a01b0360208a01911681526040890192835260608901948552608089019687528160a08a20995252525252612b2c565b91612be5565b82612a54565b612ab5565b7f5a9165ff000000000000000000000000000000000000000000000000000000005f5260045ffd5b346102a6575f6003193601126102a65760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102a65760206003193601126102a6576004355f52600760205260206001600160a01b0360405f205416604051908152f35b346102a65760206003193601126102a6576020610a9c600435610a8781612669565b919082851c60020b9260081c60020b91612e68565b6fffffffffffffffffffffffffffffffff60405191168152f35b60031960609101126102a657600435610ace81610295565b90602435610adb81610295565b9060443590565b346102a657610af036610ab6565b91610b1a7f0000000000000000000000000000000000000000000000000000000000000000612f9c565b610d30578291610c41610b54610b48610b3b865f52600260205260405f2090565b546001600160a01b031690565b6001600160a01b031690565b91610b6a6001600160a01b03851693841461302f565b610bb46001600160a01b03821694610b83861515613094565b8433148015610cf2575b8015610ccd575b610b9d906130f9565b6001600160a01b03165f52600360205260405f2090565b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055610bf5816001600160a01b03165f52600360205260405f2090565b80546001019055610c0e855f52600260205260405f2090565b906001600160a01b03167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b610c7e610c56845f52600460205260405f2090565b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4610cbe610cb7825f52600960205260405f2090565b5460ff1690565b610cc457005b6100209061315e565b50610b9d610ce9610b48610b3b8a5f52600460205260405f2090565b33149050610b94565b50610d2b610cb733610d15846001600160a01b03165f52600560205260405f2090565b906001600160a01b03165f5260205260405f2090565b610b8d565b7fd4b05fe0000000000000000000000000000000000000000000000000000000005f5260045ffd5b6101006003193601126102a657600435610d7181610295565b60c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc3601126102a65760e43567ffffffffffffffff81116102a657610dbb9036906004016102b7565b916060926001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016803b156102a6576001600160a01b035f80946104cb604051978896879586947f2b67b570000000000000000000000000000000000000000000000000000000008652166004850152610e3d602485016122f6565b6001600160a01b0360a435610e5181610295565b1660a485015260c43560c485015261010060e48501526101048401916123c0565b60606003193601126102a657602435600435610e8d82610295565b60443567ffffffffffffffff81116102a657610ead9036906004016102b7565b610ed99391937f0000000000000000000000000000000000000000000000000000000000000000612f9c565b610d3057610ee783336132b6565b1561102b576001600160a01b03610f09610b3b855f52600760205260405f2090565b1680610fef57505f83815260096020526040902080546001179055610fbf90610fbb90610fb56001600160a01b03851696610f5088610c0e895f52600760205260405f2090565b610f896040519384927f8d57f6b20000000000000000000000000000000000000000000000000000000060208501528960248501612495565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826106ae565b8361334b565b1590565b610fea57507f9709492381f90bdc5938bb4e3b8e35b7e0eac8af058619e27191c5a40ce79fa95f80a3005b61338c565b7f25fbd8be000000000000000000000000000000000000000000000000000000005f5260048490526001600160a01b031660245260445ffd5b5ffd5b7f0ca968d8000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b346102a6575f6003193601126102a65760206110716124ac565b604051908152f35b6044359081151582036102a657565b60c06003193601126102a6576004356110a081610295565b6024356110ac81610295565b6110b4611079565b906064359260843560a43567ffffffffffffffff81116102a6576110dc9036906004016102b7565b8692919242116109c7578361115c936109bc926109b6885f6100209c8189818f81604051977f6673cb397ee2a50b6b8401653d3638b4ac8b3db9c28aa6870ffceb7574ec2f7689526001600160a01b0360208a0191168152600160408a019316835260608901948552608089019687528160a08a20995252525252612b2c565b6136b8565b346102a65761116f36610ab6565b6111987f0000000000000000000000000000000000000000000000000000000000000000612f9c565b610d30576111b4610b48610b3b835f52600260205260405f2090565b916111ca6001600160a01b03851693841461302f565b816001600160a01b03821680946111e2821515613094565b8033148015611401575b80156113dc575b6111fc906130f9565b611217876001600160a01b03165f52600360205260405f2090565b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055611258846001600160a01b03165f52600360205260405f2090565b8054600101905561127584610c0e855f52600260205260405f2090565b61128a610c56845f52600460205260405f2090565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a46112c3610cb7835f52600960205260405f2090565b6113ce575b3b159182156112db575b6100208361257e565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039490941660248501526044840191909152608060648401525f6084840181905260209250839160a49183915af180156113c9577fffffffff000000000000000000000000000000000000000000000000000000007f150b7a020000000000000000000000000000000000000000000000000000000091610020935f9161139a575b5016145f806112d2565b6113bc915060203d6020116113c2575b6113b481836106ae565b810190612569565b5f611390565b503d6113aa565b6123fe565b6113d78261315e565b6112c8565b506111fc6113f8610b48610b3b865f52600460205260405f2090565b331490506111f3565b50611424610cb733610d158a6001600160a01b03165f52600560205260405f2090565b6111ec565b346102a6575f6003193601126102a65760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346102a6575f6003193601126102a65760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b9181601f840112156102a65782359167ffffffffffffffff83116102a6576020808501948460051b0101116102a657565b60406003193601126102a65760043567ffffffffffffffff81116102a6576115039036906004016102b7565b60243567ffffffffffffffff81116102a6576115239036906004016114a6565b916001600160a01b037f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c166115a45761157f93337f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5d61376b565b5f7f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5d005b7f6f5ffb7e000000000000000000000000000000000000000000000000000000005f5260045ffd5b346102a65760406003193601126102a6576004356115e981610295565b6001600160a01b0360243591165f52600660205260405f20905f52602052602060405f2054604051908152f35b346102a6575f6003193601126102a65760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102a65760206003193601126102a6576020611677600435612648565b6001600160a01b0360405191168152f35b346102a65760206003193601126102a6576001600160a01b036004356116ad81610295565b1680156116d4575f5260036020526104f360405f2054604051918291829190602083019252565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f4144445245535300000000000000000000000000000000000000006044820152fd5b346102a6575f6003193601126102a6576020600854604051908152f35b346102a65760206003193601126102a65760c061176d600435612669565b6117b760405180936001600160a01b036080809282815116855282602082015116602086015262ffffff6040820151166040860152606081015160020b6060860152015116910152565b60a0820152f35b346102a65760206003193601126102a6576004357fffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000081168091036102a6575f908152600a60209081526040918290208054600182015460029283015485516001600160a01b0393841681528383169581019590955260a082811c62ffffff169686019690965260b89190911c90920b6060840152166080820152f35b346102a65760206003193601126102a6576004355f526009602052602060405f2054604051908152f35b346102a65760206003193601126102a65760043567ffffffffffffffff81116102a6576118b59036906004016102b7565b906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361199e5760408135189063ffffffff60408201351663ffffffe0601f8201169260608401602084013518179282019260608401359483641fffffffe08760051b16805f905b8881831061196f5790506080929150010191011017611962576060608063ffffffff61195796169401920161376b565b6104f36104e7612452565b633b99b53d5f526004601cfd5b8294509263ffffffe0601f60808060209687969801013599848b1817998d010135011601019201869291611927565b7fae18210a000000000000000000000000000000000000000000000000000000005f5260045ffd5b346102a6575f6003193601126102a6576040515f6001548060011c9060018116908115611a71575b6020831082146107cf5782855260208501919081156107985750600114611a1f576104f3846104e7818603826106ae565b60015f9081529250907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b818410611a5d575050016104e782610738565b805484840152602090930192600101611a4a565b91607f16916119ee565b346102a65760406003193601126102a657600435611a9881610295565b60243580151581036102a65761002091336136b8565b602081016020825282518091526040820191602060408360051b8301019401925f915b838310611ae057505050505090565b9091929394602080611b1c837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0866001960301875289516102e5565b97019301930191939290611ad1565b60206003193601126102a65760043567ffffffffffffffff81116102a657611b579036906004016114a6565b90611b6182612747565b91611b6f60405193846106ae565b8083527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611b9c82612747565b015f5b818110611c175750505f5b818110611bbf57604051806104f38682611aae565b5f80611bcc83858761278c565b90611bdc604051809381936127f1565b0390305af4611be9612466565b9015611c0f5790600191611bfd82876127fe565b52611c0881866127fe565b5001611baa565b602081519101fd5b806060602080938801015201611b9f565b60206003193601126102a657600435611c607f0000000000000000000000000000000000000000000000000000000000000000612f9c565b610d3057611c6e81336132b6565b1561102b576100209061315e565b346102a65760806003193601126102a657600435611c9981610295565b60243590611ca682610295565b60443560643567ffffffffffffffff81116102a657611cc99036906004016102b7565b939091611cf57f0000000000000000000000000000000000000000000000000000000000000000612f9c565b610d3057611d11610b48610b3b835f52600260205260405f2090565b91611d276001600160a01b03861693841461302f565b816001600160a01b0382168094611d3f821515613094565b8033148015611f2e575b8015611f09575b611d59906130f9565b611d74886001600160a01b03165f52600360205260405f2090565b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055611db5846001600160a01b03165f52600360205260405f2090565b80546001019055611dd284610c0e855f52600260205260405f2090565b611de7610c56845f52600460205260405f2090565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4611e20610cb7835f52600960205260405f2090565b611efb575b3b15938415611e38575b6100208561257e565b602094505f90611e78604051978896879586947f150b7a020000000000000000000000000000000000000000000000000000000086523360048701612812565b03925af180156113c9577fffffffff000000000000000000000000000000000000000000000000000000007f150b7a020000000000000000000000000000000000000000000000000000000091610020935f91611edc575b5016145f808080611e2f565b611ef5915060203d6020116113c2576113b481836106ae565b5f611ed0565b611f048261315e565b611e25565b50611d59611f25610b48610b3b865f52600460205260405f2090565b33149050611d50565b50611f51610cb733610d158b6001600160a01b03165f52600560205260405f2090565b611d49565b346102a65760206003193601126102a657600435604051907fe9dc637500000000000000000000000000000000000000000000000000000000825230600483015260248201525f816044816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa80156113c9575f90611fea575b6104f39060405191829182610328565b503d805f833e611ffa81836106ae565b8101906020818303126102a65780519067ffffffffffffffff82116102a6570181601f820112156102a6576104f39181602061203893519101612840565b611fda565b346102a6575f6003193601126102a65760207f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c6001600160a01b0360405191168152f35b346102a6575f6003193601126102a65760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b60406003193601126102a65760043567ffffffffffffffff81116102a6576120f19036906004016102b7565b6024356001600160a01b037f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c166115a457337f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5d80421161221d576040517f48c89491000000000000000000000000000000000000000000000000000000008152602060048201525f818061218b6024820187896123c0565b0381836001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af180156113c9576121cd575b610020613746565b3d805f833e6121dc81836106ae565b8101906020818303126102a65780519067ffffffffffffffff82116102a657019080601f830112156102a657815161221692602001612840565b50806121c5565b7fbfb22adf000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b346102a65760406003193601126102a657602060ff6122a260043561226c81610295565b6001600160a01b036024359161228183610295565b165f526005845260405f20906001600160a01b03165f5260205260405f2090565b54166040519015158152f35b600319360160c081126102a65760a0136102a65760206122d860a4356122d381610295565b6128a3565b6040519060020b8152f35b359065ffffffffffff821682036102a657565b6001600160a01b0360243561230a81610295565b1681526001600160a01b0360443561232181610295565b16602082015260643565ffffffffffff81168091036102a657604082015260843565ffffffffffff811681036102a65765ffffffffffff60609116910152565b65ffffffffffff6123ba606080936001600160a01b03813561238281610295565b1686526001600160a01b03602082013561239b81610295565b166020870152836123ae604083016122e3565b166040870152016122e3565b16910152565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093818652868601375f8582860101520116010190565b6040513d5f823e3d90fd5b604051906102b56080836106ae565b67ffffffffffffffff81116106a957601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b604051906124616020836106ae565b5f8252565b3d15612490573d9061247782612418565b9161248560405193846106ae565b82523d5f602084013e565b606090565b6040906103399492815281602082015201916123c0565b467f0000000000000000000000000000000000000000000000000000000000000000036124f7577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86682527f000000000000000000000000000000000000000000000000000000000000000060408201524660608201523060808201526080815261256360a0826106ae565b51902090565b908160209103126102a6575161033981610542565b1561258557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152fd5b156125ea57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4e4f545f4d494e544544000000000000000000000000000000000000000000006044820152fd5b5f5260026020526001600160a01b0360405f205416906102b58215156125e3565b5f60806040516126788161068d565b82815282602082015282604082015282606082015201525f52600960205260405f2054807fffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000165f52600a60205260405f206127446127346002604051936126de8561068d565b6001600160a01b03815416855261272661271c60018301546001600160a01b038116602089015262ffffff8160a01c16604089015260b81c60020b90565b60020b6060870152565b01546001600160a01b031690565b6001600160a01b03166080830152565b91565b67ffffffffffffffff81116106a95760051b60200190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b91908110156127ec5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156102a657019081359167ffffffffffffffff83116102a65760200182360381136102a6579190565b61275f565b908092918237015f815290565b80518210156127ec5760209160051b010190565b90926001600160a01b03608093816103399896168452166020830152604082015281606082015201916123c0565b92919261284c82612418565b9161285a60405193846106ae565b8294818452818301116102a6578281602093845f96015e010152565b8060020b036102a657565b908160209103126102a6575161033981612876565b62ffffff8116036102a657565b6001600160a01b03604051917f6276cbbe000000000000000000000000000000000000000000000000000000008352816004356128df81610295565b166004840152816024356128f281610295565b16602484015262ffffff60443561290881612896565b16604484015260643561291a81612876565b60020b606484015261294160843561293181610295565b6001600160a01b03166084850152565b1660a482015260208160c4815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af15f918161298f575b506103395750627fffff90565b6129b291925060203d6020116129b9575b6129aa81836106ae565b810190612881565b905f612982565b503d6129a0565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633141580612a21575b6129f957565b7f38bbd576000000000000000000000000000000000000000000000000000000005f5260045ffd5b506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163314156129f3565b906001600160a01b03600160ff83161b92165f52600660205260405f209060081c5f5260205260405f20818154188091551615612a8d57565b7f1fb09b80000000000000000000000000000000000000000000000000000000005f5260045ffd5b906001600160a01b038091845f526004602052612b038160405f20906001600160a01b03167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b1691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9255f80a4565b90612b356124ac565b91604051927f19010000000000000000000000000000000000000000000000000000000000008452600284015260228301525f604060428420938281528260208201520152565b91908260409103126102a6576020823592013590565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b60ff601b9116019060ff8211612bd157565b612b92565b90604010156127ec5760400190565b90833b612d7a5760418103612cee5790602092612c6e83612c46612c40612c1a612c125f98880188612b7c565b949097612bd6565b357fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b935b604051948594859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa156113c9576001600160a01b035f5116908115612cc6576001600160a01b031603612c9e57565b7f815e1d64000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f8baa579f000000000000000000000000000000000000000000000000000000005f5260045ffd5b9060408203612d5257602092612d0b825f94612c6e940190612b7c565b929092612d4c612d47612d417f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84169360ff1c90565b60ff1690565b612bbf565b93612c48565b7f4be6321b000000000000000000000000000000000000000000000000000000005f5260045ffd5b9092612dc1936001600160a01b03602094604051968795869485937f1626ba7e00000000000000000000000000000000000000000000000000000000855260048501612495565b0392165afa9081156113c9577f1626ba7e00000000000000000000000000000000000000000000000000000000917fffffffff00000000000000000000000000000000000000000000000000000000915f91612e49575b501603612e2157565b7fb0669cbc000000000000000000000000000000000000000000000000000000005f5260045ffd5b612e62915060203d6020116113c2576113b481836106ae565b5f612e18565b9290612ea39260a092604051956026870152600686015260038501523084525f603a600c860120948160408201528160208201525220614bbf565b60068101809111612bd15760408051602081810194855291810192909252612f0f929091612ed48160608101610f89565b519020604051809381927f1e2eaeaf000000000000000000000000000000000000000000000000000000008352600483019190602083019252565b03816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa80156113c9576fffffffffffffffffffffffffffffffff915f91612f6057501690565b612f82915060203d602011612f86575b612f7a81836106ae565b810190612f8d565b1690565b503d612f70565b908160209103126102a6575190565b60206001600160a01b03916024604051809481937ff135baaa0000000000000000000000000000000000000000000000000000000083527fc090fc4683624cfc3884e9d8de5eca132f2d0ec062aff75d43c0465d5ceeab236004840152165afa9081156113c9575f91613010575b50151590565b613029915060203d602011612f8657612f7a81836106ae565b5f61300a565b1561303657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152fd5b1561309b57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152fd5b1561310057565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152fd5b6001600160a01b0361317b610b3b835f52600760205260405f2090565b1690811561328e575f81815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556131cb610c56825f52600760205260405f2090565b813b6131f8575b7fa0ebb1de82db929a9153472f37d3a66dbede4436258311ad0f52a35a2c91d1505f80a3565b5a7f000000000000000000000000000000000000000000000000000000000000000080911061328957823b156102a6575f60405180927faf45dd140000000000000000000000000000000000000000000000000000000082528183878261326789600483019190602083019252565b0393f1613275575b506131d2565b8061050e5f613283936106ae565b5f61326f565b6137d4565b7f237e6c28000000000000000000000000000000000000000000000000000000005f5260045ffd5b6001600160a01b036132c783612648565b16916001600160a01b03821692831492831561332a575b5082156132ea57505090565b60ff9250906001600160a01b0361330361332593612648565b165f52600560205260405f20906001600160a01b03165f5260205260405f2090565b541690565b908093505f5260046020526001600160a01b0360405f20541614915f6132de565b803b1561336457815f92918360208194519301915af190565b7f7c402b21000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f3d01166001600160a01b03604051927f90bfb8650000000000000000000000000000000000000000000000000000000084521660048301527f8d57f6b2000000000000000000000000000000000000000000000000000000006024830152608060448301528060a00160648301523d60848301523d5f60a484013e7f81ea5e9e0000000000000000000000000000000000000000000000000000000060c4828401600460a4820152015260e40190fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f3d01166001600160a01b03604051927f90bfb8650000000000000000000000000000000000000000000000000000000084521660048301527fa9059cbb000000000000000000000000000000000000000000000000000000006024830152608060448301528060a00160648301523d60848301523d5f60a484013e7ff27f64e40000000000000000000000000000000000000000000000000000000060c4828401600460a4820152015260e40190fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f3d01166001600160a01b03604051927f90bfb8650000000000000000000000000000000000000000000000000000000084521660048301525f6024830152608060448301528060a00160648301523d60848301523d5f60a484013e7ff4b3b1bc0000000000000000000000000000000000000000000000000000000060c4828401600460a4820152015260e40190fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f3d01166001600160a01b03604051927f90bfb8650000000000000000000000000000000000000000000000000000000084521660048301527fb1a9116f000000000000000000000000000000000000000000000000000000006024830152608060448301528060a00160648301523d60848301523d5f60a484013e7face944810000000000000000000000000000000000000000000000000000000060c4828401600460a4820152015260e40190fd5b60206001600160a01b03807f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31931693845f526005835261370c8160405f20906001600160a01b03165f5260205260405f2090565b951515957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff88161790556040519586521693a3565b5f7f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5d565b909291938284036137ac575f5b848110156137a45760019061379e81850161379483888b61278c565b913560f81c6137fc565b01613778565b509350505050565b7faaad13f7000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fed43c3a6000000000000000000000000000000000000000000000000000000005f5260045ffd5b909190600b8110156139175780613827575061381b906102b5926149cc565b94939093929192614b63565b60048103613846575061383d906102b592614185565b93929092614a79565b60018103613868575061385c906102b5926149cc565b94939093929192614a0e565b600281036138975750613881613891916102b5936145df565b9890979691959295949394613cc2565b9561478a565b600581036138c357506138b06138bd916102b593614481565b9790969591949294613cc2565b94614543565b91600383146138ff57505061102891505b7f5cda29d7000000000000000000000000000000000000000000000000000000005f52600452602490565b6102b592509061390e91614185565b939290926141c1565b600d8103613933575061392d906102b592613caf565b90614147565b6011810361395b575061394c613955916102b593613e9e565b92909192613cc2565b9161412c565b600b810361398f5750613989613977613983926102b594613e9e565b93829493929193613f73565b92613fa1565b91613fe2565b600e81036139c157506139b56139ab6139bb926102b594613e9e565b9282949291613cc2565b92613eb6565b91613eca565b601281036139dc57506139d7906102b592613ac8565b613e32565b601381036139f857506139f2906102b592613caf565b90613d25565b60148103613a1f5750613a11613a19916102b593613caf565b919091613cc2565b90613d07565b60158103613a6d5750613a38613a68916102b593613ac8565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690613b54565b613c39565b9160168314613a8257505061102891506138d4565b6102b59250613ac391613a9491613ac8565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016613ad4565b613bb0565b90602011611962573590565b613adf903090614bdf565b7f80000000000000000000000000000000000000000000000000000000000000008214613b4f578115613b3e575b8111613b165790565b7ff4d678b8000000000000000000000000000000000000000000000000000000005f5260045ffd5b9050613b495f614c5f565b90613b0d565b905090565b90613b5f305f614bdf565b907f80000000000000000000000000000000000000000000000000000000000000008314613baa578215613b98575b508111613b165790565b613ba3919250614c5f565b905f613b8e565b50905090565b80613bb85750565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690813b156102a6575f916024839260405194859384927f2e1a7d4d00000000000000000000000000000000000000000000000000000000845260048401525af180156113c957613c2f5750565b5f6102b5916106ae565b80613c415750565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016803b156102a6575f906004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af180156113c957613c2f5750565b9190604011611962576020823592013590565b6001600160a01b03811660018103613cfb5750507f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c90565b60020361033957503090565b90613d1182614cd1565b9081613d1c57505050565b6102b592614d37565b90613d2f82614ddd565b908115613e01578111613dd5576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691823b156102a6575f9283926040519485809481937f80f0b44c0000000000000000000000000000000000000000000000000000000083526020600484016001600160a01b036040820194168152015203925af180156113c957613dc75750565b8061050e5f6102b5936106ae565b6102b5917f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c90613eca565b505050565b7f80000000000000000000000000000000000000000000000000000000000000008114612bd1575f0390565b613e5d81307f0000000000000000000000000000000000000000000000000000000000000000614e49565b907f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c5f831215613e94576139896102b593613e06565b6102b59291613eca565b90606011611962578035916040602083013592013590565b9081613ec6576103399150614ddd565b5090565b90918015613e01576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016803b156102a6575f92836064926001600160a01b03948560405198899788967f0b0d9c0900000000000000000000000000000000000000000000000000000000885216600487015216602485015260448401525af180156113c957613f5e5750565b80613f6a5f80936106ae565b8003126102a657565b15613f9d577f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c90565b3090565b907f80000000000000000000000000000000000000000000000000000000000000008203613fd3576103399150614cd1565b81613ec6576103399150614c5f565b908215613e01576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691823b156102a6576040517fa58411940000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201525f8160248183885af180156113c957614118575b506001600160a01b0381166140ce5750506020906004604051809481937f11da60b40000000000000000000000000000000000000000000000000000000083525af180156113c9576140b35750565b6140cb9060203d602011612f8657612f7a81836106ae565b50565b5f93602093926140dd92614ea7565b6004604051809481937f11da60b40000000000000000000000000000000000000000000000000000000083525af180156113c9576140b35750565b8061050e5f614126936106ae565b5f614064565b9161413e6102b593826139bb82614ddd565b6139bb82614ddd565b906102b59161417c7f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c918261398982614c5f565b61398982614c5f565b919082359260208101359260408201359263ffffffff60608401351683019063ffffffff82351693602080840193860101910110611962579190565b939290927f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c6141f186826132b6565b156143ae575061420085612669565b9290938360081c60020b958460201c60020b9661423761422289838a8d612e68565b6fffffffffffffffffffffffffffffffff1690565b966142418a612648565b955f6142558c5f52600960205260405f2090565b5561425f8b614faa565b5f9989614291575b505050505050508160ff1661427e575b5050505050565b614287946151b4565b5f80808080614277565b60409495969a509061430e916142d16142b16142ac8d61507e565b613e06565b916142c76142bd612409565b97889060020b9052565b60020b6020870152565b858501528b606085015284519a8b9485947f5a6bcfda000000000000000000000000000000000000000000000000000000008652600486016143f9565b03815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af180156113c9575f965f9161436e575b509061435d826143629493986150b0565b6150ed565b5f808080808080614267565b61435d97506143629392915061439b9060403d6040116143a7575b61439381836106ae565b8101906143e3565b9790979192935061434c565b503d614389565b6001600160a01b03907f0ca968d8000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b91908260409103126102a6576020825192015190565b6060610339959361444a83610140956001600160a01b036080809282815116855282602082015116602086015262ffffff6040820151166040860152606081015160020b6060860152015116910152565b805160020b60a0840152602081015160020b60c0840152604081015160e084015201516101008201528161012082015201916123c0565b91908260a08101359260c08201359260e083013592610100810135926101208201359263ffffffff6101408401351683019063ffffffff82351693602080840193860101910110611962579190565b91908260a09103126102a6576040516144e88161068d565b608080829480356144f881610295565b8452602081013561450881610295565b6020850152604081013561451b81612896565b6040850152606081013561452e81612876565b606085015201359161453f83610295565b0152565b90916102b59796959493926fffffffffffffffffffffffffffffffff6145d861459860a061457136886144d0565b207f0000000000000000000000000000000000000000000000000000000000000000615264565b5050506145a484615303565b6145ad86615303565b6145c088356145bb81610295565b614ddd565b916145d260208a01356145bb81610295565b9361564f565b169261478a565b9091819260a08301359260c08101359260e08201359261010083013592610120810135926101408201359263ffffffff6101608401351683019063ffffffff82351693602080840193860101910110611962579190565b600260806102b593614680813561464c81610295565b85906001600160a01b03167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b600184016146c9602083013561469581610295565b82906001600160a01b03167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b60408201356146d781612896565b81547fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff76ffffff0000000000000000000000000000000000000000606086013561472081612876565b60b81b79ffffff0000000000000000000000000000000000000000000000169360a01b1691161717905501359161475683610295565b01906001600160a01b03167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b90919496929793959760085492600184016008556001600160a01b038a16996147b48b1515613094565b845f5260026020526001600160a01b0360405f20541661496e5761488a6149259861491f93876102b59e61481986614800614917986001600160a01b03165f52600360205260405f2090565b80546001019055610c0e845f52600260205260405f2090565b5f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a461484836886144d0565b63ffffff007fffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000060a066ffffff000000009320169260081b169260201b16171790565b928361489e875f52600960205260405f2090565b55837fffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000168561490760016148fc847fffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000165f52600a60205260405f2090565b015460b81c60020b90565b60020b1561492b575b505061507e565b9236906144d0565b906156fc565b506157de565b614962614967927fffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000165f52600a60205260405f2090565b614636565b5f85614910565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152fd5b909181359260208301359260408101359260608201359263ffffffff60808401351683019063ffffffff82351693602080840193860101910110611962579190565b90959495939192937f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c614a4283826132b6565b156143ae57509561435d92826142ac6102b59899614a6d614a65614a7397612669565b93909261507e565b916156fc565b906150b0565b949394929091927f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c614aac82826132b6565b156143ae57506102b59495614b5e9282614ac8614a7394612669565b90614a6d6fffffffffffffffffffffffffffffffff614b58614b0d60a085207f0000000000000000000000000000000000000000000000000000000000000000615264565b505050614b1f8660081c60020b615303565b614b2e8760201c60020b615303565b614b416001600160a01b03885116614ddd565b916145d26001600160a01b0360208a015116614ddd565b1661507e565b6157de565b90959495939192937f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c614b9783826132b6565b156143ae575095614b5e9282614a6d6102b59899614bb7614a7396612669565b92909161507e565b6040516020810191825260066040820152604081526125636060826106ae565b6001600160a01b038116614bf257503190565b906001600160a01b0360246020928260405195869485937f70a08231000000000000000000000000000000000000000000000000000000008552166004840152165afa9081156113c9575f91614c46575090565b610339915060203d602011612f8657612f7a81836106ae565b614c8a81307f0000000000000000000000000000000000000000000000000000000000000000614e49565b905f8213614c9c575061033990613e06565b6001600160a01b03907f3351b260000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b6001600160a01b038116614ce457504790565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290602090829060249082906001600160a01b03165afa9081156113c9575f91614c46575090565b9091906001600160a01b038116614d6457505f808080614d5894865af11590565b614d5f5750565b613532565b91906001600160a01b03604051927fa9059cbb00000000000000000000000000000000000000000000000000000000845216600483015260248201525f604060208260448582885af13d15601f3d11600185511416171692828152826020820152015215614dcf5750565b6001600160a01b031661345f565b614e0881307f0000000000000000000000000000000000000000000000000000000000000000614e49565b905f8212614e14575090565b6001600160a01b03907f4c085bf1000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b6001600160a01b03809381602094165f52168252602460405f2060405194859384927ff135baaa0000000000000000000000000000000000000000000000000000000084526004840152165afa9081156113c9575f91614c46575090565b9091906001600160a01b0383163003614eef576102b592506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690614d37565b906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016803b156102a6576040517f36c785160000000000000000000000000000000000000000000000000000000081526001600160a01b0394851660048201527f00000000000000000000000000000000000000000000000000000000000000008516602482015291841660448301529190921660648301525f908290608490829084905af180156113c957613dc75750565b805f5260026020525f6001600160a01b03604082205416614fcc8115156125e3565b8082526003602052604082207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8154019055615010835f52600260205260405f2090565b80548360031b906001600160a01b03808616831b921b191617905561503d835f52600460205260405f2090565b80548360031b906001600160a01b03808616831b921b19161790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4565b905f821261508857565b7f93dafdf1000000000000000000000000000000000000000000000000000000005f5260045ffd5b6150d3906150c58360801d8260801d0361592c565b92600f0b90600f0b0361592c565b6fffffffffffffffffffffffffffffffff169060801b1790565b929190926fffffffffffffffffffffffffffffffff8160801d94816151118761593a565b9116918291161061519957506fffffffffffffffffffffffffffffffff929350600f0b908261513f8361593a565b9116928391161061514e575050565b906151696fffffffffffffffffffffffffffffffff9261593a565b907f12816f22000000000000000000000000000000000000000000000000000000005f526004521660245260445ffd5b6fffffffffffffffffffffffffffffffff906151698661593a565b5f81815260076020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000081169091556001600160a01b039081169561525895610fbb959394919390929091604051957fb1a9116f00000000000000000000000000000000000000000000000000000000602088015260248701521660448501526064840152608483015260a482015260a48152610fb560c4826106ae565b61525f5750565b6135e5565b602090602461527b6001600160a01b039594614bbf565b60405195869384927f1e2eaeaf0000000000000000000000000000000000000000000000000000000084526004840152165afa9182156113c9575f926152e2575b506001600160a01b038216918060a01c60020b9162ffffff808360b81c169260d01c1690565b6152fc91925060203d602011612f8657612f7a81836106ae565b905f6152bc565b60020b908160ff1d82810118620d89e881116156495763ffffffff9192600182167001fffcb933bd6fad37aa2d162d1a5940010270010000000000000000000000000000000018916002811661562d575b60048116615611575b600881166155f5575b601081166155d9575b602081166155bd575b604081166155a1575b60808116615585575b6101008116615569575b610200811661554d575b6104008116615531575b6108008116615515575b61100081166154f9575b61200081166154dd575b61400081166154c1575b61800081166154a5575b620100008116615489575b62020000811661546e575b620400008116615453575b620800001661543a575b5f12615413575b0160201c90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0461540c565b6b048a170391f7dc42444e8fa290910260801c90615405565b6d2216e584f5fa1ea926041bedfe9890920260801c916153fb565b916e5d6af8dedb81196699c329225ee6040260801c916153f0565b916f09aa508b5b7a84e1c677de54f3e99bc90260801c916153e5565b916f31be135f97d08fd981231505542fcfa60260801c916153da565b916f70d869a156d2a1b890bb3df62baf32f70260801c916153d0565b916fa9f746462d870fdf8a65dc1f90e061e50260801c916153c6565b916fd097f3bdfd2022b8845ad8f792aa58250260801c916153bc565b916fe7159475a2c29b7443b29c7fa6e889d90260801c916153b2565b916ff3392b0822b70005940c7a398e4b70f30260801c916153a8565b916ff987a7253ac413176f2b074cf7815e540260801c9161539e565b916ffcbe86c7900a88aedcffc83b479aa3a40260801c91615394565b916ffe5dee046a99a2a811c461f1969c30530260801c9161538a565b916fff2ea16466c96a3843ec78b326b528610260801c91615381565b916fff973b41fa98c081472e6896dfb254c00260801c91615378565b916fffcb9843d60f6159c9db58835c9266440260801c9161536f565b916fffe5caca7e10e4e61c3624eaa0941cd00260801c91615366565b916ffff2e50f5f656932ef12357cf3c7fdcc0260801c9161535d565b916ffff97272373d413259a46990580e213a0260801c91615354565b82615959565b936001600160a01b0383166001600160a01b038316116156f4575b6001600160a01b0385811695908316861161568b57505061033993506159b7565b92909391946001600160a01b038216115f146156e85782916156b1916156b795946159b7565b93615987565b6fffffffffffffffffffffffffffffffff81166fffffffffffffffffffffffffffffffff8316105f14613b4f575090565b91505061033992615987565b90919061566a565b95939460409161576261570d612409565b60088a901c60020b81529260208a811c60020b908501528585850152866060850152845198899485947f5a6bcfda000000000000000000000000000000000000000000000000000000008652600486016143f9565b03815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19081156113c9575f945f926157ba575b5081949560ff166157b157505050565b6102b592615a00565b9094506157d6915060403d6040116143a75761439381836106ae565b90935f6157a1565b908160801d600f0b91600f0b915f8112806158f7575b6158955750505f81128061585e575b61580b575050565b9061581b61422261102893613e06565b7f31e30ad0000000000000000000000000000000000000000000000000000000005f526fffffffffffffffffffffffffffffffff91821660045216602452604490565b506fffffffffffffffffffffffffffffffff8061587a83613e06565b16166fffffffffffffffffffffffffffffffff831610615803565b906fffffffffffffffffffffffffffffffff6158b361102893613e06565b7f31e30ad0000000000000000000000000000000000000000000000000000000005f526fffffffffffffffffffffffffffffffff9283166004521616602452604490565b506fffffffffffffffffffffffffffffffff61591282613e06565b166fffffffffffffffffffffffffffffffff8316106157f4565b9081600f0b91820361508857565b5f81600f0b12615088576fffffffffffffffffffffffffffffffff1690565b7f8b86327a000000000000000000000000000000000000000000000000000000005f5260020b60045260245ffd5b916001600160a01b03610339936159ac93828116838316116159b1575b031690615b43565b615d1b565b906159a4565b916159ac91610339936001600160a01b0382166001600160a01b038216116159fa575b6001600160a01b03906159f1828416838316615bff565b92031691615c79565b906159da565b615a6a9192815f5260076020526001600160a01b0360405f20541693604051927fd8865c2700000000000000000000000000000000000000000000000000000000602085015260248401526044830152606482015260648152615a646084826106ae565b8261334b565b15615a725750565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f3d0116604051917f90bfb86500000000000000000000000000000000000000000000000000000000835260048301527fd8865c27000000000000000000000000000000000000000000000000000000006024830152608060448301528060a00160648301523d60848301523d5f60a484013e7fe94f10e20000000000000000000000000000000000000000000000000000000060c4828401600460a4820152015260e40190fd5b156102a657565b908160601b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6c010000000000000000000000008409928280851094039380850394615b91868511615b3c565b14615bf8576c0100000000000000000000000082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b5091500490565b90808202917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828209918380841093039280840393846c0100000000000000000000000011156102a65714615c70576c01000000000000000000000000910990828211900360a01b910360601c1790565b50505060601c90565b91818302917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818509938380861095039480860395615cb9878611615b3c565b14615d13579082910981805f03168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b505091500490565b906fffffffffffffffffffffffffffffffff82168092036150885756fea164736f6c634300081a000a";
22
+ }
23
+ }
@@ -0,0 +1,17 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.26;
3
+
4
+ import {DeployHelper} from "./DeployHelper.sol";
5
+
6
+ library V4QuoterDeployer {
7
+ function deploy(address poolManager) internal returns (address quoter) {
8
+ bytes memory args = abi.encode(poolManager);
9
+ bytes memory initcode_ = abi.encodePacked(initcode(), args);
10
+ quoter = DeployHelper.deploy(initcode_);
11
+ }
12
+
13
+ function initcode() internal pure returns (bytes memory) {
14
+ return
15
+ hex"60a034607b57601f61175038819003918201601f19168301916001600160401b03831184841017607f57808492602094604052833981010312607b57516001600160a01b0381168103607b576080526040516116bc908161009482396080518181816101b5015281816102ab015281816105b001526114910152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c8063147d2af91461087f578063587330731461082d578063595323f5146107815780636a36a38c1461065657806391dd73461461052c578063aa2f15011461037f578063aa9d21cb1461032d578063ca253dc9146101d9578063dc4c90d31461016b5763eebe0c6a14610087575f80fd5b346101675761009536610d77565b30330361013f57806101016100fb6100f660a06fffffffffffffffffffffffffffffffff9501936100c5856110fd565b6100de876100d560c0850161110a565b16600f0b611289565b906100ec60e0840184611127565b9490933690610c2a565b61134b565b916110fd565b156101355781165b7fecbd9804000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b60801d8116610109565b7f29c3b7ee000000000000000000000000000000000000000000000000000000005f5260045ffd5b5f80fd5b34610167575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261016757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101675760406101e936610a53565b5f806102915f61022b6102575a9688519283917f6a36a38c00000000000000000000000000000000000000000000000000000000602084015260248301610e99565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610936565b8651809381927f48c89491000000000000000000000000000000000000000000000000000000008352602060048401526024830190610de7565b03818373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1908161030d575b506103055750506102f76102f16102e9611020565b925a9061104f565b916112b5565b905b82519182526020820152f35b9091506102f9565b610328903d805f833e6103208183610936565b810190610fbd565b6102d4565b3461016757604061033d36610c93565b5f806102915f61022b6102575a9688519283917feebe0c6a0000000000000000000000000000000000000000000000000000000060208401526024830161105c565b346101675761038d36610e2a565b30330361013f57602081016103a281836111a7565b90506103b06040840161110a565b916103ba846111fb565b9190815b610400576fffffffffffffffffffffffffffffffff847fecbd9804000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b90919261040d82866111a7565b91907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85018581116104dc5761046561045e6fffffffffffffffffffffffffffffffff926104ac966104819561121c565b9788611588565b939061047460808a018a611127565b939092169085159061134b565b90156105095761049390600f0b611178565b6fffffffffffffffffffffffffffffffff165b936111fb565b9180156104dc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190816103be565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6105159060801d611178565b6fffffffffffffffffffffffffffffffff166104a6565b346101675760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101675760043567ffffffffffffffff811161016757366023820112156101675780600401359067ffffffffffffffff82116101675736602483830101116101675773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361062e575f6024819284806040519384930183378101838152039082305af16105f9611020565b9061060657602081519101fd5b7fe0752a5a000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fae18210a000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101675761066436610e2a565b30330361013f57602081019061067a82826111a7565b90506106886040830161110a565b91610692816111fb565b935f915b8383106106db576fffffffffffffffffffffffffffffffff857fecbd9804000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b9091929361075c6fffffffffffffffffffffffffffffffff61073d61072860019461071a6107138a61070d8b8b6111a7565b9061121c565b9b8c611588565b948593919216600f0b611289565b61073560808d018d611127565b93909261134b565b9015610767576fffffffffffffffffffffffffffffffff165b966111fb565b959493019190610696565b60801d6fffffffffffffffffffffffffffffffff16610756565b346101675761078f36610d77565b30330361013f57806107db6100fb6100f660a06fffffffffffffffffffffffffffffffff9501936107bf856110fd565b866107cc60c0840161110a565b16906100ec60e0840184611127565b1561081a576107ec9060801d611178565b81167fecbd9804000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b61082690600f0b611178565b8116610109565b3461016757604061083d36610c93565b5f806102915f61022b6102575a9688519283917f595323f50000000000000000000000000000000000000000000000000000000060208401526024830161105c565b3461016757604061088f36610a53565b5f806102915f61022b6102575a9688519283917faa2f150100000000000000000000000000000000000000000000000000000000602084015260248301610e99565b6060810190811067ffffffffffffffff8211176108ed57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60a0810190811067ffffffffffffffff8211176108ed57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176108ed57604052565b359073ffffffffffffffffffffffffffffffffffffffff8216820361016757565b359062ffffff8216820361016757565b35908160020b820361016757565b67ffffffffffffffff81116108ed57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81601f8201121561016757803590610a07826109b6565b92610a156040519485610936565b8284526020838301011161016757815f926020809301838601378301015290565b35906fffffffffffffffffffffffffffffffff8216820361016757565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126101675760043567ffffffffffffffff81116101675760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82840301126101675760405191610ac8836108d1565b610ad482600401610977565b8352602482013567ffffffffffffffff811161016757820190806023830112156101675760048201359167ffffffffffffffff83116108ed578260051b60405193610b226020830186610936565b845281016024019060208401908383116101675760248101915b838310610b615750505050506020830152610b5990604401610a36565b604082015290565b823567ffffffffffffffff8111610167576004908301019060a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083880301126101675760405190610bb28261091a565b610bbe60208401610977565b8252610bcc60408401610998565b6020830152610bdd606084016109a8565b6040830152610bee60808401610977565b606083015260a08301359167ffffffffffffffff831161016757610c1a886020809695819601016109f0565b6080820152815201920191610b3c565b91908260a091031261016757604051610c428161091a565b6080610c8e818395610c5381610977565b8552610c6160208201610977565b6020860152610c7260408201610998565b6040860152610c83606082016109a8565b606086015201610977565b910152565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126101675760043567ffffffffffffffff8111610167576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc828403011261016757604051916080830183811067ffffffffffffffff8211176108ed57604052610d278183600401610c2a565b835260a48201358015158103610167576020840152610d4860c48301610a36565b604084015260e48201359167ffffffffffffffff831161016757610d6f92016004016109f0565b606082015290565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610167576004359067ffffffffffffffff8211610167577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82610100920301126101675760040190565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602080948051918291828752018686015e5f8582860101520116010190565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610167576004359067ffffffffffffffff8211610167577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc826060920301126101675760040190565b60208152608081019173ffffffffffffffffffffffffffffffffffffffff815116602083015260208101519260606040840152835180915260a0830190602060a08260051b8601019501915f905b828210610f1157505050506fffffffffffffffffffffffffffffffff604060609201511691015290565b90919295602080610faf837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608a6001960301865260a060808c5173ffffffffffffffffffffffffffffffffffffffff815116845262ffffff868201511686850152604081015160020b604085015273ffffffffffffffffffffffffffffffffffffffff60608201511660608501520151918160808201520190610de7565b980192019201909291610ee7565b6020818303126101675780519067ffffffffffffffff8211610167570181601f8201121561016757805190610ff1826109b6565b92610fff6040519485610936565b8284526020838301011161016757815f9260208093018386015e8301015290565b3d1561104a573d90611031826109b6565b9161103f6040519384610936565b82523d5f602084013e565b606090565b919082039182116104dc57565b61012060606110fa93602084526110c160208501825173ffffffffffffffffffffffffffffffffffffffff6080809282815116855282602082015116602086015262ffffff6040820151166040860152606081015160020b6060860152015116910152565b6020810151151560c08501526fffffffffffffffffffffffffffffffff60408201511660e0850152015191610100808201520190610de7565b90565b3580151581036101675790565b356fffffffffffffffffffffffffffffffff811681036101675790565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610167570180359067ffffffffffffffff82116101675760200191813603831361016757565b600f0b7fffffffffffffffffffffffffffffffff8000000000000000000000000000000081146104dc575f0390565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610167570180359067ffffffffffffffff821161016757602001918160051b3603831361016757565b3573ffffffffffffffffffffffffffffffffffffffff811681036101675790565b919081101561125c5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6181360301821215610167570190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f800000000000000000000000000000000000000000000000000000000000000081146104dc575f0390565b7fecbd9804000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000060208301511603611309576024015190565b611347906040519182917f6190b2b0000000000000000000000000000000000000000000000000000000008352602060048401526024830190610de7565b0390fd5b92949390801561156d576401000276a4915b806040519261136b846108d1565b1515978884526020840194868652604085019073ffffffffffffffffffffffffffffffffffffffff1681526040519586957ff3cd914c00000000000000000000000000000000000000000000000000000000875260048701611417908b73ffffffffffffffffffffffffffffffffffffffff6080809282815116855282602082015116602086015262ffffff6040820151166040860152606081015160020b6060860152015116910152565b51151560a48701525160c48601525173ffffffffffffffffffffffffffffffffffffffff1660e48501526101048401610120905281610124850152610144840137808201610144015f9052601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681010361014401817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1691815a6020945f91f1908115611562575f91611530575b5080945f8312145f146115285760801d5b600f0b036114f95750565b60a090207f7a5ed734000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b600f0b6114ee565b90506020813d60201161155a575b8161154b60209383610936565b8101031261016757515f6114dd565b3d915061153e565b6040513d5f823e3d90fd5b73fffd8963efd1fc6a506488495d951d5263988d259161135d565b905f60806040516115988161091a565b82815282602082015282604082015282606082015201526115b8826111fb565b73ffffffffffffffffffffffffffffffffffffffff82169173ffffffffffffffffffffffffffffffffffffffff82168084105f14611690575073ffffffffffffffffffffffffffffffffffffffff905b1680921492602081013562ffffff8116809103610167576040820135918260020b80930361016757606001359273ffffffffffffffffffffffffffffffffffffffff84168094036101675773ffffffffffffffffffffffffffffffffffffffff90604051956116768761091a565b865216602085015260408401526060830152608082015291565b91505073ffffffffffffffffffffffffffffffffffffffff829161160856fea164736f6c634300081a000a";
16
+ }
17
+ }
@@ -0,0 +1,18 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.26;
3
+
4
+ import {DeployHelper} from "./DeployHelper.sol";
5
+
6
+ /// @dev https://github.com/hookmate/v4-router
7
+ library V4RouterDeployer {
8
+ function deploy(address poolManager, address permit2) internal returns (address v4Router) {
9
+ bytes memory args = abi.encode(poolManager, permit2);
10
+ bytes memory initcode_ = abi.encodePacked(initcode(), args);
11
+ v4Router = DeployHelper.deploy(initcode_);
12
+ }
13
+
14
+ function initcode() internal pure returns (bytes memory) {
15
+ return
16
+ hex"60c0601f61290f38819003918201601f19168301916001600160401b038311848410176100ad5780849260409485528339810103126100a9578051906001600160a01b03821682036100a95760200151906001600160a01b03821682036100a95760805260a05260405161284d90816100c28239608051818181601c015281816102e0015281816106b601528181611d19015261266a015260a051818181610965015261158a0152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610050575b50361561001a575f80fd5b7f0000000000000000000000000000000000000000000000000000000000000000330361004357005b6382b429005f526004601cfd5b5f905f3560e01c90816312261ee714611542575080631f03952f146114af57806371d9e3dc146111f957806391dd73461461066257806398377a6c146105a2578063aacdd80f14610508578063af2b4aba1461043a578063b1a0d57114610375578063d737d0c714610304578063dc4c90d3146102955763e729a0be0361000f5760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610292576044359060043573ffffffffffffffffffffffffffffffffffffffff831683036102905760643567ffffffffffffffff811161028c5761013f9036906004016115cf565b9060843573ffffffffffffffffffffffffffffffffffffffff81168091036102885760a43580421161025d5750926101eb602096936102179360ff61021c97337f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5d89861395861561024e57955b15610247576002905b604051966101c3886117d2565b87526024358c88015233604088015260608701521660808501526040519586948a86016118f0565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611853565b611cbf565b907f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5d604051908152f35b89906101b6565b61025790611aee565b956101ad565b7fbfb22adf000000000000000000000000000000000000000000000000000000008652600452602485fd5b8480fd5b8280fd5b505b80fd5b503461029257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029257602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461029257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102925760207f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5c73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b5061037f3661171a565b8098979691929598949394421161040f5750936102179361021c969373ffffffffffffffffffffffffffffffffffffffff6101eb9460209b98337f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5d604051976103e8896117d2565b88528c880152336040880152166060860152600160808601526040519687958b8701611b47565b7fbfb22adf000000000000000000000000000000000000000000000000000000008852600452602487fd5b5060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102925760043567ffffffffffffffff8111610290576104859036906004016116a9565b6024929192358042116104dd5750337f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5d3360a435036104d05761021760209361021c923691611c7a565b6382b4290082526004601cfd5b7fbfb22adf000000000000000000000000000000000000000000000000000000008352600452602482fd5b506105123661171a565b8098979691929598949394421161040f5750936102179361021c969373ffffffffffffffffffffffffffffffffffffffff6101eb9460209b98337f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5d6040519761057b896117d2565b88528c880152336040880152166060860152600360808601526040519687958b8701611b47565b506105ac36611600565b809796959192949742116106375750602096936102179373ffffffffffffffffffffffffffffffffffffffff61021c97946101eb94337f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5d60405196610611886117d2565b87528b8701523360408701521660608501528760808501526040519586948a86016118f0565b7fbfb22adf000000000000000000000000000000000000000000000000000000008752600452602486fd5b5034610d475760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610d475760043567ffffffffffffffff8111610d47576106b29036906004016116a9565b91907f00000000000000000000000000000000000000000000000000000000000000009073ffffffffffffffffffffffffffffffffffffffff8216938433036111d1578101918183039460a08612610d475761070e8484611ddc565b9360808501516001811615159260028216151593875193815f14610e0e576107346120bf565b506101808b12610d47576107488189611ddc565b5061075560a0890161169c565b976107638260c0830161200d565b9561016082013567ffffffffffffffff8111610d475783610785918401611e3b565b8a15610dd55773ffffffffffffffffffffffffffffffffffffffff8851169773ffffffffffffffffffffffffffffffffffffffff6020820151165b989b8a15610dc2575f8412610d9a576107d99391612575565b9b8c935b73ffffffffffffffffffffffffffffffffffffffff8b169a73ffffffffffffffffffffffffffffffffffffffff89168c1095865f14610d8b578060801d5f03600f0b965b15610d7f57600f0b995b15610d735760208d015186115b610d4b576010881615610c7b57506040516108528161181b565b6040518e61085f82611837565b60405161086b8161181b565b81815281602082015282528060208301526040820152815260606020820152505f14610c15576101a013610c11576108a38282611ddc565b506108b060a0820161169c565b506108be8260c0830161200d565b5061016081013567ffffffffffffffff8111610c0d57826108e0918301611e3b565b506101808101359067ffffffffffffffff8211610c0d57610902929101611f76565b823b15610bfe576040517fa58411940000000000000000000000000000000000000000000000000000000081528860048201528a8160248183885af18015610c0257908b91610be9575b505073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690805190604051936109968561181b565b8585526020850152602073ffffffffffffffffffffffffffffffffffffffff60408d01511691015190833b15610be5578c610a689593610a808296946040948551998a98899788967f30f28b7a000000000000000000000000000000000000000000000000000000008852610a2f6004890182516020809173ffffffffffffffffffffffffffffffffffffffff81511684520151910152565b60208181015160448a01529101516064880152815173ffffffffffffffffffffffffffffffffffffffff166084880152015160a4860152565b60c484015261010060e48401526101048301906116d7565b03925af18015610bda57908991610bc1575b50906020906004604051809481937f11da60b40000000000000000000000000000000000000000000000000000000083525af18015610bb65791600891610b0296959493610b87575b505b1615159273ffffffffffffffffffffffffffffffffffffffff60608801511691612450565b15610b3c575b610b388360405190602082015260208152610b24604082611853565b6040519182916020835260208301906116d7565b0390f35b479081610b4a575b50610b08565b90828073ffffffffffffffffffffffffffffffffffffffff604082950151169238935af115610b7a578080610b44565b63b12d13eb90526004601cfd5b610ba89060203d602011610baf575b610ba08183611853565b810190611cb0565b505f610adb565b503d610b96565b6040513d8a823e3d90fd5b81610bcb91611853565b610bd657875f610a92565b8780fd5b6040513d8b823e3d90fd5b8c80fd5b81610bf391611853565b610bfe57895f61094c565b8980fd5b6040513d8d823e3d90fd5b8b80fd5b8a80fd5b61010013610c1157610c278282611ddc565b50610c3460a082016115ae565b5060c081013567ffffffffffffffff8111610c0d5782610c55918301611e56565b5060e08101359067ffffffffffffffff8211610c0d57610c76929101611f76565b610902565b9c9b9a999897969593505050508615610ccc575b5090610cc787600893610b0298999a9b8873ffffffffffffffffffffffffffffffffffffffff604060048816151595015116916120e9565b610add565b803b15610d47575f80916024604051809481937fa58411940000000000000000000000000000000000000000000000000000000083528c60048401525af18015610d3c5715610c8f5787610b029798995060089392610d2e5f610cc794611853565b5f9a50929350979650610c8f565b6040513d5f823e3d90fd5b5f80fd5b7f8199f5f3000000000000000000000000000000000000000000000000000000005f5260045ffd5b60208d01518a10610838565b60801d600f0b9961082b565b80600f0b5f03600f0b96610821565b7f93dafdf1000000000000000000000000000000000000000000000000000000005f5260045ffd5b5f8412610d9a576107d9935f0391612575565b73ffffffffffffffffffffffffffffffffffffffff6020890151169773ffffffffffffffffffffffffffffffffffffffff8151166107c0565b60e08b12610d4757610e208189611ddc565b50610e2d60a089016115ae565b9760c081013567ffffffffffffffff8111610d475782610e4e918301611e56565b95898751156111a95773ffffffffffffffffffffffffffffffffffffffff610e997fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a51018a6120ab565b51511697891561105b57610eab6120bf565b505f8312610d9a5782917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff825101610ee381846120ab565b5181805b610fc857505073ffffffffffffffffffffffffffffffffffffffff610f398192610f33610f1d86610f1789612071565b516126e7565b98896080610f2a8b612071565b51015192612575565b956120ab565b51511691161015610f78576fffffffffffffffffffffffffffffffff9115610f6f5760801d915b169060801b175b9b8c936107dd565b600f0b91610f60565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000009115610fc05760801d5b6fffffffffffffffffffffffffffffffff169160801b1617610f67565b600f0b610fa3565b6080917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61102992019661101d73ffffffffffffffffffffffffffffffffffffffff6110148a8a6120ab565b515116836126e7565b94859193015192612575565b901561104e5760801d5f03600f0b5b600f0b938061104781866120ab565b5191610ee7565b600f0b5f03600f0b611038565b90806110656120bf565b505f8412610d9a57835f039280519061107d81612071565b51915f925b81840361112c575050505073ffffffffffffffffffffffffffffffffffffffff908116911610156110d3576fffffffffffffffffffffffffffffffff80915f03169116600f0b5f0360801b17610f67565b906fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffff000000000000000000000000000000009116600f0b5f036fffffffffffffffffffffffffffffffff16915f0360801b1617610f67565b909192959361114d611140600192846126e7565b9687608086015192612575565b825173ffffffffffffffffffffffffffffffffffffffff16951561119c57600f0b5f03600f0b5b600f0b96019082821061118b575b92919092611082565b5061119681846120ab565b51611182565b60801d5f03600f0b611174565b7f20a2d33d000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fae18210a000000000000000000000000000000000000000000000000000000005f5260045ffd5b6101607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610d4757600435604435801515809103610d475760a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c360112610d47576101043567ffffffffffffffff8111610d475761127f9036906004016116a9565b9290916101243573ffffffffffffffffffffffffffffffffffffffff8116809103610d475761014435804211611484575060ff90337f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5d5f841393841561147557935b1561146e576002905b604051946112f8866117d2565b85526024356020860152336040860152606085015260011716608083015261137e60405192602084019060ff60808092805185526020810151602086015273ffffffffffffffffffffffffffffffffffffffff604082015116604086015273ffffffffffffffffffffffffffffffffffffffff6060820151166060860152015116910152565b60c082015260643573ffffffffffffffffffffffffffffffffffffffff8116809103610d475760e082015260843573ffffffffffffffffffffffffffffffffffffffff8116809103610d475761010082015260a43562ffffff8116809103610d475761012082015260c4358060020b809103610d475761014082015260e4359173ffffffffffffffffffffffffffffffffffffffff8316809303610d4757816101eb6102179260209661144396610160850152610180808501526101a08401916118b2565b5f7f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5d604051908152f35b5f906112eb565b61147e90611aee565b936112e2565b7fbfb22adf000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b6114b836611600565b80969591929496421161148457602061144388610217896101eb8a8a73ffffffffffffffffffffffffffffffffffffffff8b8b337f0aedd6bde10e3aa2adec092b02a3e3e805795516cda41f27aa145b8f300af87a5d6040519661151b886117d2565b87528a870152336040870152166060850152600260808501526040519586948986016118f0565b34610d47575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610d475760209073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b359073ffffffffffffffffffffffffffffffffffffffff82168203610d4757565b9181601f84011215610d475782359167ffffffffffffffff8311610d47576020808501948460051b010111610d4757565b9060c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc830112610d4757600435916024359160443573ffffffffffffffffffffffffffffffffffffffff81168103610d4757916064359067ffffffffffffffff8211610d4757611673916004016115cf565b909160843573ffffffffffffffffffffffffffffffffffffffff81168103610d47579060a43590565b35908115158203610d4757565b9181601f84011215610d475782359167ffffffffffffffff8311610d475760208381860195010111610d4757565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602080948051918291828752018686015e5f8582860101520116010190565b6101607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610d475760043591602435916044358015158103610d47579160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c830112610d4757606491610104359067ffffffffffffffff8211610d47576117a7916004016116a9565b90916101243573ffffffffffffffffffffffffffffffffffffffff81168103610d4757906101443590565b60a0810190811067ffffffffffffffff8211176117ee57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040810190811067ffffffffffffffff8211176117ee57604052565b6060810190811067ffffffffffffffff8211176117ee57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176117ee57604052565b359062ffffff82168203610d4757565b35908160020b8203610d4757565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe093818652868601375f8582860101520116010190565b93919073ffffffffffffffffffffffffffffffffffffffff839261196f8760e081019460ff60808092805185526020810151602086015273ffffffffffffffffffffffffffffffffffffffff604082015116604086015273ffffffffffffffffffffffffffffffffffffffff6060820151166060860152015116910152565b1660a086015260e060c08601525261010083016101008260051b85010193835f917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6182360301905b8584106119c8575050505050505090565b909192939495967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00828203018652873583811215610d4757840173ffffffffffffffffffffffffffffffffffffffff611a20826115ae565b16825262ffffff611a3360208301611894565b166020830152611a45604082016118a4565b60020b604083015273ffffffffffffffffffffffffffffffffffffffff611a6e606083016115ae565b16606083015260808101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe182360301811215610d4757016020813591019067ffffffffffffffff8111610d47578036038213610d4757611adf602092839260a086816080600199015201916118b2565b990197960194019291906119b7565b7f80000000000000000000000000000000000000000000000000000000000000008114611b1a575f0390565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b90611c286080611c3d979561018095611bcc8673ffffffffffffffffffffffffffffffffffffffff9660ff60808092805185526020810151602086015273ffffffffffffffffffffffffffffffffffffffff604082015116604086015273ffffffffffffffffffffffffffffffffffffffff6060820151166060860152015116910152565b151560a086015283611bdd826115ae565b1660c086015283611bf0602083016115ae565b1660e086015262ffffff611c0660408301611894565b16610100860152611c19606082016118a4565b60020b610120860152016115ae565b166101408201528161016082015201916118b2565b90565b67ffffffffffffffff81116117ee57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192611c8682611c40565b91611c946040519384611853565b829481845281830111610d47578281602093845f960137010152565b90816020910312610d47575190565b5f611cff91604051809381927f48c894910000000000000000000000000000000000000000000000000000000083526020600484015260248301906116d7565b03818373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1908115610d3c575f91611d62575b5060208151918180820193849201010312610d47575190565b90503d805f833e611d738183611853565b810190602081830312610d475780519067ffffffffffffffff8211610d47570181601f82011215610d4757805190611daa82611c40565b92611db86040519485611853565b82845260208383010111610d4757815f9260208093018386015e830101525f611d49565b91908260a0910312610d4757604051611df4816117d2565b608081938035835260208101356020840152611e12604082016115ae565b6040840152611e23606082016115ae565b606084015201359060ff82168203610d475760800152565b9080601f83011215610d4757816020611c3d93359101611c7a565b9080601f83011215610d475781359167ffffffffffffffff83116117ee578260051b60405193611e896020830186611853565b845260208085019183010191838311610d475760208101915b838310611eb157505050505090565b823567ffffffffffffffff8111610d475782019060a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08388030112610d475760405190611efe826117d2565b611f0a602084016115ae565b8252611f1860408401611894565b6020830152611f29606084016118a4565b6040830152611f3a608084016115ae565b606083015260a08301359167ffffffffffffffff8311610d4757611f6688602080969581960101611e3b565b6080820152815201920191611ea2565b808203929160a08412610d475760405191611f908361181b565b829460808112610d47576040805191611fa883611837565b12610d4757604051611fb98161181b565b611fc2836115ae565b81526020830135602082015281526040820135602082015260608201356040820152835260808101359167ffffffffffffffff8311610d47576020926120089201611e3b565b910152565b91908260a0910312610d4757604051612025816117d2565b6080612008818395612036816115ae565b8552612044602082016115ae565b602086015261205560408201611894565b6040860152612066606082016118a4565b6060860152016115ae565b80511561207e5760200190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b805182101561207e5760209160051b010190565b604051906120cc826117d2565b5f6080838281528260208201528260408201528260608201520152565b905f94841561244857156121a35773ffffffffffffffffffffffffffffffffffffffff1690813b15610288576040517ff5298aca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff93841660048201529216602483015260448201929092529082908290818381606481015b03925af1801561219857612186575050565b612191828092611853565b6102925750565b6040513d84823e3d90fd5b92939273ffffffffffffffffffffffffffffffffffffffff90911691826122af575073ffffffffffffffffffffffffffffffffffffffff1690813b1561028c57604051907fa58411940000000000000000000000000000000000000000000000000000000082526004820152828160248183865af180156122a45790839161228f575b50506020906004604051809581937f11da60b40000000000000000000000000000000000000000000000000000000083525af190811561228357506122685750565b6122809060203d602011610baf57610ba08183611853565b50565b604051903d90823e3d90fd5b8161229991611853565b61029057815f612226565b6040513d85823e3d90fd5b9293919073ffffffffffffffffffffffffffffffffffffffff1692833b15610d47576040517fa58411940000000000000000000000000000000000000000000000000000000081528260048201525f8160248183895af18015610d3c57612415575b5084936020939092909173ffffffffffffffffffffffffffffffffffffffff16903082146123c75761238a92604051927f23b872dd00000000000000000000000000000000000000000000000000000000878501526024840152846044840152606483015260648252612385608483611853565b6127b9565b6004604051809581937f11da60b40000000000000000000000000000000000000000000000000000000083525af190811561228357506122685750565b612410929150604051917fa9059cbb0000000000000000000000000000000000000000000000000000000086840152846024840152604483015260448252612385606483611853565b61238a565b73ffffffffffffffffffffffffffffffffffffffff95509161243c5f602095939694611853565b5f955091939092612311565b505050505050565b905f94841561244857156124df5773ffffffffffffffffffffffffffffffffffffffff1690813b15610288576040517f156e29f600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9384166004820152921660248301526044820192909252908290829081838160648101612174565b73ffffffffffffffffffffffffffffffffffffffff919392945016803b15610d47575f928360649273ffffffffffffffffffffffffffffffffffffffff948560405198899788967f0b0d9c0900000000000000000000000000000000000000000000000000000000885216600487015216602485015260448401525af18015610d3c576125695750565b5f61257391611853565b565b61265073ffffffffffffffffffffffffffffffffffffffff9485608094602096815f146126cc576401000276a4915b604051906125b182611837565b15158152888101918252836040820193168352604051998a9889987ff3cd914c000000000000000000000000000000000000000000000000000000008a528281511660048b0152828c8201511660248b015262ffffff60408201511660448b0152606081015160020b60648b0152015116608488015251151560a48701525160c4860152511660e48401526101206101048401526101248301906116d7565b03815f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1908115610d3c575f9161269d575090565b90506020813d6020116126c4575b816126b860209383611853565b81010312610d47575190565b3d91506126ab565b73fffd8963efd1fc6a506488495d951d5263988d25916125a4565b906126f06120bf565b5073ffffffffffffffffffffffffffffffffffffffff82511673ffffffffffffffffffffffffffffffffffffffff8216918183105f1461279c5773ffffffffffffffffffffffffffffffffffffffff905b168092149262ffffff60208201511673ffffffffffffffffffffffffffffffffffffffff806060604085015160020b940151169360405195612782876117d2565b865216602085015260408401526060830152608082015291565b5073ffffffffffffffffffffffffffffffffffffffff8291612741565b905f602091828151910182855af115610d3c575f513d612837575073ffffffffffffffffffffffffffffffffffffffff81163b155b6127f55750565b73ffffffffffffffffffffffffffffffffffffffff907f5274afe7000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b600114156127ee56fea164736f6c634300081e000a";
17
+ }
18
+ }
@@ -0,0 +1,193 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.26;
3
+
4
+ /// @notice List of addresses where core contracts are deployed.
5
+ library AddressConstants {
6
+ error UnsupportedChainId();
7
+
8
+ function getPoolManagerAddress(uint256 chainId) internal pure returns (address) {
9
+ if (chainId == 1) {
10
+ return address(0x000000000004444c5dc75cB358380D2e3dE08A90); // Ethereum Mainnet
11
+ }
12
+ if (chainId == 130) {
13
+ return address(0x1F98400000000000000000000000000000000004); // Unichain
14
+ }
15
+ if (chainId == 10) {
16
+ return address(0x9a13F98Cb987694C9F086b1F5eB990EeA8264Ec3); // Optimism
17
+ }
18
+ if (chainId == 8453) {
19
+ return address(0x498581fF718922c3f8e6A244956aF099B2652b2b); // Base
20
+ }
21
+ if (chainId == 42161) {
22
+ return address(0x360E68faCcca8cA495c1B759Fd9EEe466db9FB32); // Arbitrum One
23
+ }
24
+ if (chainId == 137) {
25
+ return address(0x67366782805870060151383F4BbFF9daB53e5cD6); // Polygon
26
+ }
27
+ if (chainId == 81457) {
28
+ return address(0x1631559198A9e474033433b2958daBC135ab6446); // Blast
29
+ }
30
+ if (chainId == 7777777) {
31
+ return address(0x0575338e4C17006aE181B47900A84404247CA30f); // Zora
32
+ }
33
+ if (chainId == 480) {
34
+ return address(0xb1860D529182ac3BC1F51Fa2ABd56662b7D13f33); // Worldchain
35
+ }
36
+ if (chainId == 57073) {
37
+ return address(0x360E68faCcca8cA495c1B759Fd9EEe466db9FB32); // Ink
38
+ }
39
+ if (chainId == 1868) {
40
+ return address(0x360E68faCcca8cA495c1B759Fd9EEe466db9FB32); // Soneium
41
+ }
42
+ if (chainId == 43114) {
43
+ return address(0x360E68faCcca8cA495c1B759Fd9EEe466db9FB32); // Avalanche
44
+ }
45
+ if (chainId == 56) {
46
+ return address(0x28e2Ea090877bF75740558f6BFB36A5ffeE9e9dF); // BNB Smart Chain
47
+ }
48
+ if (chainId == 1301) {
49
+ return address(0x00B036B58a818B1BC34d502D3fE730Db729e62AC); // Unichain Sepolia
50
+ }
51
+ if (chainId == 11155111) {
52
+ return address(0xE03A1074c86CFeDd5C142C4F04F1a1536e203543); // Sepolia
53
+ }
54
+ if (chainId == 84532) {
55
+ return address(0x05E73354cFDd6745C338b50BcFDfA3Aa6fA03408); // Base Sepolia
56
+ }
57
+ if (chainId == 421614) {
58
+ return address(0xFB3e0C6F74eB1a21CC1Da29aeC80D2Dfe6C9a317); // Arbitrum Sepolia
59
+ }
60
+ if (chainId == 420120000) {
61
+ return address(0x9131B9084E6017Be19c6a0ef23f73dbB1Bf41f96); // interop-alpha-0
62
+ }
63
+ if (chainId == 420120001) {
64
+ return address(0x9131B9084E6017Be19c6a0ef23f73dbB1Bf41f96); // interop-alpha-1
65
+ }
66
+
67
+ revert UnsupportedChainId();
68
+ }
69
+
70
+ function getPositionManagerAddress(uint256 chainId) internal pure returns (address) {
71
+ if (chainId == 1) {
72
+ return address(0xbD216513d74C8cf14cf4747E6AaA6420FF64ee9e); // Ethereum Mainnet
73
+ }
74
+ if (chainId == 130) {
75
+ return address(0x4529A01c7A0410167c5740C487A8DE60232617bf); // Unichain
76
+ }
77
+ if (chainId == 10) {
78
+ return address(0x3C3Ea4B57a46241e54610e5f022E5c45859A1017); // Optimism
79
+ }
80
+ if (chainId == 8453) {
81
+ return address(0x7C5f5A4bBd8fD63184577525326123B519429bDc); // Base
82
+ }
83
+ if (chainId == 42161) {
84
+ return address(0xd88F38F930b7952f2DB2432Cb002E7abbF3dD869); // Arbitrum One
85
+ }
86
+ if (chainId == 137) {
87
+ return address(0x1Ec2eBf4F37E7363FDfe3551602425af0B3ceef9); // Polygon
88
+ }
89
+ if (chainId == 81457) {
90
+ return address(0x4AD2F4CcA2682cBB5B950d660dD458a1D3f1bAaD); // Blast
91
+ }
92
+ if (chainId == 7777777) {
93
+ return address(0xf66C7b99e2040f0D9b326B3b7c152E9663543D63); // Zora
94
+ }
95
+ if (chainId == 480) {
96
+ return address(0xC585E0f504613b5fBf874F21Af14c65260fB41fA); // Worldchain
97
+ }
98
+ if (chainId == 57073) {
99
+ return address(0x1b35d13a2E2528f192637F14B05f0Dc0e7dEB566); // Ink
100
+ }
101
+ if (chainId == 1868) {
102
+ return address(0x1b35d13a2E2528f192637F14B05f0Dc0e7dEB566); // Soneium
103
+ }
104
+ if (chainId == 43114) {
105
+ return address(0xB74b1F14d2754AcfcbBe1a221023a5cf50Ab8ACD); // Avalanche
106
+ }
107
+ if (chainId == 56) {
108
+ return address(0x7A4a5c919aE2541AeD11041A1AEeE68f1287f95b); // BNB Smart Chain
109
+ }
110
+ if (chainId == 1301) {
111
+ return address(0xf969Aee60879C54bAAed9F3eD26147Db216Fd664); // Unichain Sepolia
112
+ }
113
+ if (chainId == 11155111) {
114
+ return address(0x429ba70129df741B2Ca2a85BC3A2a3328e5c09b4); // Sepolia
115
+ }
116
+ if (chainId == 84532) {
117
+ return address(0x4B2C77d209D3405F41a037Ec6c77F7F5b8e2ca80); // Base Sepolia
118
+ }
119
+ if (chainId == 421614) {
120
+ return address(0xAc631556d3d4019C95769033B5E719dD77124BAc); // Arbitrum Sepolia
121
+ }
122
+ if (chainId == 420120000) {
123
+ return address(0x4498FE0b1DF6B476453440664A16E269B7587D0F); // interop-alpha-0
124
+ }
125
+ if (chainId == 420120001) {
126
+ return address(0x4498FE0b1DF6B476453440664A16E269B7587D0F); // interop-alpha-1
127
+ }
128
+
129
+ revert UnsupportedChainId();
130
+ }
131
+
132
+ function getPermit2Address() internal pure returns (address) {
133
+ return address(0x000000000022D473030F116dDEE9F6B43aC78BA3); // Same on all chains.
134
+ }
135
+
136
+ /// @dev Important: This uses the Hookmate V4 Router: https://github.com/hookmate/v4-router
137
+ function getV4SwapRouterAddress(uint256 chainId) internal pure returns (address) {
138
+ // Addresses for V4SwapRouter on each chain
139
+ if (chainId == 1) {
140
+ return address(0xA4B6DB94b3017e2b7f17055Ded97D117ed5F551A); // Ethereum Mainnet
141
+ }
142
+ if (chainId == 130) {
143
+ return address(0x67C9C6050978c1582E4A633760B80CA2eff4015A); // Unichain
144
+ }
145
+ if (chainId == 10) {
146
+ return address(0x186EAA4941DF95c6058C69FB30dfE23C2827f9Ac); // OP Mainnet
147
+ }
148
+ if (chainId == 8453) {
149
+ return address(0x15c40591096E938FE2A62515A7f4B8f4349D1DEE); // Base
150
+ }
151
+ if (chainId == 42161) {
152
+ return address(0xC0077d448203c71f6b18061C2E95409b386982BE); // Arbitrum One
153
+ }
154
+ if (chainId == 137) {
155
+ return address(0x8b318E3CcF4495108E8Db61a5814f6bAE98e1465); // Polygon
156
+ }
157
+ if (chainId == 81457) {
158
+ return address(0xE8835Fff71cC8e2253C959683914f24d50Ac9699); // Blast
159
+ }
160
+ if (chainId == 7777777) {
161
+ return address(0x1770E250A9b67E44206542148ed7C5Df38235003); // Zora
162
+ }
163
+ if (chainId == 480) {
164
+ return address(0x3D9e82fb83cA3BDa838AF22d7F3964b25Df64EE7); // World Chain
165
+ }
166
+ if (chainId == 57073) {
167
+ return address(0xC0077d448203c71f6b18061C2E95409b386982BE); // Ink
168
+ }
169
+ if (chainId == 1868) {
170
+ return address(0xC0077d448203c71f6b18061C2E95409b386982BE); // Soneium
171
+ }
172
+ if (chainId == 43114) {
173
+ return address(0x342F35aE81cd6743A4727CdD57e883C877a65aC2); // Avalanche
174
+ }
175
+ if (chainId == 56) {
176
+ return address(0x9461852Ae90c5633207283762a1b5Db337FB3F44); // BNB Smart Chain
177
+ }
178
+ if (chainId == 11155111) {
179
+ return address(0xf13D190e9117920c703d79B5F33732e10049b115); // Sepolia
180
+ }
181
+ if (chainId == 1301) {
182
+ return address(0x9cD2b0a732dd5e023a5539921e0FD1c30E198Dba); // Unichain Sepolia
183
+ }
184
+ if (chainId == 84532) {
185
+ return address(0x71cD4Ea054F9Cb3D3BF6251A00673303411A7DD9); // Base Sepolia
186
+ }
187
+ if (chainId == 421614) {
188
+ return address(0xcD8D7e10A7aA794C389d56A07d85d63E28780220); // Arbitrum Sepolia
189
+ }
190
+
191
+ revert UnsupportedChainId();
192
+ }
193
+ }
@@ -0,0 +1,173 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.26;
3
+
4
+ import {PoolKey} from "@uniswap/v4-core/src/types/PoolKey.sol";
5
+ import {Currency} from "@uniswap/v4-core/src/types/Currency.sol";
6
+ import {BalanceDelta} from "@uniswap/v4-core/src/types/BalanceDelta.sol";
7
+
8
+ import {PathKey} from "./PathKey.sol";
9
+
10
+ /// @title Uniswap V4 Swap Router
11
+ /// @notice A simple, stateless router for execution of swaps against Uniswap v4 Pools
12
+ /// @dev ABI inspired by UniswapV2Router02; https://github.com/hookmate/v4-router
13
+ interface IUniswapV4Router04 {
14
+ /// ================ MULTI POOL SWAPS ================= ///
15
+
16
+ /// @notice Exact Input Swap; swap the specified amount of input tokens for as many output tokens as possible, along the path
17
+ /// @param amountIn the amount of input tokens to swap
18
+ /// @param amountOutMin the minimum amount of output tokens that must be received for the transaction not to revert. reverts on equals to
19
+ /// @param startCurrency the currency to start the swap from
20
+ /// @param path the path of v4 Pools to swap through
21
+ /// @param receiver the address to send the output tokens to
22
+ /// @param deadline block.timestamp must be before this value, otherwise the transaction will revert
23
+ /// @return Delta the balance changes from the swap
24
+ function swapExactTokensForTokens(
25
+ uint256 amountIn,
26
+ uint256 amountOutMin,
27
+ Currency startCurrency,
28
+ PathKey[] calldata path,
29
+ address receiver,
30
+ uint256 deadline
31
+ ) external payable returns (BalanceDelta);
32
+
33
+ /// @notice Exact Output Swap; swap as few input tokens as possible for the specified amount of output tokens, along the path
34
+ /// @param amountOut the amount of output tokens to receive
35
+ /// @param amountInMax the maximum amount of input tokens that can be spent for the transaction not to revert. reverts on equal to
36
+ /// @param startCurrency the currency to start the swap from
37
+ /// @param path the path of v4 Pools to swap through
38
+ /// @param receiver the address to send the output tokens to
39
+ /// @param deadline block.timestamp must be before this value, otherwise the transaction will revert
40
+ /// @return Delta the balance changes from the swap
41
+ function swapTokensForExactTokens(
42
+ uint256 amountOut,
43
+ uint256 amountInMax,
44
+ Currency startCurrency,
45
+ PathKey[] calldata path,
46
+ address receiver,
47
+ uint256 deadline
48
+ ) external payable returns (BalanceDelta);
49
+
50
+ /// @notice General-purpose swap interface for Uniswap v4 that handles all types of swaps
51
+ /// @param amountSpecified the amount of tokens to be swapped, negative for exact input swaps and positive for exact output swaps
52
+ /// @param amountLimit the minimum amount of output tokens for exact input swaps, the maximum amount of input tokens for exact output swaps
53
+ /// @param startCurrency the currency to start the swap from
54
+ /// @param path the path of v4 Pools to swap through
55
+ /// @param receiver the address to send the output tokens to
56
+ /// @param deadline block.timestamp must be before this value, otherwise the transaction will revert
57
+ /// @return Delta the balance changes from the swap
58
+ function swap(
59
+ int256 amountSpecified,
60
+ uint256 amountLimit,
61
+ Currency startCurrency,
62
+ PathKey[] calldata path,
63
+ address receiver,
64
+ uint256 deadline
65
+ ) external payable returns (BalanceDelta);
66
+
67
+ /// ================ SINGLE POOL SWAPS ================ ///
68
+
69
+ /// @notice Single pool, exact input swap - swap the specified amount of input tokens for as many output tokens as possible, on a single pool
70
+ /// @param amountIn the amount of input tokens to swap
71
+ /// @param amountOutMin the minimum amount of output tokens that must be received for the transaction not to revert
72
+ /// @param zeroForOne the direction of the swap, true if currency0 is being swapped for currency1
73
+ /// @param poolKey the pool to swap through
74
+ /// @param hookData the data to be passed to the hook
75
+ /// @param receiver the address to send the output tokens to
76
+ /// @param deadline block.timestamp must be before this value, otherwise the transaction will revert
77
+ /// @return Delta the balance changes from the swap
78
+ function swapExactTokensForTokens(
79
+ uint256 amountIn,
80
+ uint256 amountOutMin,
81
+ bool zeroForOne,
82
+ PoolKey calldata poolKey,
83
+ bytes calldata hookData,
84
+ address receiver,
85
+ uint256 deadline
86
+ ) external payable returns (BalanceDelta);
87
+
88
+ /// @notice Singe pool, exact output swap; swap as few input tokens as possible for the specified amount of output tokens, on a single pool
89
+ /// @param amountOut the amount of output tokens to receive
90
+ /// @param amountInMax the maximum amount of input tokens that can be spent for the transaction not to revert
91
+ /// @param zeroForOne the direction of the swap, true if currency0 is being swapped for currency1
92
+ /// @param poolKey the pool to swap through
93
+ /// @param hookData the data to be passed to the hook
94
+ /// @param receiver the address to send the output tokens to
95
+ /// @param deadline block.timestamp must be before this value, otherwise the transaction will revert
96
+ /// @return Delta the balance changes from the swap
97
+ function swapTokensForExactTokens(
98
+ uint256 amountOut,
99
+ uint256 amountInMax,
100
+ bool zeroForOne,
101
+ PoolKey calldata poolKey,
102
+ bytes calldata hookData,
103
+ address receiver,
104
+ uint256 deadline
105
+ ) external payable returns (BalanceDelta);
106
+
107
+ /// @notice General-purpose single-pool swap interface
108
+ /// @param amountSpecified the amount of tokens to be swapped, negative for exact input swaps and positive for exact output swaps
109
+ /// @param amountLimit the minimum amount of output tokens for exact input swaps, the maximum amount of input tokens for exact output swaps
110
+ /// @param zeroForOne the direction of the swap, true if currency0 is being swapped for currency1
111
+ /// @param poolKey the pool to swap through
112
+ /// @param hookData the data to be passed to the hook
113
+ /// @param receiver the address to send the output tokens to
114
+ /// @param deadline block.timestamp must be before this value, otherwise the transaction will revert
115
+ /// @return Delta the balance changes from the swap
116
+ function swap(
117
+ int256 amountSpecified,
118
+ uint256 amountLimit,
119
+ bool zeroForOne,
120
+ PoolKey calldata poolKey,
121
+ bytes calldata hookData,
122
+ address receiver,
123
+ uint256 deadline
124
+ ) external payable returns (BalanceDelta);
125
+
126
+ /// ================ OPTIMIZED ================ ///
127
+
128
+ /// @notice Generic multi-pool swap function that accepts pre-encoded calldata
129
+ /// @dev Minor optimization to reduce the number of onchain abi.encode calls
130
+ /// @param data Pre-encoded swap data in one of the following formats:
131
+ /// 1. For single-pool swaps: abi.encode(
132
+ /// BaseData baseData, // struct containing swap parameters
133
+ /// bool zeroForOne, // direction of swap
134
+ /// PoolKey poolKey, // key of the pool to swap through
135
+ /// bytes hookData // data to pass to hooks
136
+ /// )
137
+ /// 2. For multi-pool swaps: abi.encode(
138
+ /// BaseData baseData, // struct containing swap parameters
139
+ /// Currency startCurrency, // initial currency in the swap
140
+ /// PathKey[] path // array of path keys defining the route
141
+ /// )
142
+ ///
143
+ /// PERMIT2 EXTENSION:
144
+ /// 1. For single pool swaps: abi.encode(
145
+ /// BaseData baseData, // struct containing swap parameters
146
+ /// bool zeroForOne, // direction of swap
147
+ /// PoolKey poolKey, // key of the pool to swap through
148
+ /// bytes hookData, // data to pass to hooks
149
+ /// PermitPayload permitPayload // permit2 signature payload
150
+ /// )
151
+ /// 2. For multi-pool swaps: abi.encode(
152
+ /// BaseData baseData, // struct containing swap parameters
153
+ /// Currency startCurrency, // initial currency in the swap
154
+ /// PathKey[] path, // array of path keys defining the route
155
+ /// PermitPayload permitPayload // permit2 signature payload
156
+ /// )
157
+ /// Where BaseData.flags contains permit2 flag, and PermitPayload contains:
158
+ /// - permit: ISignatureTransfer.PermitTransferFrom
159
+ /// - signature: bytes
160
+ ///
161
+ /// @param deadline block.timestamp must be before this value, otherwise the transaction will revert
162
+ /// @return Delta the balance changes from the swap
163
+ function swap(bytes calldata data, uint256 deadline) external payable returns (BalanceDelta);
164
+
165
+ /// @notice Provides ETH receipts locked to Pool Manager
166
+ receive() external payable;
167
+
168
+ /// ================ GETTERS ================ ///
169
+
170
+ /// @notice Public view function to be used instead of msg.sender, as the contract performs self-reentrancy and at
171
+ /// times msg.sender == address(this). Instead msgSender() returns the initiator of the lock
172
+ function msgSender() external view returns (address);
173
+ }