diff options
author | Leonid Logvinov <logvinov.leon@gmail.com> | 2018-05-11 18:12:39 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-11 18:12:39 +0800 |
commit | f42f608f3f97a5244f09f17ae5ee184c0f775de3 (patch) | |
tree | 08fd03d69f8a7dfcc7beadcd56c5d1624928c430 /packages/migrations/src | |
parent | 44f17c1706e7b3208fdc0702c54a8cd943132fd3 (diff) | |
parent | c093aab350dfbd86972d6388c3923ec60fc4501a (diff) | |
download | dexon-sol-tools-f42f608f3f97a5244f09f17ae5ee184c0f775de3.tar dexon-sol-tools-f42f608f3f97a5244f09f17ae5ee184c0f775de3.tar.gz dexon-sol-tools-f42f608f3f97a5244f09f17ae5ee184c0f775de3.tar.bz2 dexon-sol-tools-f42f608f3f97a5244f09f17ae5ee184c0f775de3.tar.lz dexon-sol-tools-f42f608f3f97a5244f09f17ae5ee184c0f775de3.tar.xz dexon-sol-tools-f42f608f3f97a5244f09f17ae5ee184c0f775de3.tar.zst dexon-sol-tools-f42f608f3f97a5244f09f17ae5ee184c0f775de3.zip |
Merge pull request #574 from 0xProject/feature/rm-rf-deployer
Remove @0xproject/deployer.Deployer. Make contracts able to deploy themselves
Diffstat (limited to 'packages/migrations/src')
-rw-r--r-- | packages/migrations/src/artifact_writer.ts | 26 | ||||
-rw-r--r-- | packages/migrations/src/artifacts.ts | 31 | ||||
-rw-r--r-- | packages/migrations/src/migrate.ts | 23 | ||||
-rw-r--r-- | packages/migrations/src/migration.ts | 77 | ||||
-rw-r--r-- | packages/migrations/src/types.ts | 4 | ||||
-rw-r--r-- | packages/migrations/src/utils/token_info.ts | 12 |
6 files changed, 136 insertions, 37 deletions
diff --git a/packages/migrations/src/artifact_writer.ts b/packages/migrations/src/artifact_writer.ts new file mode 100644 index 000000000..2da5a09dd --- /dev/null +++ b/packages/migrations/src/artifact_writer.ts @@ -0,0 +1,26 @@ +import { BaseContract } from '@0xproject/base-contract'; +import { ContractArtifact } from '@0xproject/sol-compiler'; +import * as fs from 'fs'; +import * as path from 'path'; + +export class ArtifactWriter { + private _artifactsDir: string; + private _networkId: number; + constructor(artifactsDir: string, networkId: number) { + this._artifactsDir = artifactsDir; + this._networkId = networkId; + } + // This updates the artifact file but does not update the `artifacts` module above. It will not + // contain the saved artifact changes. + public saveArtifact(contract: BaseContract): void { + const contractName = contract.contractName; + const artifactFile = path.join(this._artifactsDir, `${contractName}.json`); + const artifact: ContractArtifact = JSON.parse(fs.readFileSync(artifactFile).toString()); + artifact.networks[this._networkId] = { + address: contract.address, + links: {}, + constructorArgs: JSON.stringify(contract.constructorArgs), + }; + fs.writeFileSync(artifactFile, JSON.stringify(artifact, null, '\t')); + } +} diff --git a/packages/migrations/src/artifacts.ts b/packages/migrations/src/artifacts.ts new file mode 100644 index 000000000..42eb1c33e --- /dev/null +++ b/packages/migrations/src/artifacts.ts @@ -0,0 +1,31 @@ +import { ContractArtifact } from '@0xproject/sol-compiler'; + +import * as AccountLevels from '../artifacts/1.0.0/AccountLevels.json'; +import * as Arbitrage from '../artifacts/1.0.0/Arbitrage.json'; +import * as DummyToken from '../artifacts/1.0.0/DummyToken.json'; +import * as EtherDelta from '../artifacts/1.0.0/EtherDelta.json'; +import * as Exchange from '../artifacts/1.0.0/Exchange.json'; +import * as MaliciousToken from '../artifacts/1.0.0/MaliciousToken.json'; +import * as MultiSigWalletWithTimeLock from '../artifacts/1.0.0/MultiSigWalletWithTimeLock.json'; +import * as MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress from '../artifacts/1.0.0/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.json'; +import * as Token from '../artifacts/1.0.0/Token.json'; +import * as TokenRegistry from '../artifacts/1.0.0/TokenRegistry.json'; +import * as TokenTransferProxy from '../artifacts/1.0.0/TokenTransferProxy.json'; +import * as EtherToken from '../artifacts/1.0.0/WETH9.json'; +import * as ZRX from '../artifacts/1.0.0/ZRXToken.json'; + +export const artifacts = { + AccountLevels: (AccountLevels as any) as ContractArtifact, + Arbitrage: (Arbitrage as any) as ContractArtifact, + EtherDelta: (EtherDelta as any) as ContractArtifact, + ZRX: (ZRX as any) as ContractArtifact, + DummyToken: (DummyToken as any) as ContractArtifact, + Token: (Token as any) as ContractArtifact, + Exchange: (Exchange as any) as ContractArtifact, + EtherToken: (EtherToken as any) as ContractArtifact, + TokenRegistry: (TokenRegistry as any) as ContractArtifact, + MaliciousToken: (MaliciousToken as any) as ContractArtifact, + TokenTransferProxy: (TokenTransferProxy as any) as ContractArtifact, + MultiSigWalletWithTimeLock: (MultiSigWalletWithTimeLock as any) as ContractArtifact, + MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress: (MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress as any) as ContractArtifact, +}; diff --git a/packages/migrations/src/migrate.ts b/packages/migrations/src/migrate.ts index 76dcbd847..b00ba698f 100644 --- a/packages/migrations/src/migrate.ts +++ b/packages/migrations/src/migrate.ts @@ -1,24 +1,21 @@ #!/usr/bin/env node -import { Deployer } from '@0xproject/deployer'; -import { devConstants } from '@0xproject/dev-utils'; +import { devConstants, web3Factory } from '@0xproject/dev-utils'; +import { Provider } from '@0xproject/types'; import { logUtils } from '@0xproject/utils'; import * as path from 'path'; import { runMigrationsAsync } from './migration'; (async () => { - const deployerOpts = { - jsonrpcUrl: 'http://localhost:8545', - artifactsDir: path.resolve('src', 'artifacts'), - networkId: 50, - defaults: { - gas: devConstants.GAS_ESTIMATE, - }, + const txDefaults = { + from: devConstants.TESTRPC_FIRST_ADDRESS, }; - - const deployer = new Deployer(deployerOpts); - - await runMigrationsAsync(deployer); + const providerConfigs = { shouldUseInProcessGanache: false }; + const web3 = web3Factory.create(providerConfigs); + const provider = web3.currentProvider; + const artifactsDir = 'artifacts/1.0.0'; + await runMigrationsAsync(provider, artifactsDir, txDefaults); + process.exit(0); })().catch(err => { logUtils.log(err); process.exit(1); diff --git a/packages/migrations/src/migration.ts b/packages/migrations/src/migration.ts index 6313efcff..96973fb62 100644 --- a/packages/migrations/src/migration.ts +++ b/packages/migrations/src/migration.ts @@ -1,8 +1,17 @@ -import { Deployer } from '@0xproject/deployer'; +import { Provider, TxData } from '@0xproject/types'; import { BigNumber, NULL_BYTES } from '@0xproject/utils'; import { Web3Wrapper } from '@0xproject/web3-wrapper'; import * as _ from 'lodash'; +import { ArtifactWriter } from './artifact_writer'; +import { artifacts } from './artifacts'; +import { DummyTokenContract } from './contract_wrappers/dummy_token'; +import { ExchangeContract } from './contract_wrappers/exchange'; +import { MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddressContract } from './contract_wrappers/multi_sig_wallet_with_time_lock_except_remove_authorized_address'; +import { TokenRegistryContract } from './contract_wrappers/token_registry'; +import { TokenTransferProxyContract } from './contract_wrappers/token_transfer_proxy'; +import { WETH9Contract } from './contract_wrappers/weth9'; +import { ZRXTokenContract } from './contract_wrappers/zrx_token'; import { ContractName } from './types'; import { tokenInfo } from './utils/token_info'; @@ -10,27 +19,54 @@ import { tokenInfo } from './utils/token_info'; * Custom migrations should be defined in this function. This will be called with the CLI 'migrate' 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 deployer Deployer instance. + * @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 runMigrationsAsync = async (deployer: Deployer) => { - const web3Wrapper: Web3Wrapper = deployer.web3Wrapper; - const accounts: string[] = await web3Wrapper.getAvailableAddressesAsync(); +export const runMigrationsAsync = async (provider: Provider, artifactsDir: string, txDefaults: Partial<TxData>) => { + const web3Wrapper = new Web3Wrapper(provider); + const networkId = await web3Wrapper.getNetworkIdAsync(); + const artifactsWriter = new ArtifactWriter(artifactsDir, networkId); + const tokenTransferProxy = await TokenTransferProxyContract.deployFrom0xArtifactAsync( + artifacts.TokenTransferProxy, + provider, + txDefaults, + ); + artifactsWriter.saveArtifact(tokenTransferProxy); + const zrxToken = await ZRXTokenContract.deployFrom0xArtifactAsync(artifacts.ZRX, provider, txDefaults); + artifactsWriter.saveArtifact(zrxToken); - const tokenTransferProxy = await deployer.deployAndSaveAsync(ContractName.TokenTransferProxy); - const zrxToken = await deployer.deployAndSaveAsync(ContractName.ZRXToken); - const etherToken = await deployer.deployAndSaveAsync(ContractName.WETH9); - const tokenReg = await deployer.deployAndSaveAsync(ContractName.TokenRegistry); + const etherToken = await WETH9Contract.deployFrom0xArtifactAsync(artifacts.EtherToken, provider, txDefaults); + artifactsWriter.saveArtifact(etherToken); + const tokenReg = await TokenRegistryContract.deployFrom0xArtifactAsync( + artifacts.TokenRegistry, + provider, + txDefaults, + ); + artifactsWriter.saveArtifact(tokenReg); - const exchangeArgs = [zrxToken.address, tokenTransferProxy.address]; + const accounts: string[] = await web3Wrapper.getAvailableAddressesAsync(); const owners = [accounts[0], accounts[1]]; const confirmationsRequired = new BigNumber(2); const secondsRequired = new BigNumber(0); - const multiSigArgs = [owners, confirmationsRequired, secondsRequired, tokenTransferProxy.address]; - const exchange = await deployer.deployAndSaveAsync(ContractName.Exchange, exchangeArgs); - const multiSig = await deployer.deployAndSaveAsync( - ContractName.MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress, - multiSigArgs, + const exchange = await ExchangeContract.deployFrom0xArtifactAsync( + artifacts.Exchange, + provider, + txDefaults, + zrxToken.address, + tokenTransferProxy.address, ); + artifactsWriter.saveArtifact(exchange); + const multiSig = await MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddressContract.deployFrom0xArtifactAsync( + artifacts.MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress, + provider, + txDefaults, + owners, + confirmationsRequired, + secondsRequired, + tokenTransferProxy.address, + ); + artifactsWriter.saveArtifact(multiSig); const owner = accounts[0]; await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, { from: owner }); @@ -70,8 +106,15 @@ export const runMigrationsAsync = async (deployer: Deployer) => { ); for (const token of tokenInfo) { const totalSupply = new BigNumber(100000000000000000000); - const args = [token.name, token.symbol, token.decimals, totalSupply]; - const dummyToken = await deployer.deployAsync(ContractName.DummyToken, args); + const dummyToken = await DummyTokenContract.deployFrom0xArtifactAsync( + artifacts.DummyToken, + provider, + txDefaults, + token.name, + token.symbol, + token.decimals, + totalSupply, + ); await tokenReg.addToken.sendTransactionAsync( dummyToken.address, token.name, diff --git a/packages/migrations/src/types.ts b/packages/migrations/src/types.ts index 1887bfd96..21daf47f0 100644 --- a/packages/migrations/src/types.ts +++ b/packages/migrations/src/types.ts @@ -1,3 +1,5 @@ +import { BigNumber } from '@0xproject/utils'; + export interface MultiSigConfig { owners: string[]; confirmationsRequired: number; @@ -12,7 +14,7 @@ export interface Token { address?: string; name: string; symbol: string; - decimals: number; + decimals: BigNumber; ipfsHash: string; swarmHash: string; } diff --git a/packages/migrations/src/utils/token_info.ts b/packages/migrations/src/utils/token_info.ts index 968665c7d..e72a80220 100644 --- a/packages/migrations/src/utils/token_info.ts +++ b/packages/migrations/src/utils/token_info.ts @@ -1,4 +1,4 @@ -import { NULL_BYTES } from '@0xproject/utils'; +import { BigNumber, NULL_BYTES } from '@0xproject/utils'; import { Token } from '../types'; @@ -6,35 +6,35 @@ export const tokenInfo: Token[] = [ { name: 'Augur Reputation Token', symbol: 'REP', - decimals: 18, + decimals: new BigNumber(18), ipfsHash: NULL_BYTES, swarmHash: NULL_BYTES, }, { name: 'Digix DAO Token', symbol: 'DGD', - decimals: 18, + decimals: new BigNumber(18), ipfsHash: NULL_BYTES, swarmHash: NULL_BYTES, }, { name: 'Golem Network Token', symbol: 'GNT', - decimals: 18, + decimals: new BigNumber(18), ipfsHash: NULL_BYTES, swarmHash: NULL_BYTES, }, { name: 'MakerDAO', symbol: 'MKR', - decimals: 18, + decimals: new BigNumber(18), ipfsHash: NULL_BYTES, swarmHash: NULL_BYTES, }, { name: 'Melon Token', symbol: 'MLN', - decimals: 18, + decimals: new BigNumber(18), ipfsHash: NULL_BYTES, swarmHash: NULL_BYTES, }, |