diff --git a/upgrade/.env.example b/upgrade/.env.example index ce973f96..2c819efe 100644 --- a/upgrade/.env.example +++ b/upgrade/.env.example @@ -1,9 +1,3 @@ -HOME_RPC_URL=https://dai.poa.network -HOME_PRIVKEY=0x... -HOME_BRIDGE_ADDRESS=0x7301CFA0e1756B71869E93d4e4Dca5c7d0eb0AA6 -HOME_START_BLOCK=7384314 -HOME_GAS_PRICE=1000000000 - FOREIGN_RPC_URL=https://mainnet.infura.io/v3/API_KEY FOREIGN_PRIVKEY=0x... FOREING_BRIDGE_ADDRESS=0x4aa42145Aa6Ebf72e164C9bBC74fbD3788045016 @@ -13,6 +7,6 @@ FOREIGN_GAS_PRICE=1000000000 # leader or confirm ROLE=confirm -NEW_IMPLEMENTATION_XDAI_BRIDGE= -NEW_IMPLEMENTATION_ETH_VALIDATORS= +# Optional parameters, depends on the script used NEW_IMPLEMENTATION_ETH_BRIDGE= +CHAI_INTEREST_RECEIVER= diff --git a/upgrade/README.md b/upgrade/README.md index 4e8f1d06..488b426f 100644 --- a/upgrade/README.md +++ b/upgrade/README.md @@ -21,7 +21,5 @@ cp .env.example .env Complete the variables in `.env` file. The `ROLE` variable indicates if the validator will send the creation transaction on the multisig wallet or if it will send the confirmation. Run the script. The following are available: -* `npm run upgradeBridgeOnHome` -* `npm run upgradeValidatorsOnForeign` -* `npm run upgradeBridgeOnForeign` -* `npm run migrateToMCD` +* `npm run chaiUpgrade:upgradeBridgeOnForeign` (Requires `NEW_IMPLEMENTATION_ETH_BRIDGE` .env param) +* `npm run chaiUpgrade:initializeChai` (Requires `CHAI_INTEREST_RECEIVER` .env param) diff --git a/upgrade/package.json b/upgrade/package.json index 3ed1e461..cecc0cb9 100644 --- a/upgrade/package.json +++ b/upgrade/package.json @@ -4,10 +4,9 @@ "main": "index.js", "license": "GPLv3", "scripts": { - "upgradeBridgeOnHome": "node src/upgradeBridgeOnHome.js", - "upgradeValidatorsOnForeign": "node src/upgradeValidatorsOnForeign.js", "upgradeBridgeOnForeign": "node src/upgradeBridgeOnForeign.js", - "migrateToMCD": "node src/migrateToMCD.js" + "initializeChai": "node src/initializeChai.js", + "lint": "eslint ." }, "dependencies": { "dotenv": "^8.2.0", diff --git a/upgrade/src/migrateToMCD.js b/upgrade/src/initializeChai.js similarity index 50% rename from upgrade/src/migrateToMCD.js rename to upgrade/src/initializeChai.js index 2dd04519..bc0c242e 100644 --- a/upgrade/src/migrateToMCD.js +++ b/upgrade/src/initializeChai.js @@ -3,8 +3,8 @@ const Web3 = require('web3') const multiSigWalletAbi = require('../abi/multiSigwallet') const proxyAbi = require('../../build/contracts/EternalStorageProxy').abi const foreignBridgeAbi = require('../../build/contracts/ForeignBridgeErcToNative').abi -const confirmTransaction = require('./confirmTransaction') -const validatorState = require('./validatorState') +const callMultiSigWallet = require('./utils/callMultiSigWallet') +const validatorState = require('./utils/validatorState') const { FOREIGN_PRIVKEY, @@ -12,13 +12,14 @@ const { FOREING_BRIDGE_ADDRESS, ROLE, FOREIGN_START_BLOCK, - FOREIGN_GAS_PRICE + FOREIGN_GAS_PRICE, + CHAI_INTEREST_RECEIVER } = process.env const web3 = new Web3(new Web3.providers.HttpProvider(FOREIGN_RPC_URL)) const { address } = web3.eth.accounts.wallet.add(FOREIGN_PRIVKEY) -const migrateToMCD = async () => { +const initializeChai = async () => { try { const proxy = new web3.eth.Contract(proxyAbi, FOREING_BRIDGE_ADDRESS) const bridge = new web3.eth.Contract(foreignBridgeAbi, FOREING_BRIDGE_ADDRESS) @@ -28,29 +29,20 @@ const migrateToMCD = async () => { await validatorState(web3, address, multiSigWallet) - const data = bridge.methods.migrateToMCD().encodeABI() - - if (ROLE === 'leader') { - const gas = await multiSigWallet.methods - .submitTransaction(FOREING_BRIDGE_ADDRESS, 0, data) - .estimateGas({ from: address }) - const receipt = await multiSigWallet.methods - .submitTransaction(FOREING_BRIDGE_ADDRESS, 0, data) - .send({ from: address, gas, gasPrice: FOREIGN_GAS_PRICE }) - console.log(`Submission status: ${receipt.status} - Tx Hash: ${receipt.transactionHash}`) - } else { - await confirmTransaction({ - fromBlock: FOREIGN_START_BLOCK, - contract: multiSigWallet, - destination: FOREING_BRIDGE_ADDRESS, - data, - address, - gasPrice: FOREIGN_GAS_PRICE - }) - } + const data = bridge.methods.initializeChaiToken(CHAI_INTEREST_RECEIVER).encodeABI() + + await callMultiSigWallet({ + role: ROLE, + contract: multiSigWallet, + destination: FOREING_BRIDGE_ADDRESS, + fromBlock: FOREIGN_START_BLOCK, + gasPrice: FOREIGN_GAS_PRICE, + address, + data + }) } catch (e) { console.log(e.message) } } -migrateToMCD() +initializeChai() diff --git a/upgrade/src/upgradeBridgeOnForeign.js b/upgrade/src/upgradeBridgeOnForeign.js index 1ba660d0..c0c7e20e 100644 --- a/upgrade/src/upgradeBridgeOnForeign.js +++ b/upgrade/src/upgradeBridgeOnForeign.js @@ -2,8 +2,8 @@ require('dotenv').config() const Web3 = require('web3') const multiSigWalletAbi = require('../abi/multiSigwallet') const proxyAbi = require('../../build/contracts/EternalStorageProxy').abi -const confirmTransaction = require('./confirmTransaction') -const validatorState = require('./validatorState') +const callMultiSigWallet = require('./utils/callMultiSigWallet') +const validatorState = require('./utils/validatorState') const { FOREIGN_PRIVKEY, @@ -15,18 +15,6 @@ const { NEW_IMPLEMENTATION_ETH_BRIDGE } = process.env -const migrationMethodAbi = [ - { - constant: false, - inputs: [], - name: 'upgradeToV250', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function' - } -] - const web3 = new Web3(new Web3.providers.HttpProvider(FOREIGN_RPC_URL)) const { address } = web3.eth.accounts.wallet.add(FOREIGN_PRIVKEY) @@ -38,28 +26,17 @@ const upgradeBridgeOnForeign = async () => { await validatorState(web3, address, multiSigWallet) - const bridge = new web3.eth.Contract(migrationMethodAbi, FOREING_BRIDGE_ADDRESS) - const upgradeData = bridge.methods.upgradeToV250().encodeABI() - const data = proxy.methods.upgradeToAndCall('3', NEW_IMPLEMENTATION_ETH_BRIDGE, upgradeData).encodeABI() - - if (ROLE === 'leader') { - const gas = await multiSigWallet.methods.submitTransaction(FOREING_BRIDGE_ADDRESS, 0, data).estimateGas({ - from: address - }) - const receipt = await multiSigWallet.methods - .submitTransaction(FOREING_BRIDGE_ADDRESS, 0, data) - .send({ from: address, gas, gasPrice: FOREIGN_GAS_PRICE }) - console.log(`Submission status: ${receipt.status} - Tx Hash: ${receipt.transactionHash}`) - } else { - await confirmTransaction({ - fromBlock: FOREIGN_START_BLOCK, - contract: multiSigWallet, - destination: FOREING_BRIDGE_ADDRESS, - data, - address, - gasPrice: FOREIGN_GAS_PRICE - }) - } + const data = proxy.methods.upgradeTo('4', NEW_IMPLEMENTATION_ETH_BRIDGE).encodeABI() + + await callMultiSigWallet({ + role: ROLE, + contract: multiSigWallet, + destination: FOREING_BRIDGE_ADDRESS, + fromBlock: FOREIGN_START_BLOCK, + gasPrice: FOREIGN_GAS_PRICE, + address, + data + }) } catch (e) { console.log(e.message) } diff --git a/upgrade/src/upgradeBridgeOnHome.js b/upgrade/src/upgradeBridgeOnHome.js deleted file mode 100644 index acd2eb3b..00000000 --- a/upgrade/src/upgradeBridgeOnHome.js +++ /dev/null @@ -1,55 +0,0 @@ -require('dotenv').config() -const Web3 = require('web3') -const multiSigWalletAbi = require('../abi/multiSigwallet') -const proxyAbi = require('../../build/contracts/EternalStorageProxy').abi -const confirmTransaction = require('./confirmTransaction') -const validatorState = require('./validatorState') - -const { - HOME_PRIVKEY, - HOME_RPC_URL, - HOME_BRIDGE_ADDRESS, - ROLE, - HOME_START_BLOCK, - HOME_GAS_PRICE, - NEW_IMPLEMENTATION_XDAI_BRIDGE -} = process.env - -const web3 = new Web3(new Web3.providers.HttpProvider(HOME_RPC_URL)) -const { address } = web3.eth.accounts.wallet.add(HOME_PRIVKEY) - -const proxy = new web3.eth.Contract(proxyAbi, HOME_BRIDGE_ADDRESS) - -const upgradeBridgeOnHome = async () => { - try { - const ownerAddress = await proxy.methods.upgradeabilityOwner().call() - const multiSigWallet = new web3.eth.Contract(multiSigWalletAbi, ownerAddress) - - await validatorState(web3, address, multiSigWallet) - - const data = proxy.methods.upgradeTo('3', NEW_IMPLEMENTATION_XDAI_BRIDGE).encodeABI() - - if (ROLE === 'leader') { - const gas = await multiSigWallet.methods - .submitTransaction(HOME_BRIDGE_ADDRESS, 0, data) - .estimateGas({ from: address }) - const receipt = await multiSigWallet.methods - .submitTransaction(HOME_BRIDGE_ADDRESS, 0, data) - .send({ from: address, gas, gasPrice: HOME_GAS_PRICE }) - console.log(`Submission status: ${receipt.status} - Tx Hash: ${receipt.transactionHash}`) - } else { - await confirmTransaction({ - fromBlock: HOME_START_BLOCK, - contract: multiSigWallet, - destination: HOME_BRIDGE_ADDRESS, - data, - address, - gasPrice: HOME_GAS_PRICE - }) - } - } catch (e) { - console.log(e.message) - } -} - -upgradeBridgeOnHome() diff --git a/upgrade/src/upgradeValidatorsOnForeign.js b/upgrade/src/upgradeValidatorsOnForeign.js deleted file mode 100644 index 76eea31b..00000000 --- a/upgrade/src/upgradeValidatorsOnForeign.js +++ /dev/null @@ -1,75 +0,0 @@ -require('dotenv').config() -const Web3 = require('web3') -const multiSigWalletAbi = require('../abi/multiSigwallet') -const proxyAbi = require('../../build/contracts/EternalStorageProxy').abi -const foreignBridgeAbi = require('../../build/contracts/ForeignBridgeErcToNative').abi -const confirmTransaction = require('./confirmTransaction') -const validatorState = require('./validatorState') - -const migrationMethodAbi = [ - { - constant: false, - inputs: [], - name: 'upgradeToV230', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function' - } -] - -const { - FOREIGN_PRIVKEY, - FOREIGN_RPC_URL, - FOREING_BRIDGE_ADDRESS, - ROLE, - FOREIGN_START_BLOCK, - FOREIGN_GAS_PRICE, - NEW_IMPLEMENTATION_ETH_VALIDATORS -} = process.env - -const web3 = new Web3(new Web3.providers.HttpProvider(FOREIGN_RPC_URL)) -const { address } = web3.eth.accounts.wallet.add(FOREIGN_PRIVKEY) - -const bridge = new web3.eth.Contract(foreignBridgeAbi, FOREING_BRIDGE_ADDRESS) - -const upgradeValidatorsOnForeign = async () => { - try { - const validatorsAddress = await bridge.methods.validatorContract().call() - - const proxy = new web3.eth.Contract(proxyAbi, validatorsAddress) - const ownerAddress = await proxy.methods.upgradeabilityOwner().call() - - const multiSigWallet = new web3.eth.Contract(multiSigWalletAbi, ownerAddress) - - await validatorState(web3, address, multiSigWallet) - - const validatorContract = new web3.eth.Contract(migrationMethodAbi, validatorsAddress) - const upgradeData = validatorContract.methods.upgradeToV230().encodeABI() - - const data = proxy.methods.upgradeToAndCall('2', NEW_IMPLEMENTATION_ETH_VALIDATORS, upgradeData).encodeABI() - - if (ROLE === 'leader') { - const gas = await multiSigWallet.methods - .submitTransaction(validatorsAddress, 0, data) - .estimateGas({ from: address }) - const receipt = await multiSigWallet.methods - .submitTransaction(validatorsAddress, 0, data) - .send({ from: address, gas, gasPrice: FOREIGN_GAS_PRICE }) - console.log(`Submission status: ${receipt.status} - Tx Hash: ${receipt.transactionHash}`) - } else { - await confirmTransaction({ - fromBlock: FOREIGN_START_BLOCK, - contract: multiSigWallet, - destination: validatorsAddress, - data, - address, - gasPrice: FOREIGN_GAS_PRICE - }) - } - } catch (e) { - console.log(e.message) - } -} - -upgradeValidatorsOnForeign() diff --git a/upgrade/src/confirmTransaction.js b/upgrade/src/utils/callMultiSigWallet.js similarity index 70% rename from upgrade/src/confirmTransaction.js rename to upgrade/src/utils/callMultiSigWallet.js index 7a6a3ff8..53173281 100644 --- a/upgrade/src/confirmTransaction.js +++ b/upgrade/src/utils/callMultiSigWallet.js @@ -39,11 +39,30 @@ const confirmTransaction = async ({ contract, fromBlock = 0, destination, data, console.log(`Confirmation status: ${receipt.status} - Tx Hash: ${receipt.transactionHash}`) } -function addExtraGas(gas) { - gas = toBN(gas) +function addExtraGas(initialGas) { + const gas = toBN(initialGas) const extraPercentage = toBN(4) return gas.mul(extraPercentage) } -module.exports = confirmTransaction +const callMultiSigWallet = async ({ role, contract, destination, fromBlock, gasPrice, address, data }) => { + if (role === 'leader') { + const gas = await contract.methods.submitTransaction(destination, 0, data).estimateGas({ from: address }) + const receipt = await contract.methods + .submitTransaction(destination, 0, data) + .send({ from: address, gas, gasPrice }) + console.log(`Submission status: ${receipt.status} - Tx Hash: ${receipt.transactionHash}`) + } else { + await confirmTransaction({ + fromBlock, + contract, + destination, + data, + address, + gasPrice + }) + } +} + +module.exports = callMultiSigWallet diff --git a/upgrade/src/validatorState.js b/upgrade/src/utils/validatorState.js similarity index 100% rename from upgrade/src/validatorState.js rename to upgrade/src/utils/validatorState.js