aboutsummaryrefslogtreecommitdiffstats
path: root/packages/contracts/deploy/migrations/migrate.ts
blob: c3d38875e63c83511bd13231aee0f6e181998ec8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import {Web3Wrapper} from '@0xproject/web3-wrapper';
import {BigNumber} from 'bignumber.js';
import * as _ from 'lodash';
import * as Web3 from 'web3';

import {Deployer} from './../src/deployer';
import {constants} from './../src/utils/constants';
import {Token} from './../src/utils/types';
import {tokenInfo} from './config/token_info';

export const migrator = {
    /**
     * Custom migrations should be defined in this function. This will be called with the CLI 'migrate' command.
     * @param deployer Deployer instance.
     */
    async runMigrationsAsync(deployer: Deployer): Promise<void> {
        const web3Wrapper: Web3Wrapper = deployer.web3Wrapper;
        const accounts: string[] = await web3Wrapper.getAvailableAddressesAsync();

        const independentContracts: Web3.ContractInstance[] = await Promise.all([
            deployer.deployAndSaveAsync('TokenTransferProxy'),
            deployer.deployAndSaveAsync('ZRXToken'),
            deployer.deployAndSaveAsync('EtherToken'),
            deployer.deployAndSaveAsync('TokenRegistry'),
        ]);
        const [tokenTransferProxy, zrxToken, etherToken, tokenReg] = independentContracts;

        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 dependentContracts: Web3.ContractInstance[] = await Promise.all([
            deployer.deployAndSaveAsync('Exchange', exchangeArgs),
            deployer.deployAndSaveAsync('MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress', multiSigArgs),
        ]);
        const [exchange, multiSig] = dependentContracts;

        const owner = accounts[0];
        await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, {from: owner});
        await tokenTransferProxy.transferOwnership.sendTransactionAsync(multiSig.address, {from: owner});

        const tokensToRegister: Web3.ContractInstance[] = await Promise.all(
            _.map(tokenInfo, async (token: Token): Promise<Web3.ContractInstance> => {
                const totalSupply = new BigNumber(0);
                const args = [
                    token.name,
                    token.symbol,
                    token.decimals,
                    totalSupply,
                ];
                return deployer.deployAsync('DummyToken', args);
            }),
        );
        const addTokenGasEstimate = await tokenReg.addToken.estimateGasAsync(
            tokensToRegister[0].address,
            tokenInfo[0].name,
            tokenInfo[0].symbol,
            tokenInfo[0].decimals,
            tokenInfo[0].ipfsHash,
            tokenInfo[0].swarmHash,
            {from: owner},
        );
        const addTokenPromises = [
            tokenReg.addToken.sendTransactionAsync(
                zrxToken.address,
                '0x Protocol Token',
                'ZRX',
                18,
                constants.NULL_BYTES,
                constants.NULL_BYTES,
                {
                    from: owner,
                    gas: addTokenGasEstimate,
                },
            ),
            tokenReg.addToken.sendTransactionAsync(
                etherToken.address,
                'Ether Token',
                'WETH',
                18,
                constants.NULL_BYTES,
                constants.NULL_BYTES,
                {
                    from: owner,
                    gas: addTokenGasEstimate,
                },
            ),
        ];
        const addDummyTokenPromises = _.map(tokenInfo, async (token: Token, i: number): Promise<void> => {
            return tokenReg.addToken.sendTransactionAsync(
                tokensToRegister[i].address,
                token.name,
                token.symbol,
                token.decimals,
                token.ipfsHash,
                token.swarmHash,
                {
                    from: owner,
                    gas: addTokenGasEstimate,
                },
            );
        });
        await Promise.all([...addDummyTokenPromises, ...addTokenPromises]);
    },
};