119 lines
3.7 KiB
JavaScript
119 lines
3.7 KiB
JavaScript
const { BRIDGE_VALIDATORS_ABI, HOME_AMB_ABI } = require('commons')
|
|
|
|
const path = require('path')
|
|
require('dotenv').config()
|
|
const Web3 = require('web3')
|
|
|
|
const fs = require('fs')
|
|
|
|
const {
|
|
COMMON_HOME_RPC_URL,
|
|
COMMON_HOME_BRIDGE_ADDRESS,
|
|
COMMON_FOREIGN_RPC_URL,
|
|
COMMON_FOREIGN_BRIDGE_ADDRESS
|
|
} = process.env
|
|
|
|
const generateSnapshot = async (side, url, bridgeAddress) => {
|
|
const snapshotPath = `../src/snapshots/${side}.json`
|
|
const snapshotFullPath = path.join(__dirname, snapshotPath)
|
|
const snapshot = {}
|
|
|
|
const web3 = new Web3(new Web3.providers.HttpProvider(url))
|
|
|
|
const currentBlockNumber = await web3.eth.getBlockNumber()
|
|
snapshot.snapshotBlockNumber = currentBlockNumber
|
|
|
|
// Save chainId
|
|
snapshot.chainId = await web3.eth.getChainId()
|
|
|
|
const bridgeContract = new web3.eth.Contract(HOME_AMB_ABI, bridgeAddress)
|
|
|
|
// Save RequiredBlockConfirmationChanged events
|
|
let requiredBlockConfirmationChangedEvents = await bridgeContract.getPastEvents('RequiredBlockConfirmationChanged', {
|
|
fromBlock: 0,
|
|
toBlock: currentBlockNumber
|
|
})
|
|
|
|
// In case RequiredBlockConfirmationChanged was not emitted during initialization in early versions of AMB
|
|
// manually generate an event for this. Example Sokol - Kovan bridge
|
|
if (requiredBlockConfirmationChangedEvents.length === 0) {
|
|
const deployedAtBlock = await bridgeContract.methods.deployedAtBlock().call()
|
|
const blockConfirmations = await bridgeContract.methods.requiredBlockConfirmations().call()
|
|
|
|
requiredBlockConfirmationChangedEvents.push({
|
|
blockNumber: parseInt(deployedAtBlock),
|
|
returnValues: {
|
|
requiredBlockConfirmations: blockConfirmations
|
|
}
|
|
})
|
|
}
|
|
|
|
snapshot.RequiredBlockConfirmationChanged = requiredBlockConfirmationChangedEvents.map(e => ({
|
|
blockNumber: e.blockNumber,
|
|
returnValues: {
|
|
requiredBlockConfirmations: e.returnValues.requiredBlockConfirmations
|
|
}
|
|
}))
|
|
|
|
const validatorAddress = await bridgeContract.methods.validatorContract().call()
|
|
const validatorContract = new web3.eth.Contract(BRIDGE_VALIDATORS_ABI, validatorAddress)
|
|
|
|
// Save RequiredSignaturesChanged events
|
|
const RequiredSignaturesChangedEvents = await validatorContract.getPastEvents('RequiredSignaturesChanged', {
|
|
fromBlock: 0,
|
|
toBlock: currentBlockNumber
|
|
})
|
|
snapshot.RequiredSignaturesChanged = RequiredSignaturesChangedEvents.map(e => ({
|
|
blockNumber: e.blockNumber,
|
|
returnValues: {
|
|
requiredSignatures: e.returnValues.requiredSignatures
|
|
}
|
|
}))
|
|
|
|
// Save ValidatorAdded events
|
|
const validatorAddedEvents = await validatorContract.getPastEvents('ValidatorAdded', {
|
|
fromBlock: 0,
|
|
toBlock: currentBlockNumber
|
|
})
|
|
|
|
snapshot.ValidatorAdded = validatorAddedEvents.map(e => ({
|
|
blockNumber: e.blockNumber,
|
|
returnValues: {
|
|
validator: e.returnValues.validator
|
|
},
|
|
event: 'ValidatorAdded'
|
|
}))
|
|
|
|
// Save ValidatorRemoved events
|
|
const validatorRemovedEvents = await validatorContract.getPastEvents('ValidatorRemoved', {
|
|
fromBlock: 0,
|
|
toBlock: currentBlockNumber
|
|
})
|
|
|
|
snapshot.ValidatorRemoved = validatorRemovedEvents.map(e => ({
|
|
blockNumber: e.blockNumber,
|
|
returnValues: {
|
|
validator: e.returnValues.validator
|
|
},
|
|
event: 'ValidatorRemoved'
|
|
}))
|
|
|
|
// Write snapshot
|
|
fs.writeFileSync(snapshotFullPath, JSON.stringify(snapshot, null, 2))
|
|
}
|
|
|
|
const main = async () => {
|
|
await Promise.all([
|
|
generateSnapshot('home', COMMON_HOME_RPC_URL, COMMON_HOME_BRIDGE_ADDRESS),
|
|
generateSnapshot('foreign', COMMON_FOREIGN_RPC_URL, COMMON_FOREIGN_BRIDGE_ADDRESS)
|
|
])
|
|
}
|
|
|
|
main()
|
|
.then(() => process.exit(0))
|
|
.catch(error => {
|
|
console.log('Error while creating snapshots')
|
|
console.error(error)
|
|
process.exit(0)
|
|
})
|