2019-10-30 06:53:43 -07:00
|
|
|
const assert = require('assert')
|
|
|
|
|
|
|
|
const { waitPromise, delay } = require('./utils/wait')
|
2019-11-14 06:18:56 -08:00
|
|
|
const { getBepBalance, getBncFlags, getBncSequence } = require('./utils/bncController')
|
2019-10-30 06:53:43 -07:00
|
|
|
|
|
|
|
const { controller1, controller3 } = require('./utils/proxyController')
|
|
|
|
|
2019-11-14 12:29:06 -08:00
|
|
|
const { HOME_BRIDGE_ADDRESS } = process.env
|
|
|
|
|
2019-11-14 06:18:56 -08:00
|
|
|
module.exports = (getUsers, newValidator) => {
|
2019-10-30 06:53:43 -07:00
|
|
|
describe('add validator', function () {
|
|
|
|
let info
|
|
|
|
let initialInfo
|
|
|
|
let nextValidators
|
2019-11-14 06:18:56 -08:00
|
|
|
let user
|
|
|
|
let bncBridgeSequence
|
|
|
|
let bncBalance
|
2019-10-30 06:53:43 -07:00
|
|
|
|
|
|
|
before(async function () {
|
2019-11-01 11:43:25 -07:00
|
|
|
initialInfo = await controller1.getInfo()
|
2019-11-14 06:18:56 -08:00
|
|
|
// eslint-disable-next-line prefer-destructuring
|
|
|
|
user = getUsers()[0]
|
|
|
|
bncBalance = await user.getBepBalance()
|
2019-11-01 11:43:25 -07:00
|
|
|
info = initialInfo
|
2019-11-14 10:48:32 -08:00
|
|
|
bncBridgeSequence = await getBncSequence(info.foreignBridgeAddress)
|
|
|
|
nextValidators = [...info.validators, newValidator]
|
2019-10-30 06:53:43 -07:00
|
|
|
})
|
|
|
|
|
2019-11-14 02:30:23 -08:00
|
|
|
it('should start closing epoch process', async function () {
|
2019-10-30 06:53:43 -07:00
|
|
|
await controller1.voteStartVoting()
|
|
|
|
await delay(5000)
|
|
|
|
info = await controller1.getInfo()
|
|
|
|
assert.strictEqual(info.bridgeStatus, 'ready', 'Should not change state after one vote')
|
|
|
|
|
2019-11-14 12:29:06 -08:00
|
|
|
await user.approveErc(HOME_BRIDGE_ADDRESS, 5)
|
|
|
|
await user.exchangeErc(5)
|
|
|
|
|
2019-10-30 06:53:43 -07:00
|
|
|
await controller3.voteStartVoting()
|
2019-11-14 02:30:23 -08:00
|
|
|
info = await waitPromise(controller1.getInfo, (newInfo) => newInfo.bridgeStatus === 'closing_epoch')
|
|
|
|
assert.strictEqual(info.epoch, initialInfo.epoch, 'Current epoch is not set correctly')
|
|
|
|
assert.strictEqual(info.nextEpoch, initialInfo.epoch + 1, 'Next epoch is not set correctly')
|
2019-10-30 06:53:43 -07:00
|
|
|
assert.deepStrictEqual(info.nextValidators, initialInfo.validators, 'Next validators are not set correctly')
|
|
|
|
|
|
|
|
await controller3.voteStartVoting()
|
|
|
|
await delay(5000)
|
|
|
|
info = await controller1.getInfo()
|
2019-11-14 02:30:23 -08:00
|
|
|
assert.strictEqual(info.bridgeStatus, 'closing_epoch', 'Should not do anything after duplicate vote')
|
|
|
|
assert.strictEqual(info.epoch, initialInfo.epoch, 'Current epoch is not set correctly')
|
|
|
|
assert.strictEqual(info.nextEpoch, initialInfo.epoch + 1, 'Next epoch is not set correctly')
|
2019-10-30 06:53:43 -07:00
|
|
|
assert.deepStrictEqual(info.nextValidators, initialInfo.validators, 'Incorrect set of next validators after third vote')
|
|
|
|
})
|
|
|
|
|
2019-11-14 06:18:56 -08:00
|
|
|
it('should make forced sign', async function () {
|
|
|
|
this.timeout(300000)
|
|
|
|
await waitPromise(
|
|
|
|
() => getBncSequence(info.foreignBridgeAddress),
|
|
|
|
(sequence) => sequence === bncBridgeSequence + 1
|
|
|
|
)
|
|
|
|
const newBncBalance = await user.getBepBalance()
|
|
|
|
assert.strictEqual(newBncBalance, bncBalance + 5, `Balance of ${user.bncAddress} did not updated as expected`)
|
|
|
|
})
|
|
|
|
|
2019-11-14 02:30:23 -08:00
|
|
|
it('should finish close epoch process and start voting process', async function () {
|
|
|
|
this.timeout(120000)
|
|
|
|
info = await waitPromise(controller1.getInfo, (newInfo) => newInfo.bridgeStatus === 'voting')
|
2019-11-14 05:45:04 -08:00
|
|
|
const flags = await getBncFlags(initialInfo.foreignBridgeAddress)
|
|
|
|
assert.strictEqual(flags, 1, 'Foreign bridge flags are not set correctly')
|
2019-11-14 02:30:23 -08:00
|
|
|
})
|
|
|
|
|
2019-10-30 06:53:43 -07:00
|
|
|
it('should add validator', async function () {
|
|
|
|
await controller1.voteAddValidator(newValidator)
|
|
|
|
await delay(5000)
|
|
|
|
info = await controller1.getInfo()
|
|
|
|
assert.strictEqual(info.bridgeStatus, 'voting', 'Should not change state after one vote')
|
|
|
|
assert.deepStrictEqual(info.validators, initialInfo.validators, 'Validators are not set correctly')
|
|
|
|
assert.deepStrictEqual(info.nextValidators, initialInfo.validators, 'Next validators are not set correctly')
|
|
|
|
|
|
|
|
await controller3.voteAddValidator(newValidator)
|
2019-11-01 11:43:25 -07:00
|
|
|
info = await waitPromise(
|
|
|
|
controller1.getInfo,
|
|
|
|
(newInfo) => newInfo.nextValidators.length === nextValidators.length
|
|
|
|
)
|
2019-10-30 06:53:43 -07:00
|
|
|
assert.deepStrictEqual(info.validators, initialInfo.validators, 'Validators are not set correctly')
|
|
|
|
assert.deepStrictEqual(info.nextValidators, nextValidators, 'Next validators are not set correctly')
|
|
|
|
|
|
|
|
await controller3.voteAddValidator(newValidator)
|
|
|
|
await delay(5000)
|
|
|
|
info = await controller1.getInfo()
|
|
|
|
assert.strictEqual(info.bridgeStatus, 'voting', 'Should not do anything after duplicate vote')
|
2019-11-14 02:30:23 -08:00
|
|
|
assert.strictEqual(info.epoch, initialInfo.epoch, 'Current epoch is not set correctly')
|
|
|
|
assert.strictEqual(info.nextEpoch, initialInfo.epoch + 1, 'Next epoch is not set correctly')
|
|
|
|
assert.deepStrictEqual(info.validators, initialInfo.validators, 'Validators are not set correctly')
|
|
|
|
assert.deepStrictEqual(info.nextValidators, nextValidators, 'Incorrect set of next validators after third vote')
|
|
|
|
})
|
|
|
|
|
|
|
|
it('should change close epoch', async function () {
|
|
|
|
await controller1.voteChangeCloseEpoch(false)
|
|
|
|
await delay(5000)
|
|
|
|
info = await controller1.getInfo()
|
|
|
|
assert.strictEqual(info.bridgeStatus, 'voting', 'Should not change state after one vote')
|
|
|
|
assert.deepStrictEqual(info.validators, initialInfo.validators, 'Validators are not set correctly')
|
|
|
|
assert.deepStrictEqual(info.nextValidators, nextValidators, 'Next validators are not set correctly')
|
|
|
|
assert.strictEqual(info.closeEpoch, true, 'Current close epoch is not set correctly')
|
|
|
|
assert.strictEqual(info.nextCloseEpoch, true, 'Next close epoch is not set correctly')
|
|
|
|
|
|
|
|
await controller3.voteChangeCloseEpoch(false)
|
|
|
|
info = await waitPromise(
|
|
|
|
controller1.getInfo,
|
|
|
|
(newInfo) => !newInfo.nextCloseEpoch
|
|
|
|
)
|
|
|
|
assert.deepStrictEqual(info.validators, initialInfo.validators, 'Validators are not set correctly')
|
|
|
|
assert.deepStrictEqual(info.nextValidators, nextValidators, 'Next validators are not set correctly')
|
|
|
|
assert.strictEqual(info.closeEpoch, true, 'Current close epoch is not set correctly')
|
|
|
|
|
|
|
|
await controller3.voteChangeCloseEpoch(false)
|
|
|
|
await delay(5000)
|
|
|
|
info = await controller1.getInfo()
|
|
|
|
assert.strictEqual(info.bridgeStatus, 'voting', 'Should not do anything after duplicate vote')
|
|
|
|
assert.strictEqual(info.epoch, initialInfo.epoch, 'Current epoch is not set correctly')
|
|
|
|
assert.strictEqual(info.nextEpoch, initialInfo.epoch + 1, 'Next epoch is not set correctly')
|
2019-10-30 06:53:43 -07:00
|
|
|
assert.deepStrictEqual(info.validators, initialInfo.validators, 'Validators are not set correctly')
|
|
|
|
assert.deepStrictEqual(info.nextValidators, nextValidators, 'Incorrect set of next validators after third vote')
|
2019-11-14 02:30:23 -08:00
|
|
|
assert.strictEqual(info.closeEpoch, true, 'Current close epoch is not set correctly')
|
|
|
|
assert.strictEqual(info.nextCloseEpoch, false, 'Next close epoch is not set correctly')
|
2019-10-30 06:53:43 -07:00
|
|
|
})
|
|
|
|
|
|
|
|
it('should start keygen process', async function () {
|
|
|
|
await controller1.voteStartKeygen()
|
|
|
|
await delay(5000)
|
|
|
|
info = await controller1.getInfo()
|
|
|
|
assert.strictEqual(info.bridgeStatus, 'voting', 'Should not change state after one vote')
|
|
|
|
|
|
|
|
await controller3.voteStartKeygen()
|
2019-11-01 11:43:25 -07:00
|
|
|
info = await waitPromise(controller1.getInfo, (newInfo) => newInfo.bridgeStatus === 'keygen')
|
2019-10-30 06:53:43 -07:00
|
|
|
|
|
|
|
await controller3.voteStartKeygen()
|
|
|
|
await delay(5000)
|
|
|
|
info = await controller1.getInfo()
|
|
|
|
assert.strictEqual(info.bridgeStatus, 'keygen', 'Should not do anything after duplicate vote')
|
2019-11-14 02:30:23 -08:00
|
|
|
assert.strictEqual(info.epoch, initialInfo.epoch, 'Current epoch is not set correctly')
|
|
|
|
assert.strictEqual(info.nextEpoch, initialInfo.epoch + 1, 'Next epoch is not set correctly')
|
2019-10-30 06:53:43 -07:00
|
|
|
assert.deepStrictEqual(info.validators, initialInfo.validators, 'Validators are not set correctly')
|
|
|
|
assert.deepStrictEqual(info.nextValidators, nextValidators, 'Incorrect set of next validators after third vote')
|
|
|
|
})
|
|
|
|
|
|
|
|
it('should finish keygen process and start funds transfer', async function () {
|
|
|
|
this.timeout(120000)
|
2019-11-01 11:43:25 -07:00
|
|
|
info = await waitPromise(controller1.getInfo, (newInfo) => newInfo.bridgeStatus === 'funds_transfer')
|
2019-10-30 06:53:43 -07:00
|
|
|
})
|
|
|
|
|
|
|
|
it('should transfer all funds to new account and start new epoch', async function () {
|
|
|
|
this.timeout(300000)
|
2019-11-01 11:43:25 -07:00
|
|
|
info = await waitPromise(
|
|
|
|
controller1.getInfo,
|
|
|
|
(newInfo) => newInfo.epoch === initialInfo.epoch + 1
|
|
|
|
)
|
2019-10-30 06:53:43 -07:00
|
|
|
assert.deepStrictEqual(info.validators, nextValidators, 'Incorrect set of validators in new epoch')
|
|
|
|
assert.strictEqual(info.nextEpoch, initialInfo.epoch + 1, 'Incorrect next epoch')
|
|
|
|
assert.strictEqual(info.bridgeStatus, 'ready', 'Incorrect bridge state in new epoch')
|
|
|
|
await delay(5000)
|
2019-11-03 10:00:15 -08:00
|
|
|
const prevBalance = await getBepBalance(initialInfo.foreignBridgeAddress)
|
|
|
|
const newBalance = await getBepBalance(info.foreignBridgeAddress)
|
2019-10-30 06:53:43 -07:00
|
|
|
assert.strictEqual(prevBalance, 0, 'Did not transfer all funds')
|
2019-11-14 12:29:06 -08:00
|
|
|
assert.strictEqual(newBalance, initialInfo.foreignBalanceTokens - 5, 'Funds are lost somewhere')
|
2019-10-30 06:53:43 -07:00
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|