Skip to content

Commit

Permalink
Add upgrade scripts for chai support on xdai bridge contracts (#379)
Browse files Browse the repository at this point in the history
  • Loading branch information
patitonar committed Mar 13, 2020
1 parent e2c8d3f commit a5946e7
Show file tree
Hide file tree
Showing 9 changed files with 58 additions and 209 deletions.
10 changes: 2 additions & 8 deletions 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
Expand All @@ -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=
6 changes: 2 additions & 4 deletions upgrade/README.md
Expand Up @@ -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)
5 changes: 2 additions & 3 deletions upgrade/package.json
Expand Up @@ -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",
Expand Down
42 changes: 17 additions & 25 deletions upgrade/src/migrateToMCD.js → upgrade/src/initializeChai.js
Expand Up @@ -3,22 +3,23 @@ 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,
FOREIGN_RPC_URL,
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)
Expand All @@ -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()
49 changes: 13 additions & 36 deletions upgrade/src/upgradeBridgeOnForeign.js
Expand Up @@ -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,
Expand All @@ -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)

Expand All @@ -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)
}
Expand Down
55 changes: 0 additions & 55 deletions upgrade/src/upgradeBridgeOnHome.js

This file was deleted.

75 changes: 0 additions & 75 deletions upgrade/src/upgradeValidatorsOnForeign.js

This file was deleted.

Expand Up @@ -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
File renamed without changes.

0 comments on commit a5946e7

Please sign in to comment.