deploy.js 4.88 KB
Newer Older
1
#!/usr/bin/env node
2

3
const contracts = require('../build/src/contract-deployment/deploy');
4
const { providers, Wallet, utils, ethers } = require('ethers');
5
const { LedgerSigner } = require('@ethersproject/hardware-wallets');
6 7 8 9 10
const { JsonRpcProvider } = providers;

const env = process.env;
const key = env.DEPLOYER_PRIVATE_KEY;
const sequencerKey = env.SEQUENCER_PRIVATE_KEY;
11
let SEQUENCER_ADDRESS = env.SEQUENCER_ADDRESS;
12
const web3Url = env.L1_NODE_WEB3_URL || 'http://127.0.0.1:8545';
13
const DEPLOY_TX_GAS_LIMIT = env.DEPLOY_TX_GAS_LIMIT || 5000000;
14
const MIN_TRANSACTION_GAS_LIMIT = env.MIN_TRANSACTION_GAS_LIMIT || 50000;
15
const MAX_TRANSACTION_GAS_LIMIT = env.MAX_TRANSACTION_GAS_LIMIT || 9000000;
16
const MAX_GAS_PER_QUEUE_PER_EPOCH = env.MAX_GAS_PER_QUEUE_PER_EPOCH || 250000000;
17
const SECONDS_PER_EPOCH = env.SECONDS_PER_EPOCH || 0;
18
const WAIT_FOR_RECEIPTS = env.WAIT_FOR_RECEIPTS === 'true';
19 20
let WHITELIST_OWNER = env.WHITELIST_OWNER;
const WHITELIST_ALLOW_ARBITRARY_CONTRACT_DEPLOYMENT = env.WHITELIST_ALLOW_ARBITRARY_CONTRACT_DEPLOYMENT || true;
21
const FORCE_INCLUSION_PERIOD_SECONDS = env.FORCE_INCLUSION_PERIOD_SECONDS || 2592000; // 30 days
22 23
const FRAUD_PROOF_WINDOW_SECONDS = env.FRAUD_PROOF_WINDOW_SECONDS || (60 * 60 * 24 * 7); // 7 days
const SEQUENCER_PUBLISH_WINDOW_SECONDS = env.SEQUENCER_PUBLISH_WINDOW_SECONDS || (60 * 30); // 30 min
24
const CHAIN_ID = env.CHAIN_ID || 420; // layer 2 chainid
25
const USE_LEDGER = env.USE_LEDGER || false;
26
const ADDRESS_MANAGER_ADDRESS = env.ADDRESS_MANAGER_ADDRESS || undefined;
27
const HD_PATH = env.HD_PATH || utils.defaultPath;
28
const BLOCK_TIME_SECONDS = env.BLOCK_TIME_SECONDS || 15;
29
const L2_CROSS_DOMAIN_MESSENGER_ADDRESS =
30
  env.L2_CROSS_DOMAIN_MESSENGER_ADDRESS || '0x4200000000000000000000000000000000000007';
31 32
let RELAYER_ADDRESS = env.RELAYER_ADDRESS || '0x0000000000000000000000000000000000000000';
const RELAYER_PRIVATE_KEY = env.RELAYER_PRIVATE_KEY;
33

34
(async () => {
35 36
  const provider = new JsonRpcProvider(web3Url);
  let signer;
37

38
  // Use the ledger for the deployer
39 40 41 42 43 44 45
  if (USE_LEDGER) {
    signer = new LedgerSigner(provider, 'default', HD_PATH);
  } else  {
    if (typeof key === 'undefined')
      throw new Error('Must pass deployer key as DEPLOYER_PRIVATE_KEY');
    signer = new Wallet(key, provider);
  }
46

47 48
  if (SEQUENCER_ADDRESS) {
    if (!utils.isAddress(SEQUENCER_ADDRESS))
49
      throw new Error(`Invalid Sequencer Address: ${SEQUENCER_ADDRESS}`);
50 51 52 53
  } else {
    if (!sequencerKey)
      throw new Error('Must pass sequencer key as SEQUENCER_PRIVATE_KEY');
    const sequencer = new Wallet(sequencerKey, provider);
54
    SEQUENCER_ADDRESS = await sequencer.getAddress();
55
  }
56 57 58 59

  if (typeof WHITELIST_OWNER === 'undefined')
    WHITELIST_OWNER = signer;

60 61 62 63 64 65 66 67 68 69
  // Use the address derived from RELAYER_PRIVATE_KEY if a private key
  // is passed. Using the zero address as the relayer address will mean
  // there is no relayer authentication.
  if (RELAYER_PRIVATE_KEY) {
    if (!utils.isAddress(RELAYER_ADDRESS))
      throw new Error(`Invalid Relayer Address: ${RELAYER_ADDRESS}`);
    const relayer = new Wallet(RELAYER_PRIVATE_KEY, provider);
    RELAYER_ADDRESS = await relayer.getAddress();
  }

70 71 72 73
  const result = await contracts.deploy({
    deploymentSigner: signer,
    transactionChainConfig: {
      forceInclusionPeriodSeconds: FORCE_INCLUSION_PERIOD_SECONDS,
74
      sequencer: SEQUENCER_ADDRESS,
75
      forceInclusionPeriodBlocks: Math.ceil(FORCE_INCLUSION_PERIOD_SECONDS/BLOCK_TIME_SECONDS),
76
    },
77 78 79 80
    stateChainConfig: {
      fraudProofWindowSeconds: FRAUD_PROOF_WINDOW_SECONDS,
      sequencerPublishWindowSeconds: SEQUENCER_PUBLISH_WINDOW_SECONDS,
    },
81
    ovmGlobalContext: {
82 83
      ovmCHAINID: CHAIN_ID,
      L2CrossDomainMessengerAddress: L2_CROSS_DOMAIN_MESSENGER_ADDRESS
84
    },
85
    l1CrossDomainMessengerConfig: {
86
      relayerAddress: RELAYER_ADDRESS,
87
    },
88 89 90 91 92 93 94 95 96 97
    ovmGasMeteringConfig: {
      minTransactionGasLimit: MIN_TRANSACTION_GAS_LIMIT,
      maxTransactionGasLimit: MAX_TRANSACTION_GAS_LIMIT,
      maxGasPerQueuePerEpoch: MAX_GAS_PER_QUEUE_PER_EPOCH,
      secondsPerEpoch: SECONDS_PER_EPOCH
    },
    whitelistConfig: {
      owner: WHITELIST_OWNER,
      allowArbitraryContractDeployment: WHITELIST_ALLOW_ARBITRARY_CONTRACT_DEPLOYMENT
    },
98 99 100 101
    deployOverrides: {
      gasLimit: DEPLOY_TX_GAS_LIMIT
    },
    waitForReceipts: WAIT_FOR_RECEIPTS,
102
    addressManager: ADDRESS_MANAGER_ADDRESS,
103 104 105 106 107 108 109
  });

  const { failedDeployments, AddressManager } = result;
  if (failedDeployments.length !== 0)
    throw new Error(`Contract deployment failed: ${failedDeployments.join(',')}`);

  const out = {};
110
  out.AddressManager = AddressManager.address;
111
  out.OVM_Sequencer = SEQUENCER_ADDRESS;
112
  out.Deployer = await signer.getAddress()
113
  for (const [name, contract] of Object.entries(result.contracts)) {
114
    out[name] = contract.address;
115 116 117 118 119 120
  }
  console.log(JSON.stringify(out, null, 2));
})().catch(err => {
  console.log(JSON.stringify({error: err.message, stack: err.stack}, null, 2));
  process.exit(1);
});