@zoralabs/coins 2.4.0 → 2.5.0

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 (129) hide show
  1. package/.abi-stability +923 -0
  2. package/.turbo/turbo-build$colon$js.log +110 -116
  3. package/CHANGELOG.md +25 -0
  4. package/abis/Address.json +0 -16
  5. package/abis/BaseCoin.json +18 -0
  6. package/abis/BuySupplyWithSwapRouterHook.json +0 -27
  7. package/abis/BuySupplyWithV4SwapHook.json +0 -32
  8. package/abis/Clones.json +1 -1
  9. package/abis/CoinDopplerMultiCurve.json +109 -0
  10. package/abis/ContentCoin.json +18 -0
  11. package/abis/Create2.json +0 -21
  12. package/abis/CreatorCoin.json +18 -0
  13. package/abis/ERC1967Proxy.json +1 -1
  14. package/abis/ERC1967Utils.json +0 -45
  15. package/abis/{UpgradeCoinImpl.json → Errors.json} +14 -10
  16. package/abis/{MockERC20.json → IERC1363.json} +134 -104
  17. package/abis/IERC1967.json +47 -0
  18. package/abis/IERC20.json +0 -36
  19. package/abis/IHasCreationInfo.json +20 -0
  20. package/abis/IProtocolRewards.json +0 -258
  21. package/abis/{Script.json → ISupportsLimitOrderFill.json} +2 -2
  22. package/abis/IZoraLimitOrderBookCoinsInterface.json +67 -0
  23. package/abis/IZoraV4CoinHook.json +10 -0
  24. package/abis/ProxyShim.json +15 -16
  25. package/abis/SafeCast.json +51 -0
  26. package/abis/{AddressConstants.json → SafeCast160.json} +1 -1
  27. package/abis/Strings.json +10 -0
  28. package/abis/UUPSUpgradeable.json +1 -1
  29. package/abis/V3ToV4SwapLib.json +28 -0
  30. package/abis/ZoraFactory.json +1 -1
  31. package/abis/ZoraFactoryImpl.json +22 -6
  32. package/abis/ZoraV4CoinHook.json +20 -48
  33. package/dist/index.cjs +980 -43
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.js +978 -41
  36. package/dist/index.js.map +1 -1
  37. package/dist/wagmiGenerated.d.ts +1501 -76
  38. package/dist/wagmiGenerated.d.ts.map +1 -1
  39. package/package/wagmiGenerated.ts +981 -44
  40. package/package.json +11 -9
  41. package/remappings.txt +2 -1
  42. package/src/BaseCoin.sol +32 -2
  43. package/src/ZoraFactoryImpl.sol +8 -0
  44. package/src/deployment/ForkedCoinsAddresses.sol +54 -0
  45. package/src/hooks/ZoraV4CoinHook.sol +131 -20
  46. package/src/hooks/deployment/BuySupplyWithV4SwapHook.sol +20 -142
  47. package/src/interfaces/IHasCreationInfo.sol +12 -0
  48. package/src/interfaces/ISupportsLimitOrderFill.sol +11 -0
  49. package/src/interfaces/IZoraLimitOrderBookCoinsInterface.sol +21 -0
  50. package/src/interfaces/IZoraV4CoinHook.sol +6 -0
  51. package/src/libs/CoinConstants.sol +22 -0
  52. package/src/libs/CoinDopplerMultiCurve.sol +1 -1
  53. package/src/libs/CoinRewardsV4.sol +0 -1
  54. package/src/libs/CoinSetup.sol +7 -1
  55. package/src/libs/HooksDeployment.sol +20 -8
  56. package/src/libs/UniV4SwapHelper.sol +35 -0
  57. package/src/libs/V3ToV4SwapLib.sol +265 -0
  58. package/src/version/ContractVersionBase.sol +1 -1
  59. package/test/BuySupplyWithV4SwapHook.t.sol +4 -3
  60. package/test/Coin.t.sol +7 -1
  61. package/test/CoinUniV4.t.sol +6 -1
  62. package/test/ContentCoinRewards.t.sol +6 -1
  63. package/test/CreatorCoin.t.sol +3 -1
  64. package/test/CreatorCoinRewards.t.sol +4 -1
  65. package/test/Factory.t.sol +20 -7
  66. package/test/HooksDeployment.t.sol +16 -3
  67. package/test/LaunchFee.t.sol +286 -0
  68. package/test/LiquidityMigration.t.sol +52 -44
  69. package/test/MultiOwnable.t.sol +2 -1
  70. package/test/Upgrades.t.sol +110 -81
  71. package/test/V4Liquidity.t.sol +1 -1
  72. package/test/mocks/MockSwapRouter.sol +33 -0
  73. package/test/mocks/MockZoraLimitOrderBook.sol +14 -0
  74. package/test/utils/BaseTest.sol +14 -448
  75. package/test/utils/FeeEstimatorHook.sol +6 -2
  76. package/test/utils/V4TestSetup.sol +595 -0
  77. package/wagmi.config.ts +1 -1
  78. package/abis/BaseTest.json +0 -718
  79. package/abis/DeterministicDeployerAndCaller.json +0 -315
  80. package/abis/DeterministicUUPSProxyDeployer.json +0 -167
  81. package/abis/EIP712.json +0 -67
  82. package/abis/ERC20.json +0 -310
  83. package/abis/FeeEstimatorHook.json +0 -1938
  84. package/abis/IERC721.json +0 -287
  85. package/abis/IERC721Enumerable.json +0 -343
  86. package/abis/IERC721Metadata.json +0 -332
  87. package/abis/IERC721TokenReceiver.json +0 -36
  88. package/abis/IImmutableCreate2Factory.json +0 -93
  89. package/abis/IMulticall3.json +0 -440
  90. package/abis/ISafe.json +0 -15
  91. package/abis/ISymbol.json +0 -15
  92. package/abis/IUniswapV4Router04.json +0 -484
  93. package/abis/IUniversalRouter.json +0 -61
  94. package/abis/IV4Quoter.json +0 -310
  95. package/abis/ImmutableCreate2FactoryUtils.json +0 -15
  96. package/abis/LibString.json +0 -7
  97. package/abis/Math.json +0 -7
  98. package/abis/MockAirlock.json +0 -39
  99. package/abis/MockERC721.json +0 -350
  100. package/abis/ProtocolRewards.json +0 -494
  101. package/abis/ShortStrings.json +0 -18
  102. package/abis/SimpleERC20.json +0 -326
  103. package/abis/StdAssertions.json +0 -379
  104. package/abis/StdInvariant.json +0 -180
  105. package/abis/Test.json +0 -570
  106. package/abis/VmContractHelper235.json +0 -233
  107. package/abis/VmContractHelper242.json +0 -233
  108. package/abis/stdError.json +0 -119
  109. package/abis/stdStorageSafe.json +0 -52
  110. package/addresses/8453.json +0 -13
  111. package/addresses/84532.json +0 -10
  112. package/deterministicConfig/deployerAndCaller.json +0 -5
  113. package/deterministicConfig/zoraFactory.json +0 -8
  114. package/script/Deploy.s.sol +0 -23
  115. package/script/DeployAutoSwapper.s.sol +0 -30
  116. package/script/DeployDevFactory.s.sol +0 -21
  117. package/script/DeployPostDeploymentHooks.s.sol +0 -20
  118. package/script/DeployTrustedMsgSenderLookup.s.sol +0 -20
  119. package/script/DeployUpgradeGate.s.sol +0 -21
  120. package/script/GenerateDeterministicParams.s.sol +0 -43
  121. package/script/PrintRegisterUpgradePath.s.sol +0 -28
  122. package/script/PrintUpgradeCommand.s.sol +0 -13
  123. package/script/TestBackingCoinSwap.s.sol +0 -144
  124. package/script/TestV4Swap.s.sol +0 -133
  125. package/script/UpgradeCoinImpl.sol +0 -23
  126. package/script/UpgradeFactoryImpl.s.sol +0 -28
  127. package/script/UpgradeHooks.s.sol +0 -23
  128. package/src/deployment/CoinsDeployerBase.sol +0 -297
  129. /package/{test → src}/utils/ProxyShim.sol +0 -0
@@ -1,297 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.28;
3
-
4
- import "forge-std/Script.sol";
5
-
6
- import {ProxyDeployerScript, DeterministicContractConfig, DeterministicDeployerAndCaller} from "@zoralabs/shared-contracts/deployment/ProxyDeployerScript.sol";
7
- import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
8
- import {ZoraFactoryImpl} from "../ZoraFactoryImpl.sol";
9
- import {IVersionedContract} from "@zoralabs/shared-contracts/interfaces/IVersionedContract.sol";
10
- // import {BuySupplyWithSwapRouterHook} from "../hooks/deployment/BuySupplyWithSwapRouterHook.sol";
11
- import {IZoraFactory} from "../interfaces/IZoraFactory.sol";
12
- import {ContentCoin} from "../ContentCoin.sol";
13
- import {IHooks} from "@uniswap/v4-core/src/interfaces/IHooks.sol";
14
- import {IPoolManager} from "@uniswap/v4-core/src/interfaces/IPoolManager.sol";
15
- import {ZoraFactory} from "../proxy/ZoraFactory.sol";
16
- import {HooksDeployment} from "../libs/HooksDeployment.sol";
17
- import {ProxyShim} from "../../test/utils/ProxyShim.sol";
18
- import {CreatorCoin} from "../CreatorCoin.sol";
19
- import {Create2} from "@openzeppelin/contracts/utils/Create2.sol";
20
- import {HookUpgradeGate} from "../hooks/HookUpgradeGate.sol";
21
- import {BuySupplyWithV4SwapHook} from "../hooks/deployment/BuySupplyWithV4SwapHook.sol";
22
- import {TrustedMsgSenderProviderLookup} from "../utils/TrustedMsgSenderProviderLookup.sol";
23
- import {ITrustedMsgSenderProviderLookup} from "../interfaces/ITrustedMsgSenderProviderLookup.sol";
24
-
25
- contract CoinsDeployerBase is ProxyDeployerScript {
26
- address internal constant PROTOCOL_REWARDS = 0x7777777F279eba3d3Ad8F4E708545291A6fDBA8B;
27
- address internal constant ZORA = 0x1111111111166b7FE7bd91427724B487980aFc69;
28
-
29
- using stdJson for string;
30
-
31
- struct CoinsDeployment {
32
- // Factory
33
- address zoraFactory;
34
- address zoraFactoryImpl;
35
- // Implementation
36
- address coinV3Impl;
37
- address coinV4Impl;
38
- address creatorCoinImpl;
39
- string coinVersion;
40
- // hooks
41
- address buySupplyWithSwapRouterHook;
42
- address zoraV4CoinHook;
43
- address hookUpgradeGate;
44
- // trusted sender lookup
45
- address trustedMsgSenderLookup;
46
- // Hook deployment salt (for deterministic deployment)
47
- bytes32 zoraV4CoinHookSalt;
48
- bool isDev;
49
- // Hook registry
50
- address zoraHookRegistry;
51
- }
52
-
53
- function addressesFile() internal view returns (string memory) {
54
- return addressesFile(false);
55
- }
56
-
57
- function addressesFile(bool dev) internal view returns (string memory) {
58
- if (dev) {
59
- return string.concat("./addresses/dev/", vm.toString(block.chainid), ".json");
60
- }
61
- return string.concat("./addresses/", vm.toString(block.chainid), ".json");
62
- }
63
-
64
- function saveDeployment(CoinsDeployment memory deployment) internal {
65
- string memory objectKey = "config";
66
-
67
- vm.serializeAddress(objectKey, "ZORA_FACTORY", deployment.zoraFactory);
68
- vm.serializeAddress(objectKey, "ZORA_FACTORY_IMPL", deployment.zoraFactoryImpl);
69
- vm.serializeString(objectKey, "COIN_VERSION", deployment.coinVersion);
70
- vm.serializeAddress(objectKey, "BUY_SUPPLY_WITH_SWAP_ROUTER_HOOK", deployment.buySupplyWithSwapRouterHook);
71
- vm.serializeAddress(objectKey, "COIN_V3_IMPL", deployment.coinV3Impl);
72
- vm.serializeAddress(objectKey, "ZORA_V4_COIN_HOOK", deployment.zoraV4CoinHook);
73
- vm.serializeBytes32(objectKey, "ZORA_V4_COIN_HOOK_SALT", deployment.zoraV4CoinHookSalt);
74
- vm.serializeAddress(objectKey, "CREATOR_COIN_IMPL", deployment.creatorCoinImpl);
75
- vm.serializeAddress(objectKey, "HOOK_UPGRADE_GATE", deployment.hookUpgradeGate);
76
- vm.serializeAddress(objectKey, "ZORA_HOOK_REGISTRY", deployment.zoraHookRegistry);
77
- vm.serializeAddress(objectKey, "TRUSTED_MSG_SENDER_LOOKUP", deployment.trustedMsgSenderLookup);
78
- string memory result = vm.serializeAddress(objectKey, "COIN_V4_IMPL", deployment.coinV4Impl);
79
-
80
- vm.writeJson(result, addressesFile(deployment.isDev));
81
- }
82
-
83
- function readDeployment() internal returns (CoinsDeployment memory deployment) {
84
- return readDeployment(false);
85
- }
86
-
87
- function readDeployment(bool dev) internal returns (CoinsDeployment memory deployment) {
88
- string memory file = addressesFile(dev);
89
- deployment.isDev = dev;
90
- if (!vm.exists(file)) {
91
- return deployment;
92
- }
93
- string memory json = vm.readFile(file);
94
-
95
- deployment.zoraFactory = readAddressOrDefaultToZero(json, "ZORA_FACTORY");
96
- deployment.zoraFactoryImpl = readAddressOrDefaultToZero(json, "ZORA_FACTORY_IMPL");
97
- deployment.coinV3Impl = readAddressOrDefaultToZero(json, "COIN_V3_IMPL");
98
- deployment.coinV4Impl = readAddressOrDefaultToZero(json, "COIN_V4_IMPL");
99
- deployment.coinVersion = readStringOrDefaultToEmpty(json, "COIN_VERSION");
100
- deployment.buySupplyWithSwapRouterHook = readAddressOrDefaultToZero(json, "BUY_SUPPLY_WITH_SWAP_ROUTER_HOOK");
101
- deployment.zoraV4CoinHook = readAddressOrDefaultToZero(json, "ZORA_V4_COIN_HOOK");
102
- deployment.zoraV4CoinHookSalt = readBytes32OrDefaultToZero(json, "ZORA_V4_COIN_HOOK_SALT");
103
- deployment.creatorCoinImpl = readAddressOrDefaultToZero(json, "CREATOR_COIN_IMPL");
104
- deployment.hookUpgradeGate = readAddressOrDefaultToZero(json, "HOOK_UPGRADE_GATE");
105
- deployment.zoraHookRegistry = readAddressOrDefaultToZero(json, "ZORA_HOOK_REGISTRY");
106
- deployment.trustedMsgSenderLookup = readAddressOrDefaultToZero(json, "TRUSTED_MSG_SENDER_LOOKUP");
107
- }
108
-
109
- function deployCoinV4Impl() internal returns (ContentCoin) {
110
- return
111
- new ContentCoin({
112
- protocolRewardRecipient_: getZoraRecipient(),
113
- protocolRewards_: PROTOCOL_REWARDS,
114
- poolManager_: IPoolManager(getUniswapV4PoolManager()),
115
- airlock_: getDopplerAirlock()
116
- });
117
- }
118
-
119
- function deployCreatorCoinImpl() internal returns (CreatorCoin) {
120
- return
121
- new CreatorCoin({
122
- protocolRewardRecipient_: getZoraRecipient(),
123
- protocolRewards_: PROTOCOL_REWARDS,
124
- poolManager_: IPoolManager(getUniswapV4PoolManager()),
125
- airlock_: getDopplerAirlock()
126
- });
127
- }
128
-
129
- function deployZoraFactoryImpl(address coinV4Impl_, address creatorCoinImpl_, address hook_, address zoraHookRegistry_) internal returns (ZoraFactoryImpl) {
130
- return new ZoraFactoryImpl({coinV4Impl_: coinV4Impl_, creatorCoinImpl_: creatorCoinImpl_, hook_: hook_, zoraHookRegistry_: zoraHookRegistry_});
131
- }
132
-
133
- function deployBuySupplyWithV4SwapHook(CoinsDeployment memory deployment) internal returns (BuySupplyWithV4SwapHook) {
134
- return
135
- new BuySupplyWithV4SwapHook({
136
- _factory: IZoraFactory(deployment.zoraFactory),
137
- _swapRouter: getUniswapSwapRouter(),
138
- _poolManager: getUniswapV4PoolManager()
139
- });
140
- }
141
-
142
- function deployUpgradeGate(CoinsDeployment memory deployment) internal returns (CoinsDeployment memory) {
143
- deployment.hookUpgradeGate = address(new HookUpgradeGate(getProxyAdmin()));
144
-
145
- return deployment;
146
- }
147
-
148
- function deployTrustedMsgSenderLookup(CoinsDeployment memory deployment) internal returns (CoinsDeployment memory) {
149
- // Deploy the contract directly using constructor
150
- deployment.trustedMsgSenderLookup = address(new TrustedMsgSenderProviderLookup(getDefaultTrustedMessageSenders(), getProxyAdmin()));
151
-
152
- return deployment;
153
- }
154
-
155
- function deployZoraV4CoinHook(CoinsDeployment memory deployment) internal returns (IHooks hook, bytes32 salt) {
156
- require(deployment.trustedMsgSenderLookup != address(0), "Trusted message sender lookup not deployed");
157
-
158
- return
159
- HooksDeployment.deployHookWithExistingOrNewSalt(
160
- HooksDeployment.FOUNDRY_SCRIPT_ADDRESS,
161
- HooksDeployment.makeHookCreationCode(
162
- getUniswapV4PoolManager(),
163
- deployment.zoraFactory,
164
- ITrustedMsgSenderProviderLookup(deployment.trustedMsgSenderLookup),
165
- deployment.hookUpgradeGate
166
- ),
167
- deployment.zoraV4CoinHookSalt
168
- );
169
- }
170
-
171
- function getDefaultTrustedMessageSenders() internal view returns (address[] memory) {
172
- address[] memory trustedMessageSenders = new address[](2);
173
- trustedMessageSenders[0] = getUniswapUniversalRouter();
174
- trustedMessageSenders[1] = getUniswapV4PositionManager();
175
- return trustedMessageSenders;
176
- }
177
-
178
- function deployFactoryImpl(CoinsDeployment memory deployment) internal returns (address) {
179
- return
180
- address(
181
- deployZoraFactoryImpl({
182
- coinV4Impl_: deployment.coinV4Impl,
183
- creatorCoinImpl_: deployment.creatorCoinImpl,
184
- hook_: deployment.zoraV4CoinHook,
185
- zoraHookRegistry_: deployment.zoraHookRegistry
186
- })
187
- );
188
- }
189
-
190
- function deployImpls(CoinsDeployment memory deployment) internal returns (CoinsDeployment memory) {
191
- // Deploy implementation contracts
192
-
193
- // Deploy trusted message sender lookup first
194
- deployment = deployTrustedMsgSenderLookup(deployment);
195
-
196
- // Deploy hook first, then use its address for coin v4 impl
197
- console.log("deploying content coin hook");
198
- (IHooks zoraV4CoinHook, bytes32 usedSalt) = deployZoraV4CoinHook(deployment);
199
- deployment.zoraV4CoinHook = address(zoraV4CoinHook);
200
- deployment.zoraV4CoinHookSalt = usedSalt;
201
-
202
- deployment.coinV4Impl = address(deployCoinV4Impl());
203
- deployment.creatorCoinImpl = address(deployCreatorCoinImpl());
204
- deployment.zoraFactoryImpl = deployFactoryImpl(deployment);
205
- deployment.coinVersion = IVersionedContract(deployment.coinV4Impl).contractVersion();
206
- // deployment.buySupplyWithSwapRouterHook = address(deployBuySupplyWithSwapRouterHook(deployment));
207
-
208
- return deployment;
209
- }
210
-
211
- function deployHooks(CoinsDeployment memory deployment) internal returns (CoinsDeployment memory) {
212
- // Deploy trusted message sender lookup first
213
- deployment = deployTrustedMsgSenderLookup(deployment);
214
-
215
- // Deploy hook first, then use its address for coin v4 impl
216
- (IHooks zoraV4CoinHook, bytes32 usedSalt) = deployZoraV4CoinHook(deployment);
217
- deployment.zoraV4CoinHook = address(zoraV4CoinHook);
218
- deployment.zoraV4CoinHookSalt = usedSalt;
219
-
220
- deployment.zoraFactoryImpl = deployFactoryImpl(deployment);
221
-
222
- return deployment;
223
- }
224
-
225
- function deployZoraDeterministic(CoinsDeployment memory deployment, DeterministicDeployerAndCaller deployer) internal {
226
- // read previously saved deterministic config
227
- DeterministicContractConfig memory zoraConfig = readDeterministicContractConfig("zoraFactory");
228
-
229
- deployment = deployImpls(deployment);
230
-
231
- if (deployment.zoraFactoryImpl.code.length == 0) {
232
- revert("Factory Impl not yet deployed. Make sure to deploy it with DeployImpl.s.sol");
233
- }
234
-
235
- // build upgrade to and call for factory, with init call
236
- bytes memory upgradeToAndCall = abi.encodeWithSelector(
237
- UUPSUpgradeable.upgradeToAndCall.selector,
238
- deployment.zoraFactoryImpl,
239
- abi.encodeWithSelector(ZoraFactoryImpl.initialize.selector, getProxyAdmin())
240
- );
241
-
242
- // sign deployment with turnkey account
243
- bytes memory signature = signDeploymentWithTurnkey(zoraConfig, upgradeToAndCall, deployer);
244
-
245
- printVerificationCommand(zoraConfig);
246
-
247
- deployment.zoraFactory = deployer.permitSafeCreate2AndCall(
248
- signature,
249
- zoraConfig.salt,
250
- zoraConfig.creationCode,
251
- upgradeToAndCall,
252
- zoraConfig.deployedAddress
253
- );
254
-
255
- // validate that the zora factory owner is the proxy admin
256
- require(ZoraFactoryImpl(deployment.zoraFactory).owner() == getProxyAdmin(), "Zora factory owner is not the proxy admin");
257
- }
258
-
259
- function deployDevFactory(CoinsDeployment memory deployment) internal returns (ZoraFactory devFactory) {
260
- address owner = 0x63545B401283c993320A5b886ecF0fc6CB5668a9;
261
-
262
- ProxyShim shim = new ProxyShim();
263
-
264
- deployment.zoraFactory = address(new ZoraFactory(address(shim)));
265
-
266
- deployment = deployImpls(deployment);
267
-
268
- UUPSUpgradeable(deployment.zoraFactory).upgradeToAndCall(deployment.zoraFactoryImpl, "");
269
-
270
- ZoraFactoryImpl(deployment.zoraFactory).initialize(owner);
271
-
272
- saveDeployment(deployment);
273
-
274
- return ZoraFactory(payable(deployment.zoraFactory));
275
- }
276
-
277
- function printUpgradeFactoryCommand(CoinsDeployment memory deployment) internal view {
278
- // build upgrade to and call for factory, with init call
279
- bytes memory call = abi.encodeWithSelector(UUPSUpgradeable.upgradeToAndCall.selector, deployment.zoraFactoryImpl, "");
280
-
281
- address proxyAdmin = getProxyAdmin();
282
-
283
- address target = address(deployment.zoraFactory);
284
-
285
- // print the details for upgrading:
286
-
287
- console.log("To upgrade the factory, this is the call information:");
288
-
289
- console.log("Multisig:", proxyAdmin);
290
- console.log("Target (the factory proxy):", target);
291
- console.log("Upgrade call:");
292
- console.logBytes(call);
293
- console.log("Function to call: upgradeToAndCall");
294
- // concat the args into a string, factoryImpl, ""
295
- console.log("Args: ", string.concat(vm.toString(deployment.zoraFactoryImpl), ",", '"'));
296
- }
297
- }
File without changes