From 64c5a5670f0fd06ac2551fc67855985c7bd7cb98 Mon Sep 17 00:00:00 2001 From: Gerardo Nardelli Date: Fri, 24 Apr 2020 15:01:07 -0300 Subject: [PATCH] Update contract's submodule and e2e tests (#313) --- contracts | 2 +- e2e-commons/contracts-envs/erc-to-native.env | 2 +- monitor-e2e/test/ercToNative.js | 55 +--- monitor-e2e/utils.js | 11 - oracle-e2e/test/ercToNative.js | 269 ++----------------- 5 files changed, 27 insertions(+), 312 deletions(-) diff --git a/contracts b/contracts index dfe427b5f..3bc2b08fe 160000 --- a/contracts +++ b/contracts @@ -1 +1 @@ -Subproject commit dfe427b5fd4d57ebdf7bddc659aa780b752777e7 +Subproject commit 3bc2b08feffb45a3e780f1703c51f971850f9c1d diff --git a/e2e-commons/contracts-envs/erc-to-native.env b/e2e-commons/contracts-envs/erc-to-native.env index 8a7ccac7b..20fa8bd20 100644 --- a/e2e-commons/contracts-envs/erc-to-native.env +++ b/e2e-commons/contracts-envs/erc-to-native.env @@ -32,7 +32,7 @@ FOREIGN_GAS_PRICE=10000000000 FOREIGN_REWARDABLE=false BLOCK_REWARD_ADDRESS=0xF9698Eb93702dfdd0e2d802088d4c21822a8A977 -ERC20_TOKEN_ADDRESS=0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359 +ERC20_TOKEN_ADDRESS=0x7cc4b1851c35959d34e635a470f6b5c43ba3c9c9 REQUIRED_NUMBER_OF_VALIDATORS=1 VALIDATORS="0xaaB52d66283F7A1D5978bcFcB55721ACB467384b 0xdCC784657C78054aa61FbcFFd2605F32374816A4 0xDcef88209a20D52165230104B245803C3269454d" diff --git a/monitor-e2e/test/ercToNative.js b/monitor-e2e/test/ercToNative.js index b90ecf181..aad7cdef9 100644 --- a/monitor-e2e/test/ercToNative.js +++ b/monitor-e2e/test/ercToNative.js @@ -7,8 +7,7 @@ const { addValidator, initializeChaiToken, convertDaiToChai, - setMinDaiTokenBalance, - migrateToMCD + setMinDaiTokenBalance } = require('../utils') const baseUrl = ercToNativeBridge.monitor @@ -34,43 +33,12 @@ describe('ERC TO NATIVE with changing state of contracts', () => { it('should change balanceDiff', async function() { this.timeout(60000) - await sendTokens(foreignRPC.URL, user, ercToNativeBridge.halfDuplexToken, ercToNativeBridge.foreign) - - await waitUntil(async () => { - ;({ data } = await axios.get(`${baseUrl}`)) - const { erc20Balance, halfDuplexErc20Balance, investedErc20Balance } = data.foreign - return ( - data.balanceDiff === 0.01 && - erc20Balance === '0.01' && - halfDuplexErc20Balance === undefined && - investedErc20Balance === undefined - ) - }) - - await migrateToMCD(foreignRPC.URL, ercToNativeBridge.foreign) - - await waitUntil(async () => { - ;({ data } = await axios.get(`${baseUrl}`)) - const { erc20Balance, halfDuplexErc20Balance, investedErc20Balance } = data.foreign - return ( - data.balanceDiff === 0.01 && - erc20Balance === '0.01' && - halfDuplexErc20Balance === '0' && - investedErc20Balance === undefined - ) - }) - - await sendTokens(foreignRPC.URL, user, ercToNativeBridge.halfDuplexToken, ercToNativeBridge.foreign) + await sendTokens(foreignRPC.URL, user, ercToNativeBridge.foreignToken, ercToNativeBridge.foreign) await waitUntil(async () => { ;({ data } = await axios.get(`${baseUrl}`)) - const { erc20Balance, halfDuplexErc20Balance, investedErc20Balance } = data.foreign - return ( - data.balanceDiff === 0.02 && - erc20Balance === '0.01' && - halfDuplexErc20Balance === '0.01' && - investedErc20Balance === undefined - ) + const { erc20Balance, investedErc20Balance } = data.foreign + return data.balanceDiff === 0.01 && erc20Balance === '0.01' && investedErc20Balance === undefined }) }) @@ -89,11 +57,10 @@ describe('ERC TO NATIVE with changing state of contracts', () => { await waitUntil(async () => { ;({ data } = await axios.get(`${baseUrl}`)) - const { erc20Balance, halfDuplexErc20Balance, investedErc20Balance, accumulatedInterest } = data.foreign + const { erc20Balance, investedErc20Balance, accumulatedInterest } = data.foreign return ( - data.balanceDiff === 0.03 && + data.balanceDiff === 0.02 && erc20Balance === '0.02' && - halfDuplexErc20Balance === '0.01' && investedErc20Balance === '0' && accumulatedInterest === '0.001' // value of dsrBalance() is initially defined in genesis block as 0.001 ) @@ -104,11 +71,10 @@ describe('ERC TO NATIVE with changing state of contracts', () => { await waitUntil(async () => { ;({ data } = await axios.get(`${baseUrl}`)) - const { erc20Balance, halfDuplexErc20Balance, investedErc20Balance, accumulatedInterest } = data.foreign + const { erc20Balance, investedErc20Balance, accumulatedInterest } = data.foreign return ( - data.balanceDiff === 0.03 && + data.balanceDiff === 0.02 && erc20Balance === '0.01' && - halfDuplexErc20Balance === '0.01' && investedErc20Balance === '0.01' && accumulatedInterest === '0.001' ) @@ -119,11 +85,10 @@ describe('ERC TO NATIVE with changing state of contracts', () => { await waitUntil(async () => { ;({ data } = await axios.get(`${baseUrl}`)) - const { erc20Balance, halfDuplexErc20Balance, investedErc20Balance, accumulatedInterest } = data.foreign + const { erc20Balance, investedErc20Balance, accumulatedInterest } = data.foreign return ( - data.balanceDiff === 0.03 && + data.balanceDiff === 0.02 && erc20Balance === '0.005' && - halfDuplexErc20Balance === '0.01' && investedErc20Balance === '0.015' && accumulatedInterest === '0.001' ) diff --git a/monitor-e2e/utils.js b/monitor-e2e/utils.js index f452ffb51..6459ebfaa 100644 --- a/monitor-e2e/utils.js +++ b/monitor-e2e/utils.js @@ -67,16 +67,6 @@ const addValidator = async (rpcUrl, account, bridgeAddress) => { }) } -const migrateToMCD = async (rpcUrl, bridgeAddress) => { - const web3 = new Web3(new Web3.providers.HttpProvider(rpcUrl)) - web3.eth.accounts.wallet.add(validator.privateKey) - const bridgeContract = new web3.eth.Contract(FOREIGN_ERC_TO_NATIVE_ABI, bridgeAddress) - await bridgeContract.methods.migrateToMCD().send({ - from: validator.address, - gas: '4000000' - }) -} - const initializeChaiToken = async (rpcUrl, bridgeAddress) => { const web3 = new Web3(new Web3.providers.HttpProvider(rpcUrl)) web3.eth.accounts.wallet.add(validator.privateKey) @@ -116,7 +106,6 @@ module.exports = { sendTokens, addValidator, sendAMBMessage, - migrateToMCD, initializeChaiToken, setMinDaiTokenBalance, convertDaiToChai diff --git a/oracle-e2e/test/ercToNative.js b/oracle-e2e/test/ercToNative.js index 8e92b4aaf..a5dca5b7a 100644 --- a/oracle-e2e/test/ercToNative.js +++ b/oracle-e2e/test/ercToNative.js @@ -9,8 +9,8 @@ const { homeRPC, foreignRPC } = require('../../e2e-commons/constants.json') -const { ERC677_BRIDGE_TOKEN_ABI, FOREIGN_ERC_TO_NATIVE_ABI, SAI_TOP, HOME_ERC_TO_NATIVE_ABI } = require('../../commons') -const { uniformRetry, sleep } = require('../../e2e-commons/utils') +const { ERC677_BRIDGE_TOKEN_ABI, FOREIGN_ERC_TO_NATIVE_ABI, HOME_ERC_TO_NATIVE_ABI } = require('../../commons') +const { uniformRetry } = require('../../e2e-commons/utils') const { setRequiredSignatures } = require('./utils') const homeWeb3 = new Web3(new Web3.providers.HttpProvider(homeRPC.URL)) @@ -59,18 +59,13 @@ describe('erc to native', () => { } }) }) - it('should continue working after migration', async () => { + it('should not convert half duplex tokens to native tokens in home', async () => { const originalBalanceOnHome = await homeWeb3.eth.getBalance(user.address) const transferValue = homeWeb3.utils.toWei('0.01') - // erc20 token address and half duplex address are the same before migration - const tokenAddress = await foreignBridge.methods.erc20token().call() - - const erc20AndhalfDuplexToken = new foreignWeb3.eth.Contract(ERC677_BRIDGE_TOKEN_ABI, tokenAddress) - // send tokens to foreign bridge - await erc20AndhalfDuplexToken.methods + await halfDuplexToken.methods .transfer(COMMON_FOREIGN_BRIDGE_ADDRESS, transferValue) .send({ from: user.address, @@ -80,34 +75,17 @@ describe('erc to native', () => { console.error(e) }) - // check that balance increases + // check that balance does not increases await promiseRetry(async (retry, number) => { const balance = await homeWeb3.eth.getBalance(user.address) - // retry at least 4 times to check transfer is not double processed by the two watchers - if (toBN(balance).lte(toBN(originalBalanceOnHome)) || number < 4) { + // retry at least 4 times to check transfer is not processed + if (toBN(balance).eq(toBN(originalBalanceOnHome)) && number < 4) { retry() } else { - assert( - toBN(balance).eq(toBN(originalBalanceOnHome).add(toBN(transferValue))), - 'User balance should be increased only by second transfer' - ) + assert(toBN(balance).eq(toBN(originalBalanceOnHome)), 'User balance should not be increased') } }) - // call migration - await foreignBridge.methods.migrateToMCD().send({ - from: validator.address, - gas: '4000000' - }) - - // update min threshold for swap - await foreignBridge.methods.setMinHDTokenBalance(foreignWeb3.utils.toWei('2', 'ether')).send({ - from: validator.address, - gas: '1000000' - }) - - const AfterMigrateBalance = await homeWeb3.eth.getBalance(user.address) - // send tokens to foreign bridge await erc20Token.methods .transfer(COMMON_FOREIGN_BRIDGE_ADDRESS, transferValue) @@ -123,20 +101,20 @@ describe('erc to native', () => { await promiseRetry(async (retry, number) => { const balance = await homeWeb3.eth.getBalance(user.address) // retry at least 4 times to check transfer is not double processed by the two watchers - if (toBN(balance).lte(toBN(AfterMigrateBalance)) || number < 4) { + if (toBN(balance).lte(toBN(originalBalanceOnHome)) || number < 4) { retry() } else { assert( - toBN(balance).eq(toBN(AfterMigrateBalance).add(toBN(transferValue))), + toBN(balance).eq(toBN(originalBalanceOnHome).add(toBN(transferValue))), 'User balance should be increased only by second transfer' ) } }) - const afterMigrateAndTransferBalance = await homeWeb3.eth.getBalance(user.address) + const afterTransferBalance = await homeWeb3.eth.getBalance(user.address) // send tokens to foreign bridge - await halfDuplexToken.methods + await erc20Token.methods .transfer(COMMON_FOREIGN_BRIDGE_ADDRESS, transferValue) .send({ from: user.address, @@ -150,12 +128,12 @@ describe('erc to native', () => { await promiseRetry(async (retry, number) => { const balance = await homeWeb3.eth.getBalance(user.address) // retry at least 4 times to check transfer is not double processed by the two watchers - if (toBN(balance).lte(toBN(afterMigrateAndTransferBalance)) || number < 4) { + if (toBN(balance).lte(toBN(afterTransferBalance)) || number < 4) { retry() } else { assert( - toBN(balance).eq(toBN(afterMigrateAndTransferBalance).add(toBN(transferValue))), - 'User balance should be increased only by second transfer' + toBN(balance).eq(toBN(afterTransferBalance).add(toBN(transferValue))), + 'User balance should be increased' ) } }) @@ -224,223 +202,6 @@ describe('erc to native', () => { } }) }) - it('should convert half duplex token in foreign to native token in home', async () => { - const originalBalanceOnHome = await homeWeb3.eth.getBalance(user.address) - const bridgeErc20TokenBalance = await erc20Token.methods.balanceOf(COMMON_FOREIGN_BRIDGE_ADDRESS).call() - const bridgeHalfDuplexBalance = await halfDuplexToken.methods.balanceOf(COMMON_FOREIGN_BRIDGE_ADDRESS).call() - - const valueToTransfer = foreignWeb3.utils.toWei('1', 'ether') - - // this transfer won't trigger a call to swap tokens - await halfDuplexToken.methods.transfer(COMMON_FOREIGN_BRIDGE_ADDRESS, valueToTransfer).send({ - from: user.address, - gas: '1000000' - }) - - // check that balance increases - await uniformRetry(async retry => { - const balance = await homeWeb3.eth.getBalance(user.address) - if (toBN(balance).lte(toBN(originalBalanceOnHome))) { - retry() - } else { - assert( - toBN(balance).eq(toBN(originalBalanceOnHome).add(toBN(valueToTransfer))), - 'User balance should be increased by the half duplex token transfer' - ) - } - }) - - const updatedBalanceOnHome = await homeWeb3.eth.getBalance(user.address) - const updatedBridgeHalfDuplexBalance = await halfDuplexToken.methods.balanceOf(COMMON_FOREIGN_BRIDGE_ADDRESS).call() - assert( - toBN(updatedBridgeHalfDuplexBalance).eq(toBN(bridgeHalfDuplexBalance).add(toBN(valueToTransfer))), - 'Bridge balance should reflect the transfer value' - ) - - // this transfer will trigger call to swap tokens - await halfDuplexToken.methods.transfer(COMMON_FOREIGN_BRIDGE_ADDRESS, valueToTransfer).send({ - from: user.address, - gas: '1000000' - }) - - await sleep(2000) - - await uniformRetry(async retry => { - const userBalance = await homeWeb3.eth.getBalance(user.address) - const updatedBridgeErc20TokenBalance = await erc20Token.methods.balanceOf(COMMON_FOREIGN_BRIDGE_ADDRESS).call() - - if ( - toBN(userBalance).lte(toBN(updatedBalanceOnHome)) || - toBN(updatedBridgeErc20TokenBalance).lte(toBN(bridgeErc20TokenBalance)) - ) { - retry() - } else { - assert( - toBN(userBalance).eq(toBN(updatedBalanceOnHome).add(toBN(valueToTransfer))), - 'User balance should be increased by the half duplex token transfer' - ) - const updatedBalance = await halfDuplexToken.methods.balanceOf(COMMON_FOREIGN_BRIDGE_ADDRESS).call() - assert(toBN(updatedBalance).isZero(), 'Half duplex bridge balance should be zero') - assert( - toBN(updatedBridgeErc20TokenBalance).eq( - toBN(bridgeErc20TokenBalance) - .add(toBN(bridgeHalfDuplexBalance)) - .add(toBN(foreignWeb3.utils.toWei('2', 'ether'))) - ), - 'Erc20 token balance should be correctly increased by the token swap' - ) - } - }) - }) - it('should convert half duplex token in foreign to native token in home for alternative receiver ', async () => { - const originalBalanceOnHome = await homeWeb3.eth.getBalance(user.address) - const initialBalanceSecondUser = await homeWeb3.eth.getBalance(secondUser.address) - const bridgeErc20TokenBalance = await erc20Token.methods.balanceOf(COMMON_FOREIGN_BRIDGE_ADDRESS).call() - - const valueToTransfer = foreignWeb3.utils.toWei('1', 'ether') - - // approve tokens to foreign bridge - await halfDuplexToken.methods - .approve(COMMON_FOREIGN_BRIDGE_ADDRESS, valueToTransfer) - .send({ - from: user.address, - gas: '1000000' - }) - .catch(e => { - console.error(e) - }) - - // call bridge method to transfer tokens to a different recipient - await foreignBridge.methods['relayTokens(address,uint256,address)']( - secondUser.address, - valueToTransfer, - halfDuplexTokenAddress - ) - .send({ - from: user.address, - gas: '1000000' - }) - .catch(e => { - console.error(e) - }) - - // check that balance increases - await uniformRetry(async retry => { - const secondUserbalance = await homeWeb3.eth.getBalance(secondUser.address) - const updatedBridgeErc20TokenBalance = await erc20Token.methods.balanceOf(COMMON_FOREIGN_BRIDGE_ADDRESS).call() - const userbalance = await homeWeb3.eth.getBalance(user.address) - assert(toBN(userbalance).lte(toBN(originalBalanceOnHome)), 'User balance should be the same') - if ( - toBN(secondUserbalance).lte(toBN(initialBalanceSecondUser)) || - toBN(updatedBridgeErc20TokenBalance).lte(toBN(bridgeErc20TokenBalance)) - ) { - retry() - } else { - assert( - toBN(secondUserbalance).eq(toBN(initialBalanceSecondUser).add(toBN(valueToTransfer))), - 'User balance should be increased by the half duplex token transfer' - ) - const updatedHDBalance = await halfDuplexToken.methods.balanceOf(COMMON_FOREIGN_BRIDGE_ADDRESS).call() - assert(toBN(updatedHDBalance).isZero(), 'Half duplex bridge balance should be zero') - assert( - toBN(updatedBridgeErc20TokenBalance).eq(toBN(bridgeErc20TokenBalance).add(toBN(valueToTransfer))), - 'Erc20 token balance should be correctly increased by the token swap' - ) - } - }) - }) - it('should not relay half duplex token transfer after Emergency Shutdown', async () => { - const originalBalanceOnHome = await homeWeb3.eth.getBalance(user.address) - const bridgeErc20TokenBalance = await erc20Token.methods.balanceOf(COMMON_FOREIGN_BRIDGE_ADDRESS).call() - const bridgeHalfDuplexBalance = await halfDuplexToken.methods.balanceOf(COMMON_FOREIGN_BRIDGE_ADDRESS).call() - - const block = await foreignWeb3.eth.getBlock('latest') - const saiTop = new foreignWeb3.eth.Contract(SAI_TOP, ercToNativeBridge.saiTop) - - // Trigger Emergency Shutdown - await saiTop.methods - .setCaged(block.timestamp) - .send({ - from: user.address, - gas: '1000000' - }) - .catch(e => { - console.error(e) - }) - - const valueToTransfer = foreignWeb3.utils.toWei('1', 'ether') - - await sleep(2000) - - // this transfer won't trigger a call to swap tokens - await halfDuplexToken.methods.transfer(COMMON_FOREIGN_BRIDGE_ADDRESS, valueToTransfer).send({ - from: user.address, - gas: '1000000' - }) - - // check that transfer and swap are not processed in the next blocks. - await promiseRetry(async (retry, number) => { - const balanceOnHome = await homeWeb3.eth.getBalance(user.address) - const currentBridgeErc20TokenBalance = await erc20Token.methods.balanceOf(COMMON_FOREIGN_BRIDGE_ADDRESS).call() - const currentBridgeHalfDuplexBalance = await halfDuplexToken.methods - .balanceOf(COMMON_FOREIGN_BRIDGE_ADDRESS) - .call() - - assert(toBN(balanceOnHome).eq(toBN(originalBalanceOnHome)), 'User balance should be the same') - assert( - toBN(currentBridgeHalfDuplexBalance).eq(toBN(bridgeHalfDuplexBalance).add(toBN(valueToTransfer))), - 'Half duplex balance should be the value of transfer' - ) - assert(toBN(currentBridgeErc20TokenBalance).eq(toBN(bridgeErc20TokenBalance)), 'erc20 balance should not change') - - // after several retries, the state is corrects - if (number < 4) { - retry() - } - }) - - // let's undo the Emergency Shutdown to check that the oracle is still working - await saiTop.methods.setCaged('0').send({ - from: user.address, - gas: '1000000' - }) - - const newValueToTransfer = foreignWeb3.utils.toWei('2', 'ether') - - await halfDuplexToken.methods.transfer(COMMON_FOREIGN_BRIDGE_ADDRESS, newValueToTransfer).send({ - from: user.address, - gas: '1000000' - }) - - await sleep(2000) - - await uniformRetry(async retry => { - const userBalance = await homeWeb3.eth.getBalance(user.address) - const updatedBridgeErc20TokenBalance = await erc20Token.methods.balanceOf(COMMON_FOREIGN_BRIDGE_ADDRESS).call() - - if ( - toBN(userBalance).lte(toBN(originalBalanceOnHome)) || - toBN(updatedBridgeErc20TokenBalance).lte(toBN(bridgeErc20TokenBalance)) - ) { - retry() - } else { - assert( - toBN(userBalance).eq(toBN(originalBalanceOnHome).add(toBN(newValueToTransfer))), - 'User balance should be increased by the half duplex token transfer' - ) - const updatedHDBalance = await halfDuplexToken.methods.balanceOf(COMMON_FOREIGN_BRIDGE_ADDRESS).call() - assert(toBN(updatedHDBalance).isZero(), 'Half duplex bridge balance should be zero') - assert( - toBN(updatedBridgeErc20TokenBalance).eq( - toBN(bridgeErc20TokenBalance) - .add(toBN(valueToTransfer)) - .add(toBN(newValueToTransfer)) - ), - 'Erc20 token balance should be correctly increased by the token swap' - ) - } - }) - }) it('should convert coins in home to tokens in foreign', async () => { const originalBalance = await erc20Token.methods.balanceOf(user.address).call()