diff --git a/contracts/zero-ex/contracts/test/foundry/utils/WETH_6_5.sol b/contracts/erc20/contracts/src/v06/WETH9V06.sol similarity index 99% rename from contracts/zero-ex/contracts/test/foundry/utils/WETH_6_5.sol rename to contracts/erc20/contracts/src/v06/WETH9V06.sol index 351ae3e483..500840dc80 100644 --- a/contracts/zero-ex/contracts/test/foundry/utils/WETH_6_5.sol +++ b/contracts/erc20/contracts/src/v06/WETH9V06.sol @@ -14,10 +14,10 @@ // along with this program. If not, see . // solhint-disable -pragma solidity ^0.6; +pragma solidity ^0.6.0; -contract WETH9 { +contract WETH9V06 { string public name = "Wrapped Ether"; string public symbol = "WETH"; uint8 public decimals = 18; @@ -30,7 +30,7 @@ contract WETH9 { mapping (address => uint) public balanceOf; mapping (address => mapping (address => uint)) public allowance; - fallback() external payable { + receive() external payable { deposit(); } function deposit() public payable { diff --git a/contracts/erc20/package.json b/contracts/erc20/package.json index 31fc3e4603..7c0da3626e 100644 --- a/contracts/erc20/package.json +++ b/contracts/erc20/package.json @@ -38,7 +38,7 @@ }, "config": { "publicInterfaceContracts": "DummyERC20Token,ERC20Token,WETH9,ZRXToken,DummyNoReturnERC20Token,DummyMultipleReturnERC20Token", - "abis": "./test/generated-artifacts/@(DummyERC20Token|DummyMultipleReturnERC20Token|DummyNoReturnERC20Token|ERC20Token|IERC20Token|IERC20TokenV06|IEtherToken|IEtherTokenV06|LibERC20Token|LibERC20TokenV06|MintableERC20Token|TestLibERC20Token|TestLibERC20TokenTarget|UnlimitedAllowanceERC20Token|UntransferrableDummyERC20Token|WETH9|ZRXToken).json", + "abis": "./test/generated-artifacts/@(DummyERC20Token|DummyMultipleReturnERC20Token|DummyNoReturnERC20Token|ERC20Token|IERC20Token|IERC20TokenV06|IEtherToken|IEtherTokenV06|LibERC20Token|LibERC20TokenV06|MintableERC20Token|TestLibERC20Token|TestLibERC20TokenTarget|UnlimitedAllowanceERC20Token|UntransferrableDummyERC20Token|WETH9|WETH9V06|ZRXToken).json", "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually." }, "repository": { diff --git a/contracts/erc20/test/artifacts.ts b/contracts/erc20/test/artifacts.ts index a7249ae38a..e050770d05 100644 --- a/contracts/erc20/test/artifacts.ts +++ b/contracts/erc20/test/artifacts.ts @@ -21,6 +21,7 @@ import * as TestLibERC20TokenTarget from '../test/generated-artifacts/TestLibERC import * as UnlimitedAllowanceERC20Token from '../test/generated-artifacts/UnlimitedAllowanceERC20Token.json'; import * as UntransferrableDummyERC20Token from '../test/generated-artifacts/UntransferrableDummyERC20Token.json'; import * as WETH9 from '../test/generated-artifacts/WETH9.json'; +import * as WETH9V06 from '../test/generated-artifacts/WETH9V06.json'; import * as ZRXToken from '../test/generated-artifacts/ZRXToken.json'; export const artifacts = { ERC20Token: ERC20Token as ContractArtifact, @@ -34,6 +35,7 @@ export const artifacts = { IERC20TokenV06: IERC20TokenV06 as ContractArtifact, IEtherTokenV06: IEtherTokenV06 as ContractArtifact, LibERC20TokenV06: LibERC20TokenV06 as ContractArtifact, + WETH9V06: WETH9V06 as ContractArtifact, DummyERC20Token: DummyERC20Token as ContractArtifact, DummyMultipleReturnERC20Token: DummyMultipleReturnERC20Token as ContractArtifact, DummyNoReturnERC20Token: DummyNoReturnERC20Token as ContractArtifact, diff --git a/contracts/erc20/test/wrappers.ts b/contracts/erc20/test/wrappers.ts index ec3d330a31..c08315816b 100644 --- a/contracts/erc20/test/wrappers.ts +++ b/contracts/erc20/test/wrappers.ts @@ -19,4 +19,5 @@ export * from '../test/generated-wrappers/test_lib_erc20_token_target'; export * from '../test/generated-wrappers/unlimited_allowance_erc20_token'; export * from '../test/generated-wrappers/untransferrable_dummy_erc20_token'; export * from '../test/generated-wrappers/weth9'; +export * from '../test/generated-wrappers/weth9v06'; export * from '../test/generated-wrappers/zrx_token'; diff --git a/contracts/erc20/tsconfig.json b/contracts/erc20/tsconfig.json index 16af35ff1c..8753677a38 100644 --- a/contracts/erc20/tsconfig.json +++ b/contracts/erc20/tsconfig.json @@ -25,6 +25,7 @@ "test/generated-artifacts/UnlimitedAllowanceERC20Token.json", "test/generated-artifacts/UntransferrableDummyERC20Token.json", "test/generated-artifacts/WETH9.json", + "test/generated-artifacts/WETH9V06.json", "test/generated-artifacts/ZRXToken.json" ], "exclude": ["./deploy/solc/solc_bin"] diff --git a/contracts/zero-ex/contracts/test/foundry/BasicSwap.sol b/contracts/zero-ex/contracts/test/foundry/BasicSwap.sol index 4467a86a91..a6e6f2b609 100644 --- a/contracts/zero-ex/contracts/test/foundry/BasicSwap.sol +++ b/contracts/zero-ex/contracts/test/foundry/BasicSwap.sol @@ -34,27 +34,18 @@ import "src/transformers/bridges/BridgeProtocols.sol"; import "src/transformers/bridges/EthereumBridgeAdapter.sol"; import "src/IZeroEx.sol"; -/* - This test must be run in forked mode - e.g forge test -vvvv -m 'testBasicSwap' -f ETH_RPC_URL - It is also helpful to have an Etherscan API key exported - export ETHERSCAN_API_KEY= - as Foundry will fetch source code and names -*/ - contract BasicSwapTest is Test, ForkUtils, TestUtils { - DeployZeroEx deployer; + DeployZeroEx.ZeroExDeployed zeroExDeployed; + function setUp() public { - deployer = new DeployZeroEx(); - deployer.deployZeroEx(); + zeroExDeployed = new DeployZeroEx().deployZeroEx(); vm.deal(address(this), 1e19); - vm.deal(address(deployer.IZERO_EX().getTransformWallet()), 1e19); } function testTransformERC20() @@ -64,25 +55,24 @@ contract BasicSwapTest is emit log_string(" --Building Up Transformations--"); ITransformERC20Feature.Transformation[] memory transformations = new ITransformERC20Feature.Transformation[](1); - emit log_named_address(" Finding TransformerDeployer nonce @", address(deployer.transformerDeployer())); + emit log_named_address(" Finding TransformerDeployer nonce @", address(zeroExDeployed.transformerDeployer)); emit log_named_uint( " Deployer nonce", _findTransformerNonce( - address(deployer.wethTransformer()), - address(deployer.transformerDeployer()) + address(zeroExDeployed.transformers.wethTransformer), + address(zeroExDeployed.transformerDeployer) )); - transformations[0].deploymentNonce = _findTransformerNonce(address(deployer.wethTransformer()),address(deployer.transformerDeployer())); + transformations[0].deploymentNonce = _findTransformerNonce(address(zeroExDeployed.transformers.wethTransformer),address(zeroExDeployed.transformerDeployer)); transformations[0].data = abi.encode(LibERC20Transformer.ETH_TOKEN_ADDRESS, 1e18); - IZeroEx zrx = deployer.IZERO_EX(); emit log_string(" ---Calling TransformERC20()---"); uint256 balanceETHBefore = address(this).balance; - uint256 balanceWETHBefore = deployer.weth().balanceOf(address(this)); - zrx.transformERC20{value: 1e18}( + uint256 balanceWETHBefore = zeroExDeployed.weth.balanceOf(address(this)); + zeroExDeployed.zeroEx.transformERC20{value: 1e18}( // input token IERC20TokenV06(LibERC20Transformer.ETH_TOKEN_ADDRESS), // output token - IERC20TokenV06(address(deployer.weth())), + IERC20TokenV06(address(zeroExDeployed.weth)), // input token amount 1e18, // min output token amount @@ -90,12 +80,12 @@ contract BasicSwapTest is // list of transform transformations ); - assert(deployer.weth().balanceOf(address(this)) == 1e18); + assert(zeroExDeployed.weth.balanceOf(address(this)) == 1e18); emit log_string(" Successful Transformation Complete"); emit log_named_uint(" ETH BALANCE BEFORE:", balanceETHBefore); emit log_named_uint(" ETH BALANCE AFTER:", address(this).balance); emit log_named_uint(" WETH BALANCE BEFORE:", balanceWETHBefore); - emit log_named_uint(" WETH BALANCE AFTER:", deployer.weth().balanceOf(address(this))); + emit log_named_uint(" WETH BALANCE AFTER:", zeroExDeployed.weth.balanceOf(address(this))); } diff --git a/contracts/zero-ex/contracts/test/foundry/utils/DeployZeroEx.sol b/contracts/zero-ex/contracts/test/foundry/utils/DeployZeroEx.sol index 8851656a10..a245c34625 100644 --- a/contracts/zero-ex/contracts/test/foundry/utils/DeployZeroEx.sol +++ b/contracts/zero-ex/contracts/test/foundry/utils/DeployZeroEx.sol @@ -32,8 +32,11 @@ import "src/features/BatchFillNativeOrdersFeature.sol"; import "src/features/FundRecoveryFeature.sol"; import "src/features/TransformERC20Feature.sol"; import "src/features/OtcOrdersFeature.sol"; +import "src/features/MetaTransactionsFeature.sol"; +import "src/features/nft_orders/ERC1155OrdersFeature.sol"; +import "src/features/nft_orders/ERC721OrdersFeature.sol"; import "src/features/UniswapFeature.sol"; -import "src/features/UniswapV3Feature.sol"; +import "src/features/multiplex/MultiplexFeature.sol"; import "src/external/TransformerDeployer.sol"; import "src/external/FeeCollectorController.sol"; import "src/transformers/WethTransformer.sol"; @@ -41,143 +44,178 @@ import "src/transformers/FillQuoteTransformer.sol"; import "src/transformers/PayTakerTransformer.sol"; import "src/transformers/AffiliateFeeTransformer.sol"; import "src/transformers/PositiveSlippageFeeTransformer.sol"; -import "./WETH_6_5.sol"; -//import "../erc20/contracts/src/v06/IEtherTokenV06.sol"; +import "src/transformers/bridges/IBridgeAdapter.sol"; +import "src/transformers/bridges/EthereumBridgeAdapter.sol"; + +import "@0x/contracts-erc20/contracts/src/v06/IEtherTokenV06.sol"; +import "@0x/contracts-erc20/contracts/src/v06/WETH9V06.sol"; contract DeployZeroEx is Test { ZeroEx public ZERO_EX = ZeroEx(0xDef1C0ded9bec7F1a1670819833240f027b25EfF); - IZeroEx public IZERO_EX = IZeroEx(0xDef1C0ded9bec7F1a1670819833240f027b25EfF); + IZeroEx public IZERO_EX = IZeroEx(address(ZERO_EX)); + address VANITY_DEPLOYER_ADDRESS = 0xe750ad66DE350F8110E305fb78Ec6A9f594445E3; + bytes deployerBytecode = hex"608060405234801561001057600080fd5b506040516103da3803806103da83398101604081905261002f91610077565b8060405161003c9061006a565b610046919061011f565b604051809103906000f080158015610062573d6000803e3d6000fd5b505050610198565b6101f5806101e583390190565b600060208284031215610088578081fd5b81516001600160401b038082111561009e578283fd5b818401915084601f8301126100b1578283fd5b8151818111156100c3576100c3610182565b604051601f8201601f19908116603f011681019083821181831017156100eb576100eb610182565b81604052828152876020848701011115610103578586fd5b610114836020830160208801610152565b979650505050505050565b600060208252825180602084015261013e816040850160208701610152565b601f01601f19169190910160400192915050565b60005b8381101561016d578181015183820152602001610155565b8381111561017c576000848401525b50505050565b634e487b7160e01b600052604160045260246000fd5b603f806101a66000396000f3fe6080604052600080fdfea26469706673582212201bd8b1a777b100d67435ca4bb0b2fdccb13a2c2dde019b227bb553ff9a95bd4464736f6c63430008020033608060405234801561001057600080fd5b506040516101f53803806101f583398101604081905261002f916100c9565b60008151602083016000f090506001600160a01b0381166100865760405162461bcd60e51b815260206004820152600d60248201526c1111541313d657d19052531151609a1b604482015260640160405180910390fd5b6040516001600160a01b03821681527ff40fcec21964ffb566044d083b4073f29f7f7929110ea19e1b3ebe375d89055e9060200160405180910390a150506101a8565b600060208083850312156100db578182fd5b82516001600160401b03808211156100f1578384fd5b818501915085601f830112610104578384fd5b81518181111561011657610116610192565b604051601f8201601f19908116603f0116810190838211818310171561013e5761013e610192565b816040528281528886848701011115610155578687fd5b8693505b828410156101765784840186015181850187015292850192610159565b8284111561018657868684830101525b98975050505050505050565b634e487b7160e01b600052604160045260246000fd5b603f806101b66000396000f3fe6080604052600080fdfea2646970667358221220fbca036a163ed7f008cefa7c834d98d25109a456a051d41d9c89d55d7185d12b64736f6c63430008020033"; address[] transformerSigners = [ address(this) ]; + bool isDeployed = false; - - WETH9 public weth; - - TransformerDeployer public transformerDeployer; - FeeCollectorController public feeCollectorController; - WethTransformer public wethTransformer; - TransformERC20Feature public transformERC20; - NativeOrdersFeature public nativeOrders; - BatchFillNativeOrdersFeature public batchFillNativeOrders; - OtcOrdersFeature public otcOrders; - UniswapFeature public uniswap; - FundRecoveryFeature public fundRecovery; - - //get bytecode of a contract - function getCode(address _addr) public view returns (bytes memory o_code) { - assembly { - // retrieve the size of the code - let size := extcodesize(_addr) - // allocate output byte array - // by using o_code = new bytes(size) - o_code := mload(0x40) - // new "memory end" including padding - mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f)))) - // store length in memory - mstore(o_code, size) - // actually retrieve the code, this needs assembly - extcodecopy(_addr, add(o_code, 0x20), 0, size) - } + struct Features { + NativeOrdersFeature nativeOrdersFeature; + BatchFillNativeOrdersFeature batchFillNativeOrdersFeature; + OtcOrdersFeature otcOrdersFeature; + UniswapFeature uniswapFeature; + // UniswapV3Feature + FundRecoveryFeature fundRecoveryFeature; + TransformERC20Feature transformERC20Feature; + MetaTransactionsFeature metaTransactionsFeature; + ERC1155OrdersFeature erc1155OrdersFeature; + ERC721OrdersFeature erc721OrdersFeature; + MultiplexFeature multiplexFeature; + } + + struct Transformers { + FillQuoteTransformer fillQuoteTransformer; + WethTransformer wethTransformer; + AffiliateFeeTransformer affiliateFeeTransformer; + PayTakerTransformer payTakerTransformer; + } + + struct ZeroExDeployed { + IZeroEx zeroEx; + + TransformerDeployer transformerDeployer; + FeeCollectorController feeCollectorController; + IStaking staking; // address(0) + // Features + Features features; + + // Transformers + Transformers transformers; + + IEtherTokenV06 weth; + } + + ZeroExDeployed ZERO_EX_DEPLOYED; + + function getDeployedZeroEx() + public + returns (ZeroExDeployed memory) + { + if (!isDeployed) { + deployZeroEx(); + } + return ZERO_EX_DEPLOYED; + } + + function logDeployedZeroEx() + public + { + emit log_string("--- Deployed ZeroEx ---"); + emit log_named_address("ZeroEx", address(ZERO_EX)); + emit log_named_address("TransformerDeployer", address(ZERO_EX_DEPLOYED.transformerDeployer)); + emit log_named_address("FeeCollectorController", address(ZERO_EX_DEPLOYED.feeCollectorController)); + emit log_named_address("Staking", address(ZERO_EX_DEPLOYED.staking)); + + emit log_string("----- Features -----"); + emit log_named_address("NativeOrdersFeature", address(ZERO_EX_DEPLOYED.features.nativeOrdersFeature)); + emit log_named_address("BatchFillNativeOrdersFeature", address(ZERO_EX_DEPLOYED.features.batchFillNativeOrdersFeature)); + emit log_named_address("OtcOrdersFeature", address(ZERO_EX_DEPLOYED.features.otcOrdersFeature)); + emit log_named_address("UniswapFeature", address(ZERO_EX_DEPLOYED.features.uniswapFeature)); + emit log_named_address("FundRecoveryFeature", address(ZERO_EX_DEPLOYED.features.fundRecoveryFeature)); + emit log_named_address("MetaTransactionsFeature", address(ZERO_EX_DEPLOYED.features.metaTransactionsFeature)); + emit log_named_address("ERC1155OrdersFeature", address(ZERO_EX_DEPLOYED.features.erc1155OrdersFeature)); + emit log_named_address("ERC721OrdersFeature", address(ZERO_EX_DEPLOYED.features.erc721OrdersFeature)); + emit log_named_address("TransformERC20Feature", address(ZERO_EX_DEPLOYED.features.transformERC20Feature)); + emit log_named_address("MultiplexFeature", address(ZERO_EX_DEPLOYED.features.multiplexFeature)); + + emit log_string("----- Transformers -----"); + emit log_named_address("FillQuoteTransformer", address(ZERO_EX_DEPLOYED.transformers.fillQuoteTransformer)); + emit log_named_address("WethTransformer", address(ZERO_EX_DEPLOYED.transformers.wethTransformer)); + emit log_named_address("AffiliateFeeTransformer", address(ZERO_EX_DEPLOYED.transformers.affiliateFeeTransformer)); + emit log_named_address("PayTakerTransformer", address(ZERO_EX_DEPLOYED.transformers.payTakerTransformer)); + + emit log_string("----- Other -----"); + emit log_named_address("WETH", address(ZERO_EX_DEPLOYED.weth)); } - function deployZeroEx() public + returns (ZeroExDeployed memory) { - emit log_string("-----Deploying ZeroEx (Foundry VM)-----"); - emit log_string(" Deploying WETH9...."); - weth = new WETH9(); - emit log_named_address(" Deployed WETH9 @", address(weth)); + if (isDeployed) { + return ZERO_EX_DEPLOYED; + } + + ZERO_EX_DEPLOYED.weth = IEtherTokenV06(address(new WETH9V06())); + InitialMigration initialMigration = new InitialMigration(address(this)); + // Append the required ZeroEx constructor arguments (address bootstrapper) + bytes memory zeroExDeploycode = abi.encodePacked( + type(ZeroEx).creationCode, + abi.encode(initialMigration) + ); + // Append the required deployer code constructor arguments (bytes initCode) + bytes memory deployerDeploycode = abi.encodePacked( + deployerBytecode, + abi.encode(zeroExDeploycode) + ); // HERE BE DRAGONS, feel free to ignore this for now // We want to deploy the ZeroEx contract, at 0xDef1C0ded9bec7F1a1670819833240f027b25EfF // We use a special mechanism to deploy the ZeroEx contract. - - emit log_string(" Deploying ep/InitialMigration..."); - InitialMigration initialMigration = InitialMigration(deployCode( - "foundry-artifacts/InitialMigration.sol/InitialMigration.json", - abi.encode(address(this)) - )); - emit log_named_address(" Deployed InitialMigration @", address(initialMigration)); // Must occur from this address as the first transaction - hoax(0xe750ad66DE350F8110E305fb78Ec6A9f594445E3); - // Special Deployer code - bytes memory deployerBytecode = hex"608060405234801561001057600080fd5b506040516103da3803806103da83398101604081905261002f91610077565b8060405161003c9061006a565b610046919061011f565b604051809103906000f080158015610062573d6000803e3d6000fd5b505050610198565b6101f5806101e583390190565b600060208284031215610088578081fd5b81516001600160401b038082111561009e578283fd5b818401915084601f8301126100b1578283fd5b8151818111156100c3576100c3610182565b604051601f8201601f19908116603f011681019083821181831017156100eb576100eb610182565b81604052828152876020848701011115610103578586fd5b610114836020830160208801610152565b979650505050505050565b600060208252825180602084015261013e816040850160208701610152565b601f01601f19169190910160400192915050565b60005b8381101561016d578181015183820152602001610155565b8381111561017c576000848401525b50505050565b634e487b7160e01b600052604160045260246000fd5b603f806101a66000396000f3fe6080604052600080fdfea26469706673582212201bd8b1a777b100d67435ca4bb0b2fdccb13a2c2dde019b227bb553ff9a95bd4464736f6c63430008020033608060405234801561001057600080fd5b506040516101f53803806101f583398101604081905261002f916100c9565b60008151602083016000f090506001600160a01b0381166100865760405162461bcd60e51b815260206004820152600d60248201526c1111541313d657d19052531151609a1b604482015260640160405180910390fd5b6040516001600160a01b03821681527ff40fcec21964ffb566044d083b4073f29f7f7929110ea19e1b3ebe375d89055e9060200160405180910390a150506101a8565b600060208083850312156100db578182fd5b82516001600160401b03808211156100f1578384fd5b818501915085601f830112610104578384fd5b81518181111561011657610116610192565b604051601f8201601f19908116603f0116810190838211818310171561013e5761013e610192565b816040528281528886848701011115610155578687fd5b8693505b828410156101765784840186015181850187015292850192610159565b8284111561018657868684830101525b98975050505050505050565b634e487b7160e01b600052604160045260246000fd5b603f806101b66000396000f3fe6080604052600080fdfea2646970667358221220fbca036a163ed7f008cefa7c834d98d25109a456a051d41d9c89d55d7185d12b64736f6c63430008020033"; - // Grab the bytecode of the ZeroEx artifact - bytes memory zeroExBytecode = vm.getCode("foundry-artifacts/ZeroEx.sol/ZeroEx.json"); - // Append the required ZeroEx constructor arguments (address bootstrapper) - bytes memory zeroExDeploycode = abi.encodePacked(zeroExBytecode, abi.encode(initialMigration)); - // Append the required deployer code constructor arguments (bytes initCode) - bytes memory deployerDeploycode = abi.encodePacked(deployerBytecode, abi.encode(zeroExDeploycode)); // The address is technically emitted in an event, but we know we did it correctly //│ │ ├─ emit topic 0: 0xf40fcec21964ffb566044d083b4073f29f7f7929110ea19e1b3ebe375d89055e //│ │ │ data: 0x000000000000000000000000def1c0ded9bec7f1a1670819833240f027b25eff - emit log_string(" Deploying ExchangeProxy...."); + hoax(VANITY_DEPLOYER_ADDRESS); assembly { pop(create(0, add(deployerDeploycode, 0x20), mload(deployerDeploycode))) } - emit log_named_address(" Deployed ExchangeProxy @", address(ZERO_EX)); - - emit log_string(" Deploying deployer/TransformerDeployer..."); - transformerDeployer = new TransformerDeployer( + // Staking = address(0); + ZERO_EX_DEPLOYED.staking = IStaking(address(0)); + ZERO_EX_DEPLOYED.transformerDeployer = new TransformerDeployer( transformerSigners ); - emit log_named_address(" Deployed TransformerDeployer @", address(transformerDeployer)); - - emit log_string(" Deploying controller/FeeCollectorController..."); - feeCollectorController = new FeeCollectorController( - IEtherTokenV06(address(weth)), - IStaking(0) + ZERO_EX_DEPLOYED.feeCollectorController = new FeeCollectorController( + IEtherTokenV06(ZERO_EX_DEPLOYED.weth), + IStaking(ZERO_EX_DEPLOYED.staking) ); - emit log_named_address(" Deployed FeeCollectorController @", address(feeCollectorController)); - emit log_string(" Deploying Transformers/WethTransformer..."); - wethTransformer = WethTransformer(transformerDeployer.deploy( - abi.encodePacked( - // Deploy the WethTransformer code - type(WethTransformer).creationCode, - // WethTransformer takes WETH address as a constructor argument - abi.encode(address(weth)) - ) - )); - emit log_named_address(" Deployed WethTransformer @", address(wethTransformer)); - - emit log_string("-----(Deploying Features)-----"); - - transformERC20 = new TransformERC20Feature(); - emit log_named_address(" TransformERC20Feature @", address(transformERC20)); - nativeOrders = new NativeOrdersFeature( + // Features + ZERO_EX_DEPLOYED.features.transformERC20Feature = new TransformERC20Feature(); + ZERO_EX_DEPLOYED.features.nativeOrdersFeature = new NativeOrdersFeature( address(ZERO_EX), // EP address - IEtherTokenV06(address(weth)), // WETH address - IStaking(address(0)), // staking address - feeCollectorController, // feeCollectorController address + ZERO_EX_DEPLOYED.weth, + ZERO_EX_DEPLOYED.staking, + ZERO_EX_DEPLOYED.feeCollectorController, // feeCollectorController address uint32(0) // protocolFeeMultiplier ); - emit log_named_address(" NativeOrdersFeature @", address(nativeOrders)); - batchFillNativeOrders = new BatchFillNativeOrdersFeature( + ZERO_EX_DEPLOYED.features.batchFillNativeOrdersFeature = new BatchFillNativeOrdersFeature( address(ZERO_EX) ); - emit log_named_address(" BatchFillNativeOrdersFeature @", address(batchFillNativeOrders)); - otcOrders = new OtcOrdersFeature( + ZERO_EX_DEPLOYED.features.otcOrdersFeature = new OtcOrdersFeature( address(ZERO_EX), - IEtherTokenV06(address(weth)) + ZERO_EX_DEPLOYED.weth ); - emit log_named_address(" OtcOrdersFeature @", address(otcOrders)); - uniswap = new UniswapFeature( - IEtherTokenV06(address(weth)) + ZERO_EX_DEPLOYED.features.uniswapFeature = new UniswapFeature(ZERO_EX_DEPLOYED.weth); + ZERO_EX_DEPLOYED.features.fundRecoveryFeature = new FundRecoveryFeature(); + ZERO_EX_DEPLOYED.features.metaTransactionsFeature = new MetaTransactionsFeature(address(ZERO_EX)); + ZERO_EX_DEPLOYED.features.erc1155OrdersFeature = new ERC1155OrdersFeature(address(ZERO_EX), ZERO_EX_DEPLOYED.weth); + ZERO_EX_DEPLOYED.features.erc721OrdersFeature = new ERC721OrdersFeature(address(ZERO_EX), ZERO_EX_DEPLOYED.weth); + ZERO_EX_DEPLOYED.features.multiplexFeature = new MultiplexFeature( + address(ZERO_EX), + ZERO_EX_DEPLOYED.weth, + ILiquidityProviderSandbox(address(0)), + address(0), // uniswapFactory + address(0), // sushiswapFactory + bytes32(0), // uniswapPairInitCodeHash + bytes32(0) // sushiswapPairInitCodeHash ); - emit log_named_address(" UniswapFeature @", address(uniswap)); - fundRecovery = new FundRecoveryFeature(); - emit log_named_address(" FundRecoveryFeature @", address(fundRecovery)); - emit log_string("-----(Initial Migration)-----"); - emit log_named_address(" Performing Initial Migration On", address(ZERO_EX)); - emit log_string(" Initializing ZeroEx..."); initialMigration.initializeZeroEx( payable(address(this)), ZERO_EX, @@ -186,48 +224,99 @@ contract DeployZeroEx is Test { ownable: new OwnableFeature() }) ); - emit log_string(" Successfully initialized ZeroEx!"); + IZERO_EX.migrate( + address(ZERO_EX_DEPLOYED.features.batchFillNativeOrdersFeature), + abi.encodeWithSelector(BatchFillNativeOrdersFeature.migrate.selector), + address(this) + ); + IZERO_EX.migrate( + address(ZERO_EX_DEPLOYED.features.transformERC20Feature), + abi.encodeWithSelector(TransformERC20Feature.migrate.selector, address(ZERO_EX_DEPLOYED.transformerDeployer)), + address(this) + ); + IZERO_EX.migrate( + address(ZERO_EX_DEPLOYED.features.nativeOrdersFeature), + abi.encodeWithSelector(NativeOrdersFeature.migrate.selector), + address(this) + ); + IZERO_EX.migrate( + address(ZERO_EX_DEPLOYED.features.otcOrdersFeature), + abi.encodeWithSelector(OtcOrdersFeature.migrate.selector), + address(this) + ); + IZERO_EX.migrate( + address(ZERO_EX_DEPLOYED.features.uniswapFeature), + abi.encodeWithSelector(UniswapFeature.migrate.selector), + address(this) + ); + IZERO_EX.migrate( + address(ZERO_EX_DEPLOYED.features.fundRecoveryFeature), + abi.encodeWithSelector(FundRecoveryFeature.migrate.selector), + address(this) + ); + IZERO_EX.migrate( + address(ZERO_EX_DEPLOYED.features.metaTransactionsFeature), + abi.encodeWithSelector(MetaTransactionsFeature.migrate.selector), + address(this) + ); + IZERO_EX.migrate( + address(ZERO_EX_DEPLOYED.features.erc1155OrdersFeature), + abi.encodeWithSelector(ERC1155OrdersFeature.migrate.selector), + address(this) + ); + IZERO_EX.migrate( + address(ZERO_EX_DEPLOYED.features.erc721OrdersFeature), + abi.encodeWithSelector(ERC721OrdersFeature.migrate.selector), + address(this) + ); + IZERO_EX.migrate( + address(ZERO_EX_DEPLOYED.features.multiplexFeature), + abi.encodeWithSelector(MultiplexFeature.migrate.selector), + address(this) + ); + // Transformers + ZERO_EX_DEPLOYED.transformers.wethTransformer = WethTransformer( + ZERO_EX_DEPLOYED.transformerDeployer.deploy( + abi.encodePacked( + // Deploy the WethTransformer code + type(WethTransformer).creationCode, + // WethTransformer takes WETH address as a constructor argument + abi.encode(address(ZERO_EX_DEPLOYED.weth)) + ) + ) + ); + // Deploy the FQT, NOTE: No bridge adapter in tests + ZERO_EX_DEPLOYED.transformers.fillQuoteTransformer = FillQuoteTransformer( + ZERO_EX_DEPLOYED.transformerDeployer.deploy( + abi.encodePacked( + // Deploy the FQT code + type(FillQuoteTransformer).creationCode, + // FQT takes a BridgeAdapter and ZeroEx + abi.encode( + address(0), // Note: No BridgeAdapter in tests + INativeOrdersFeature(address(ZERO_EX)) + ) + ) + ) + ); - emit log_named_address(" Migrating Features On", address(ZERO_EX)); - IZERO_EX.migrate( - address(batchFillNativeOrders), - abi.encodeWithSelector(batchFillNativeOrders.migrate.selector), - address(this) + ZERO_EX_DEPLOYED.transformers.affiliateFeeTransformer = AffiliateFeeTransformer( + ZERO_EX_DEPLOYED.transformerDeployer.deploy( + type(AffiliateFeeTransformer).creationCode + ) ); - emit log_string(" BatchFillNativeOrdersFeature migration successful"); - IZERO_EX.migrate( - address(transformERC20), - abi.encodeWithSelector(transformERC20.migrate.selector, address(transformerDeployer)), - address(this) - ); - emit log_string(" TransformERC20Feature migration successful"); - IZERO_EX.migrate( - address(nativeOrders), - abi.encodeWithSelector(nativeOrders.migrate.selector), - address(this) - ); - emit log_string(" NativeOrdersFeature migration successful"); - IZERO_EX.migrate( - address(otcOrders), - abi.encodeWithSelector(otcOrders.migrate.selector), - address(this) - ); - emit log_string(" OtcOrdersFeature migration successful"); - IZERO_EX.migrate( - address(uniswap), - abi.encodeWithSelector(uniswap.migrate.selector), - address(this) - ); - emit log_string(" UniswapFeature migration successful"); - IZERO_EX.migrate( - address(fundRecovery), - abi.encodeWithSelector(fundRecovery.migrate.selector), - address(this) - ); - emit log_string(" FundRecoveryFeature migration successful"); - emit log_string(" Deployment and Migration complete!"); + ZERO_EX_DEPLOYED.transformers.payTakerTransformer = PayTakerTransformer( + ZERO_EX_DEPLOYED.transformerDeployer.deploy( + type(PayTakerTransformer).creationCode + ) + ); + + ZERO_EX_DEPLOYED.zeroEx = IZERO_EX; + isDeployed = true; + logDeployedZeroEx(); + return ZERO_EX_DEPLOYED; } }