Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add xdai upgrade scripts for chai support #379

Merged
merged 4 commits into from Mar 13, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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.