Remove deployer from 0x.js and migrations

This commit is contained in:
Leonid Logvinov
2018-05-08 14:52:00 +02:00
parent 422e5a19d4
commit f9d80adaee
11 changed files with 162 additions and 59 deletions

1
.gitignore vendored
View File

@@ -83,6 +83,7 @@ packages/migrations/artifacts/1.0.0
packages/0x.js/src/contract_wrappers/generated/
packages/contracts/src/contract_wrappers/generated/
packages/metacoin/src/contract_wrappers
packages/migrations/src/contract_wrappers
# solc-bin in deployer
packages/deployer/solc_bin/

View File

@@ -1,7 +1,16 @@
import { devConstants } from '@0xproject/dev-utils';
import { runMigrationsAsync } from '@0xproject/migrations';
import * as path from 'path';
import { deployer } from './utils/deployer';
import { constants } from './utils/constants';
import { provider } from './utils/web3_wrapper';
before('migrate contracts', async () => {
await runMigrationsAsync(deployer);
before('migrate contracts', async function() {
this.timeout(20000);
const defaults = {
gas: devConstants.GAS_ESTIMATE,
from: devConstants.TESTRPC_FIRST_ADDRESS,
};
const artifactsDir = path.resolve('test', 'artifacts');
await runMigrationsAsync(provider, artifactsDir, defaults);
});

View File

@@ -1,18 +0,0 @@
import { Deployer } from '@0xproject/deployer';
import { devConstants } from '@0xproject/dev-utils';
import * as path from 'path';
import { constants } from './constants';
import { provider } from './web3_wrapper';
const artifactsDir = path.resolve('test', 'artifacts');
const deployerOpts = {
artifactsDir,
provider,
networkId: constants.TESTRPC_NETWORK_ID,
defaults: {
gas: devConstants.GAS_ESTIMATE,
},
};
export const deployer = new Deployer(deployerOpts);

View File

@@ -25,6 +25,8 @@ export class BaseContract {
protected _web3Wrapper: Web3Wrapper;
public abi: ContractAbi;
public address: string;
public contractName: string;
public constructorArgs: any[] = [];
protected static _formatABIDataItemList(
abis: DataItem[],
values: any[],
@@ -114,7 +116,14 @@ export class BaseContract {
}) as MethodAbi;
return methodAbi;
}
constructor(abi: ContractAbi, address: string, provider: Provider, defaults?: Partial<TxData>) {
constructor(
contractName: string,
abi: ContractAbi,
address: string,
provider: Provider,
defaults?: Partial<TxData>,
) {
this.contractName = contractName;
this._web3Wrapper = new Web3Wrapper(provider, defaults);
this.abi = abi;
this.address = address;

View File

@@ -71,12 +71,15 @@ export class {{contractName}}Contract extends BaseContract {
web3Wrapper.estimateGasAsync.bind(web3Wrapper),
);
const txHash = await web3Wrapper.sendTransactionAsync(txDataWithDefaults);
console.log(`transactionHash: ${txHash}`);
const txReceipt = await web3Wrapper.awaitTransactionMinedAsync(txHash);
console.log(`{{contractName}} successfully deployed at ${txReceipt.contractAddress}`);
const contractInstance = new {{contractName}}Contract(abi, txReceipt.contractAddress as string, provider, defaults);
contractInstance.constructorArgs = [{{> params inputs=ctor.inputs}}];
return contractInstance;
}
constructor(abi: ContractAbi, address: string, provider: Provider, defaults?: Partial<TxData>) {
super(abi, address, provider, defaults);
super("{{contractName}}", abi, address, provider, defaults);
classUtils.bindAll(this, ['_ethersInterfacesByFunctionSignature', 'address', 'abi', '_web3Wrapper']);
}
} // tslint:disable:max-file-line-count

View File

@@ -6,17 +6,24 @@
"types": "lib/index.d.ts",
"scripts": {
"build:watch": "tsc -w",
"prebuild": "run-s clean compile copy_artifacts generate_contract_wrappers",
"copy_artifacts": "copyfiles -u 4 'artifacts/1.0.0/**/*' ./lib/src/artifacts",
"build": "tsc",
"clean": "shx rm -rf lib",
"lint": "tslint --project . 'src/**/*.ts'",
"migrate": "run-s build compile script:migrate",
"script:migrate": "node ./lib/migrate.js",
"copy_artifacts": "copyfiles 'artifacts/1.0.0/**/*' ./lib",
"generate_contract_wrappers": "node ../abi-gen/lib/index.js --abis ${npm_package_config_abis} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/contract_wrappers --backend ethers && prettier --write 'src/contract_wrappers/**.ts'",
"compile": "node ../deployer/lib/src/cli.js compile"
},
"config": {
"abis": "artifacts/1.0.0/@(DummyToken|TokenTransferProxy|Exchange|TokenRegistry|MultiSigWallet|MultiSigWalletWithTimeLock|MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress|TokenRegistry|ZRXToken|Arbitrage|EtherDelta|AccountLevels|WETH9|MaliciousToken).json"
},
"license": "Apache-2.0",
"devDependencies": {
"@0xproject/dev-utils": "^0.4.1",
"@0xproject/types": "^0.6.3",
"@0xproject/tslint-config": "^0.4.17",
"npm-run-all": "^4.1.2",
"shx": "^0.2.2",
@@ -25,6 +32,7 @@
},
"dependencies": {
"@0xproject/deployer": "^0.4.3",
"@0xproject/base-contract": "^0.3.1",
"@0xproject/utils": "^0.6.1",
"@0xproject/web3-wrapper": "^0.6.3",
"lodash": "^4.17.4"

View File

@@ -0,0 +1,55 @@
import { BaseContract } from '@0xproject/base-contract';
import { ContractArtifact } from '@0xproject/deployer';
import * as fs from 'fs';
import * as path from 'path';
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,
};
const ARTIFACTS_DIR = '../artifacts/1.0.0';
export class ArtifactWriter {
private _artifactsDir: string;
private _networkId: number;
constructor(artifactsDir: string, networkId: number) {
this._artifactsDir = artifactsDir;
this._networkId = networkId;
}
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, 2));
}
}

View File

@@ -1,24 +1,22 @@
#!/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('artifacts', '1.0.0'),
networkId: 50,
defaults: {
gas: devConstants.GAS_ESTIMATE,
},
const defaults = {
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, defaults);
process.exit(0);
})().catch(err => {
logUtils.log(err);
process.exit(1);

View File

@@ -1,8 +1,16 @@
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 { artifacts, ArtifactWriter } 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';
@@ -12,25 +20,46 @@ import { tokenInfo } from './utils/token_info';
* the migration should be written to run synchronously.
* @param deployer Deployer instance.
*/
export const runMigrationsAsync = async (deployer: Deployer) => {
const web3Wrapper: Web3Wrapper = deployer.web3Wrapper;
export const runMigrationsAsync = async (provider: Provider, artifactsDir: string, defaults: Partial<TxData>) => {
const web3Wrapper = new Web3Wrapper(provider);
const networkId = await web3Wrapper.getNetworkIdAsync();
const artifactsWriter = new ArtifactWriter(artifactsDir, networkId);
const tokenTransferProxy = await TokenTransferProxyContract.deploy0xArtifactAsync(
artifacts.TokenTransferProxy,
provider,
defaults,
);
artifactsWriter.saveArtifact(tokenTransferProxy);
const zrxToken = await ZRXTokenContract.deploy0xArtifactAsync(artifacts.ZRX, provider, defaults);
artifactsWriter.saveArtifact(zrxToken);
const etherToken = await WETH9Contract.deploy0xArtifactAsync(artifacts.EtherToken, provider, defaults);
artifactsWriter.saveArtifact(etherToken);
const tokenReg = await TokenRegistryContract.deploy0xArtifactAsync(artifacts.TokenRegistry, provider, defaults);
artifactsWriter.saveArtifact(tokenReg);
const accounts: string[] = await web3Wrapper.getAvailableAddressesAsync();
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 exchangeArgs = [zrxToken.address, tokenTransferProxy.address];
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.deploy0xArtifactAsync(
artifacts.Exchange,
provider,
defaults,
zrxToken.address,
tokenTransferProxy.address,
);
artifactsWriter.saveArtifact(exchange);
const multiSig = await MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddressContract.deploy0xArtifactAsync(
artifacts.MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,
provider,
defaults,
owners,
confirmationsRequired,
secondsRequired,
tokenTransferProxy.address,
);
artifactsWriter.saveArtifact(multiSig);
const owner = accounts[0];
await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, { from: owner });
@@ -70,8 +99,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.deploy0xArtifactAsync(
artifacts.DummyToken,
provider,
defaults,
token.name,
token.symbol,
token.decimals,
totalSupply,
);
await tokenReg.addToken.sendTransactionAsync(
dummyToken.address,
token.name,

View File

@@ -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;
}

View File

@@ -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,
},