diff options
| author | Amir Bandeali <abandeali1@gmail.com> | 2018-08-31 04:38:57 +0800 | 
|---|---|---|
| committer | Amir Bandeali <abandeali1@gmail.com> | 2018-09-05 02:07:56 +0800 | 
| commit | 9304d09da6c3a78e25caf67a024b0cfef4a3b922 (patch) | |
| tree | ed42d4cac26b8e86de1c3909c107c750706b7e42 /packages/migrations | |
| parent | 6a619a4084188d1c48d8030d0fe2a1ba777c55e3 (diff) | |
| download | dexon-sol-tools-9304d09da6c3a78e25caf67a024b0cfef4a3b922.tar.gz dexon-sol-tools-9304d09da6c3a78e25caf67a024b0cfef4a3b922.tar.zst dexon-sol-tools-9304d09da6c3a78e25caf67a024b0cfef4a3b922.zip | |
Add mainnet migrations
Diffstat (limited to 'packages/migrations')
| -rw-r--r-- | packages/migrations/package.json | 11 | ||||
| -rw-r--r-- | packages/migrations/src/2.0.0-mainnet/artifacts.ts | 17 | ||||
| -rw-r--r-- | packages/migrations/src/2.0.0-mainnet/constants.ts | 13 | ||||
| -rw-r--r-- | packages/migrations/src/2.0.0-mainnet/migration.ts | 122 | ||||
| -rw-r--r-- | packages/migrations/src/migrate.ts | 18 | 
5 files changed, 176 insertions, 5 deletions
| 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<TxData>, +) => { +    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}`);      } | 
