Remove deployer from 0x.js and migrations
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -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/
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
55
packages/migrations/src/artifacts.ts
Normal file
55
packages/migrations/src/artifacts.ts
Normal 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));
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user