From 9304d09da6c3a78e25caf67a024b0cfef4a3b922 Mon Sep 17 00:00:00 2001 From: Amir Bandeali Date: Thu, 30 Aug 2018 13:38:57 -0700 Subject: Add mainnet migrations --- .gitignore | 1 + packages/migrations/package.json | 11 +- packages/migrations/src/2.0.0-mainnet/artifacts.ts | 17 +++ packages/migrations/src/2.0.0-mainnet/constants.ts | 13 +++ packages/migrations/src/2.0.0-mainnet/migration.ts | 122 +++++++++++++++++++++ packages/migrations/src/migrate.ts | 18 ++- 6 files changed, 177 insertions(+), 5 deletions(-) create mode 100644 packages/migrations/src/2.0.0-mainnet/artifacts.ts create mode 100644 packages/migrations/src/2.0.0-mainnet/constants.ts create mode 100644 packages/migrations/src/2.0.0-mainnet/migration.ts diff --git a/.gitignore b/.gitignore index 9dcd083d7..d53569cd6 100644 --- a/.gitignore +++ b/.gitignore @@ -101,6 +101,7 @@ packages/order-utils/src/generated_contract_wrappers/ packages/migrations/src/1.0.0/contract_wrappers packages/migrations/src/2.0.0/contract_wrappers packages/migrations/src/2.0.0-beta-testnet/contract_wrappers +packages/migrations/src/2.0.0-mainnet/contract_wrappers # solc-bin in sol-compiler packages/sol-compiler/solc_bin/ diff --git a/packages/migrations/package.json b/packages/migrations/package.json index bd8451328..12497b0b2 100644 --- a/packages/migrations/package.json +++ b/packages/migrations/package.json @@ -11,25 +11,30 @@ "build": "yarn pre_build && tsc -b", "pre_build": "run-s compile:v2 copy_artifacts generate_contract_wrappers", "copy_artifacts": "copyfiles 'artifacts/**/*' ./lib", - "clean": "shx rm -rf lib src/1.0.0/contract_wrappers src/2.0.0/contract_wrappers src/2.0.0-beta-testnet/contract_wrappers artifacts/2.0.0", + "clean": "shx rm -rf lib src/1.0.0/contract_wrappers src/2.0.0/contract_wrappers src/2.0.0-beta-testnet/contract_wrappers src/2.0.0-mainnet/contract_wrappers artifacts/2.0.0", "lint": "tslint --project . --exclude **/src/v2/contract_wrappers/**/* --exclude **/src/v1/contract_wrappers/**/*", "migrate:v1": "run-s build compile:v1 script:migrate:v1", "migrate:v2-beta-testnet": "run-s build compile:v2-beta-testnet script:migrate:v2-beta-testnet", + "migrate:v2-mainnet": "run-s compile:v2-mainnet copy_artifacts generate_contract_wrappers:v2-mainnet && tsc && yarn script:migrate:v2-mainnet", "script:migrate:v1": "node ./lib/migrate.js --contracts-version 1.0.0", "script:migrate:v2-beta-testnet": "node ./lib/migrate.js --contracts-version 2.0.0-beta-testnet", + "script:migrate:v2-mainnet": "node ./lib/migrate.js --contracts-version 2.0.0-mainnet", "generate_contract_wrappers": "run-p generate_contract_wrappers:*", "generate_contract_wrappers:v1": "abi-gen --abis ${npm_package_config_abis_v1} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/1.0.0/contract_wrappers --backend ethers", "generate_contract_wrappers:v2": "abi-gen --abis ${npm_package_config_abis_v2} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/2.0.0/contract_wrappers --backend ethers", "generate_contract_wrappers:v2-beta-testnet": "abi-gen --abis ${npm_package_config_abis_v2BetaTestnet} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/2.0.0-beta-testnet/contract_wrappers --backend ethers", + "generate_contract_wrappers:v2-mainnet": "abi-gen --abis ${npm_package_config_abis_v2Mainnet} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/2.0.0-mainnet/contract_wrappers --backend ethers", "compile:v1": "sol-compiler --artifacts-dir artifacts/1.0.0 --contracts Exchange_v1,DummyERC20Token,ZRXToken,WETH9,TokenTransferProxy_v1,MultiSigWallet,MultiSigWalletWithTimeLock,MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,TokenRegistry", "compile:v2": "sol-compiler --artifacts-dir artifacts/2.0.0 --contracts AssetProxyOwner,ERC20Token,DummyERC20Token,ERC721Token,DummyERC721Token,ERC20Proxy,ERC721Proxy,Exchange,Forwarder,MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,ZRXToken,WETH9,IWallet,IValidator,OrderValidator", - "compile:v2-beta-testnet": "sol-compiler --artifacts-dir artifacts/2.0.0-beta-testnet --contracts AssetProxyOwner,DummyERC20Token,ERC20Proxy,ERC721Proxy,Exchange,Forwarder,IWallet,IValidator,ERC20Token,ERC721Token,OrderValidator" + "compile:v2-beta-testnet": "sol-compiler --artifacts-dir artifacts/2.0.0-beta-testnet --contracts AssetProxyOwner,DummyERC20Token,ERC20Proxy,ERC721Proxy,Exchange,Forwarder,IWallet,IValidator,ERC20Token,ERC721Token,OrderValidator", + "compile:v2-mainnet": "sol-compiler --artifacts-dir artifacts/2.0.0-mainnet --contracts AssetProxyOwner,ERC20Proxy,ERC721Proxy,Exchange,Forwarder,OrderValidator" }, "config": { "abis": { "v1": "artifacts/1.0.0/@(DummyERC20Token|TokenTransferProxy_v1|Exchange_v1|TokenRegistry|MultiSigWallet|MultiSigWalletWithTimeLock|MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress|TokenRegistry|ZRXToken|WETH9).json", "v2": "artifacts/2.0.0/@(ERC20Token|DummyERC20Token|ERC721Token|DummyERC721Token|ERC20Proxy|ERC721Proxy|Exchange|Forwarder|AssetProxyOwner|ZRXToken|WETH9|IWallet|IValidator|OrderValidator).json", - "v2BetaTestnet": "artifacts/2.0.0-beta-testnet/@(ERC20Token|ERC721Token|ERC20Proxy|ERC721Proxy|Exchange|Forwarder|AssetProxyOwner|IWallet|IValidator|OrderValidator).json" + "v2BetaTestnet": "artifacts/2.0.0-beta-testnet/@(ERC20Token|ERC721Token|ERC20Proxy|ERC721Proxy|Exchange|Forwarder|AssetProxyOwner|IWallet|IValidator|OrderValidator).json", + "v2Mainnet": "artifacts/2.0.0-mainnet/@(AssetProxyOwner|ERC20Proxy|ERC721Proxy|Exchange|Forwarder|OrderValidator).json" } }, "license": "Apache-2.0", diff --git a/packages/migrations/src/2.0.0-mainnet/artifacts.ts b/packages/migrations/src/2.0.0-mainnet/artifacts.ts new file mode 100644 index 000000000..8091fa9d0 --- /dev/null +++ b/packages/migrations/src/2.0.0-mainnet/artifacts.ts @@ -0,0 +1,17 @@ +import { ContractArtifact } from 'ethereum-types'; + +import * as AssetProxyOwner from '../../artifacts/2.0.0-mainnet/AssetProxyOwner.json'; +import * as ERC20Proxy from '../../artifacts/2.0.0-mainnet/ERC20Proxy.json'; +import * as ERC721Proxy from '../../artifacts/2.0.0-mainnet/ERC721Proxy.json'; +import * as Exchange from '../../artifacts/2.0.0-mainnet/Exchange.json'; +import * as Forwarder from '../../artifacts/2.0.0-mainnet/Forwarder.json'; +import * as OrderValidator from '../../artifacts/2.0.0-mainnet/OrderValidator.json'; + +export const artifacts = { + AssetProxyOwner: (AssetProxyOwner as any) as ContractArtifact, + ERC20Proxy: (ERC20Proxy as any) as ContractArtifact, + ERC721Proxy: (ERC721Proxy as any) as ContractArtifact, + Exchange: (Exchange as any) as ContractArtifact, + Forwarder: (Forwarder as any) as ContractArtifact, + OrderValidator: (OrderValidator as any) as ContractArtifact, +}; diff --git a/packages/migrations/src/2.0.0-mainnet/constants.ts b/packages/migrations/src/2.0.0-mainnet/constants.ts new file mode 100644 index 000000000..99649f687 --- /dev/null +++ b/packages/migrations/src/2.0.0-mainnet/constants.ts @@ -0,0 +1,13 @@ +import { BigNumber } from '@0xproject/utils'; + +export const constants = { + ASSET_PROXY_OWNER_OWNERS: [ + '0x257619b7155d247e43c8b6d90c8c17278ae481f0', + '0x5ee2a00f8f01d099451844af7f894f26a57fcbf2', + '0x894d623e0e0e8ed12c4a73dada999e275684a37d', + ], + ASSET_PROXY_OWNER_REQUIRED_CONFIRMATIONS: new BigNumber(2), + ASSET_PROXY_OWNER_SECONDS_TIMELOCKED: new BigNumber(1209600), + WETH_ADDRESS: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + ZRX_ADDRESS: '0xe41d2489571d322189246dafa5ebde1f4699f498', +}; diff --git a/packages/migrations/src/2.0.0-mainnet/migration.ts b/packages/migrations/src/2.0.0-mainnet/migration.ts new file mode 100644 index 000000000..4100a750c --- /dev/null +++ b/packages/migrations/src/2.0.0-mainnet/migration.ts @@ -0,0 +1,122 @@ +import { assetDataUtils } from '@0xproject/order-utils'; +import { logUtils } from '@0xproject/utils'; +import { Web3Wrapper } from '@0xproject/web3-wrapper'; +import { Provider, TxData } from 'ethereum-types'; + +import { ArtifactWriter } from '../utils/artifact_writer'; + +import { artifacts } from './artifacts'; +import { constants } from './constants'; +import { AssetProxyOwnerContract } from './contract_wrappers/asset_proxy_owner'; +import { ERC20ProxyContract } from './contract_wrappers/erc20_proxy'; +import { ERC721ProxyContract } from './contract_wrappers/erc721_proxy'; +import { ExchangeContract } from './contract_wrappers/exchange'; +import { ForwarderContract } from './contract_wrappers/forwarder'; +import { OrderValidatorContract } from './contract_wrappers/order_validator'; + +/** + * Custom migrations should be defined in this function. This will be called with the CLI 'migrate:v2-mainnet' command. + * Migrations could be written to run in parallel, but if you want contract addresses to be created deterministically, + * the migration should be written to run synchronously. + * @param provider Web3 provider instance. + * @param artifactsDir The directory with compiler artifact files. + * @param txDefaults Default transaction values to use when deploying contracts. + */ +export const runV2MainnetMigrationsAsync = async ( + provider: Provider, + artifactsDir: string, + txDefaults: Partial, +) => { + const web3Wrapper = new Web3Wrapper(provider); + const networkId = await web3Wrapper.getNetworkIdAsync(); + const artifactsWriter = new ArtifactWriter(artifactsDir, networkId); + + // Deploy AssetProxies + const erc20proxy = await ERC20ProxyContract.deployFrom0xArtifactAsync(artifacts.ERC20Proxy, provider, txDefaults); + artifactsWriter.saveArtifact(erc20proxy); + const erc721proxy = await ERC721ProxyContract.deployFrom0xArtifactAsync( + artifacts.ERC721Proxy, + provider, + txDefaults, + ); + artifactsWriter.saveArtifact(erc721proxy); + + // Deploy Exchange + const exchange = await ExchangeContract.deployFrom0xArtifactAsync(artifacts.Exchange, provider, txDefaults); + artifactsWriter.saveArtifact(exchange); + + let txHash; + // Register AssetProxies in Exchange + txHash = await exchange.registerAssetProxy.sendTransactionAsync(erc20proxy.address); + logUtils.log(`transactionHash: ${txHash}`); + logUtils.log('Registering ERC20Proxy'); + await web3Wrapper.awaitTransactionSuccessAsync(txHash); + + txHash = await exchange.registerAssetProxy.sendTransactionAsync(erc721proxy.address); + logUtils.log(`transactionHash: ${txHash}`); + logUtils.log('Registering ERC721Proxy'); + await web3Wrapper.awaitTransactionSuccessAsync(txHash); + + // Deploy AssetProxyOwner + const assetProxies = [erc20proxy.address, erc721proxy.address]; + const assetProxyOwner = await AssetProxyOwnerContract.deployFrom0xArtifactAsync( + artifacts.AssetProxyOwner, + provider, + txDefaults, + constants.ASSET_PROXY_OWNER_OWNERS, + assetProxies, + constants.ASSET_PROXY_OWNER_REQUIRED_CONFIRMATIONS, + constants.ASSET_PROXY_OWNER_SECONDS_TIMELOCKED, + ); + artifactsWriter.saveArtifact(assetProxyOwner); + + // Deploy Forwarder + const zrxAssetData = assetDataUtils.encodeERC20AssetData(constants.ZRX_ADDRESS); + const wethAssetData = assetDataUtils.encodeERC20AssetData(constants.WETH_ADDRESS); + const forwarder = await ForwarderContract.deployFrom0xArtifactAsync( + artifacts.Forwarder, + provider, + txDefaults, + exchange.address, + zrxAssetData, + wethAssetData, + ); + artifactsWriter.saveArtifact(forwarder); + + // Deploy OrderValidator + const orderValidator = await OrderValidatorContract.deployFrom0xArtifactAsync( + artifacts.OrderValidator, + provider, + txDefaults, + exchange.address, + zrxAssetData, + ); + artifactsWriter.saveArtifact(orderValidator); + + // Authorize Exchange contracts to call AssetProxies + txHash = await erc20proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address); + logUtils.log(`transactionHash: ${txHash}`); + logUtils.log('Authorizing Exchange on ERC20Proxy'); + await web3Wrapper.awaitTransactionSuccessAsync(txHash); + + txHash = await erc721proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address); + logUtils.log(`transactionHash: ${txHash}`); + logUtils.log('Authorizing Exchange on ERC721Proxy'); + await web3Wrapper.awaitTransactionSuccessAsync(txHash); + + // Transfer ownership of AssetProxies and Exchange to AssetProxyOwner + txHash = await erc20proxy.transferOwnership.sendTransactionAsync(assetProxyOwner.address); + logUtils.log(`transactionHash: ${txHash}`); + logUtils.log('Transferring ownership of ERC20Proxy'); + await web3Wrapper.awaitTransactionSuccessAsync(txHash); + + txHash = await erc721proxy.transferOwnership.sendTransactionAsync(assetProxyOwner.address); + logUtils.log(`transactionHash: ${txHash}`); + logUtils.log('Transferring ownership of ERC721Proxy'); + await web3Wrapper.awaitTransactionSuccessAsync(txHash); + + txHash = await exchange.transferOwnership.sendTransactionAsync(assetProxyOwner.address); + logUtils.log(`transactionHash: ${txHash}`); + logUtils.log('Transferring ownership of Exchange'); + await web3Wrapper.awaitTransactionSuccessAsync(txHash); +}; diff --git a/packages/migrations/src/migrate.ts b/packages/migrations/src/migrate.ts index c46d3580a..6c8b38762 100644 --- a/packages/migrations/src/migrate.ts +++ b/packages/migrations/src/migrate.ts @@ -7,6 +7,7 @@ import * as yargs from 'yargs'; import { runV1MigrationsAsync } from './1.0.0/migration'; import { runV2TestnetMigrationsAsync } from './2.0.0-beta-testnet/migration'; +import { runV2MainnetMigrationsAsync } from './2.0.0-mainnet/migration'; import { runV2MigrationsAsync } from './2.0.0/migration'; import { providerFactory } from './utils/provider_factory'; @@ -15,6 +16,7 @@ enum ContractVersions { V1 = '1.0.0', V2 = '2.0.0', V2Testnet = '2.0.0-beta-testnet', + V2Mainnet = '2.0.0-mainnet', } const args = yargs.argv; @@ -24,6 +26,8 @@ const args = yargs.argv; let providerConfigs; let provider: Provider; let txDefaults; + let web3Wrapper: Web3Wrapper; + let accounts: string[]; switch (contractsVersion) { case ContractVersions.V1: providerConfigs = { shouldUseInProcessGanache: false }; @@ -43,14 +47,24 @@ const args = yargs.argv; break; case ContractVersions.V2Testnet: provider = await providerFactory.getLedgerProviderAsync(); - const web3Wrapper = new Web3Wrapper(provider); - const accounts = await web3Wrapper.getAvailableAddressesAsync(); + web3Wrapper = new Web3Wrapper(provider); + accounts = await web3Wrapper.getAvailableAddressesAsync(); txDefaults = { from: accounts[0], gas: devConstants.GAS_LIMIT, }; await runV2TestnetMigrationsAsync(provider, artifactsDir, txDefaults); break; + case ContractVersions.V2Mainnet: + provider = await providerFactory.getLedgerProviderAsync(); + web3Wrapper = new Web3Wrapper(provider); + accounts = await web3Wrapper.getAvailableAddressesAsync(); + txDefaults = { + from: accounts[0], + gas: devConstants.GAS_LIMIT, + }; + await runV2MainnetMigrationsAsync(provider, artifactsDir, txDefaults); + break; default: throw new Error(`Unsupported contract version: ${contractsVersion}`); } -- cgit v1.2.3