189 lines
6.2 KiB
JavaScript
189 lines
6.2 KiB
JavaScript
const Web3 = require('web3')
|
|
const assert = require('assert')
|
|
const { user, homeRPC, foreignRPC, amb, validator } = require('../../e2e-commons/constants.json')
|
|
const { uniformRetry } = require('../../e2e-commons/utils')
|
|
const { BOX_ABI, HOME_AMB_ABI, FOREIGN_AMB_ABI } = require('../../commons')
|
|
const { delay, setRequiredSignatures } = require('./utils')
|
|
|
|
const { toBN } = Web3.utils
|
|
|
|
const homeWeb3 = new Web3(new Web3.providers.HttpProvider(homeRPC.URL))
|
|
const foreignWeb3 = new Web3(new Web3.providers.HttpProvider(foreignRPC.URL))
|
|
|
|
const COMMON_HOME_BRIDGE_ADDRESS = amb.home
|
|
const COMMON_FOREIGN_BRIDGE_ADDRESS = amb.foreign
|
|
|
|
homeWeb3.eth.accounts.wallet.add(user.privateKey)
|
|
homeWeb3.eth.accounts.wallet.add(validator.privateKey)
|
|
foreignWeb3.eth.accounts.wallet.add(user.privateKey)
|
|
foreignWeb3.eth.accounts.wallet.add(validator.privateKey)
|
|
|
|
const homeBox = new homeWeb3.eth.Contract(BOX_ABI, amb.homeBox)
|
|
const blockHomeBox = new homeWeb3.eth.Contract(BOX_ABI, amb.blockedHomeBox)
|
|
const foreignBox = new foreignWeb3.eth.Contract(BOX_ABI, amb.foreignBox)
|
|
const homeBridge = new homeWeb3.eth.Contract(HOME_AMB_ABI, COMMON_HOME_BRIDGE_ADDRESS)
|
|
const foreignBridge = new foreignWeb3.eth.Contract(FOREIGN_AMB_ABI, COMMON_FOREIGN_BRIDGE_ADDRESS)
|
|
|
|
describe('arbitrary message bridging', () => {
|
|
let requiredSignatures = 1
|
|
before(async () => {
|
|
// Only 1 validator is used in ultimate tests
|
|
if (process.env.ULTIMATE !== 'true') {
|
|
requiredSignatures = 2
|
|
// Set 2 required signatures for home bridge
|
|
await setRequiredSignatures({
|
|
bridgeContract: homeBridge,
|
|
web3: homeWeb3,
|
|
requiredSignatures: 2,
|
|
options: {
|
|
from: validator.address,
|
|
gas: '4000000'
|
|
}
|
|
})
|
|
|
|
// Set 2 required signatures for foreign bridge
|
|
await setRequiredSignatures({
|
|
bridgeContract: foreignBridge,
|
|
web3: foreignWeb3,
|
|
requiredSignatures: 2,
|
|
options: {
|
|
from: validator.address,
|
|
gas: '4000000'
|
|
}
|
|
})
|
|
}
|
|
})
|
|
describe('Home to Foreign', () => {
|
|
describe('Subsidized Mode', () => {
|
|
it('should bridge message', async () => {
|
|
const newValue = 3
|
|
|
|
const initialValue = await foreignBox.methods.value().call()
|
|
assert(!toBN(initialValue).eq(toBN(newValue)), 'initial value should be different from new value')
|
|
|
|
await homeBox.methods
|
|
.setValueOnOtherNetwork(newValue, amb.home, amb.foreignBox)
|
|
.send({
|
|
from: user.address,
|
|
gas: '400000'
|
|
})
|
|
.catch(e => {
|
|
console.error(e)
|
|
})
|
|
|
|
// check that value changed and balance decreased
|
|
await uniformRetry(async retry => {
|
|
const value = await foreignBox.methods.value().call()
|
|
if (!toBN(value).eq(toBN(newValue))) {
|
|
retry()
|
|
}
|
|
})
|
|
})
|
|
|
|
it('should confirm but not relay message from blocked contract', async () => {
|
|
const newValue = 4
|
|
|
|
const initialValue = await foreignBox.methods.value().call()
|
|
assert(!toBN(initialValue).eq(toBN(newValue)), 'initial value should be different from new value')
|
|
|
|
const signatures = await homeBridge.getPastEvents('SignedForUserRequest', {
|
|
fromBlock: 0,
|
|
toBlock: 'latest'
|
|
})
|
|
|
|
await blockHomeBox.methods
|
|
.setValueOnOtherNetwork(newValue, amb.home, amb.foreignBox)
|
|
.send({
|
|
from: user.address,
|
|
gas: '400000'
|
|
})
|
|
.catch(e => {
|
|
console.error(e)
|
|
})
|
|
|
|
await delay(5000)
|
|
|
|
const newSignatures = await homeBridge.getPastEvents('SignedForUserRequest', {
|
|
fromBlock: 0,
|
|
toBlock: 'latest'
|
|
})
|
|
|
|
assert(
|
|
newSignatures.length === signatures.length + requiredSignatures,
|
|
`Incorrect amount of signatures submitted, got ${newSignatures.length}, expected ${signatures.length +
|
|
requiredSignatures}`
|
|
)
|
|
|
|
const value = await foreignBox.methods.value().call()
|
|
assert(!toBN(value).eq(toBN(newValue)), 'Message should not be relayed by oracle automatically')
|
|
})
|
|
|
|
it('should confirm but not relay message from manual lane', async () => {
|
|
const newValue = 5
|
|
|
|
const initialValue = await foreignBox.methods.value().call()
|
|
assert(!toBN(initialValue).eq(toBN(newValue)), 'initial value should be different from new value')
|
|
|
|
const signatures = await homeBridge.getPastEvents('SignedForUserRequest', {
|
|
fromBlock: 0,
|
|
toBlock: 'latest'
|
|
})
|
|
|
|
await homeBox.methods
|
|
.setValueOnOtherNetworkUsingManualLane(newValue, amb.home, amb.foreignBox)
|
|
.send({
|
|
from: user.address,
|
|
gas: '400000'
|
|
})
|
|
.catch(e => {
|
|
console.error(e)
|
|
})
|
|
|
|
await delay(5000)
|
|
|
|
const newSignatures = await homeBridge.getPastEvents('SignedForUserRequest', {
|
|
fromBlock: 0,
|
|
toBlock: 'latest'
|
|
})
|
|
|
|
assert(
|
|
newSignatures.length === signatures.length + requiredSignatures,
|
|
`Incorrect amount of signatures submitted, got ${newSignatures.length}, expected ${signatures.length +
|
|
requiredSignatures}`
|
|
)
|
|
|
|
const value = await foreignBox.methods.value().call()
|
|
assert(!toBN(value).eq(toBN(newValue)), 'Message should not be relayed by oracle automatically')
|
|
})
|
|
})
|
|
})
|
|
describe('Foreign to Home', () => {
|
|
describe('Subsidized Mode', () => {
|
|
it('should bridge message', async () => {
|
|
const newValue = 7
|
|
|
|
const initialValue = await homeBox.methods.value().call()
|
|
assert(!toBN(initialValue).eq(toBN(newValue)), 'initial value should be different from new value')
|
|
|
|
await foreignBox.methods
|
|
.setValueOnOtherNetwork(newValue, amb.foreign, amb.homeBox)
|
|
.send({
|
|
from: user.address,
|
|
gas: '400000'
|
|
})
|
|
.catch(e => {
|
|
console.error(e)
|
|
})
|
|
|
|
// check that value changed and balance decreased
|
|
await uniformRetry(async retry => {
|
|
const value = await homeBox.methods.value().call()
|
|
if (!toBN(value).eq(toBN(newValue))) {
|
|
retry()
|
|
}
|
|
})
|
|
})
|
|
})
|
|
})
|
|
})
|