tornado-pool-factory/src/generateAddresses.js

115 lines
3.7 KiB
JavaScript
Raw Normal View History

2022-02-23 17:27:44 +01:00
const { ethers } = require('hardhat')
const defaultConfig = require('../config')
2022-07-26 19:07:04 +02:00
async function upgradableContract({ contractName, implConstructorArgs, proxyConstructorArgs, salt }) {
const Implementation = await ethers.getContractFactory(contractName)
const implementationBytecode =
Implementation.bytecode + Implementation.interface.encodeDeploy(implConstructorArgs).slice(2)
const implementationAddress = ethers.utils.getCreate2Address(
defaultConfig.singletonFactory,
salt,
ethers.utils.keccak256(implementationBytecode),
)
const AdminUpgradeableProxy = await ethers.getContractFactory('AdminUpgradeableProxy')
const proxyConst = [implementationAddress, ...proxyConstructorArgs]
const proxyBytecode =
AdminUpgradeableProxy.bytecode + AdminUpgradeableProxy.interface.encodeDeploy(proxyConst).slice(2)
const proxyAddress = ethers.utils.getCreate2Address(
defaultConfig.singletonFactory,
salt,
ethers.utils.keccak256(proxyBytecode),
)
return {
implementation: {
address: implementationAddress,
bytecode: implementationBytecode,
args: implConstructorArgs,
},
proxy: { address: proxyAddress, bytecode: proxyBytecode, args: proxyConst },
isProxy: true,
}
}
2022-02-23 17:27:44 +01:00
async function generate(config = defaultConfig) {
2022-07-28 12:26:39 +02:00
// sidechain factory contract -------------------------------------
const SidechainFactory = await ethers.getContractFactory('SidechainInstanceFactory')
const SidechainFactoryInitData = SidechainFactory.interface.encodeFunctionData('initialize', [
2022-07-26 19:07:04 +02:00
config.verifier,
config.hasher,
config.merkleTreeHeight,
config.admin,
])
2022-07-28 12:26:39 +02:00
const sidechainFactory = await upgradableContract({
contractName: 'SidechainInstanceFactory',
2022-07-26 19:07:04 +02:00
implConstructorArgs: [],
2022-07-28 12:26:39 +02:00
proxyConstructorArgs: [config.admin, SidechainFactoryInitData],
2022-07-26 19:07:04 +02:00
salt: config.salt,
})
2022-07-26 19:07:04 +02:00
// factory with registry contract ---------------------------------
2022-07-28 12:26:39 +02:00
const Factory = await ethers.getContractFactory('InstanceFactory')
const FactoryInitData = Factory.interface.encodeFunctionData('initialize', [
config.verifier,
config.hasher,
config.merkleTreeHeight,
config.governance,
])
2022-02-23 17:27:44 +01:00
2022-07-28 12:26:39 +02:00
const factory = await upgradableContract({
contractName: 'InstanceFactory',
implConstructorArgs: [],
proxyConstructorArgs: [config.governance, FactoryInitData],
salt: config.salt,
})
const ProposalCreator = await ethers.getContractFactory('InstanceProposalCreator')
const ProposalCreatorInitData = ProposalCreator.interface.encodeFunctionData('initialize', [
config.TWAPSlotsMin,
config.creationFee,
])
const proposalCreator = await upgradableContract({
contractName: 'InstanceProposalCreator',
2022-07-26 19:07:04 +02:00
implConstructorArgs: [
config.governance,
2022-07-28 12:26:39 +02:00
factory.proxy.address,
2022-07-26 19:07:04 +02:00
config.instanceRegistry,
config.TORN,
config.UniswapV3Factory,
config.WETH,
],
2022-07-28 12:26:39 +02:00
proxyConstructorArgs: [config.governance, ProposalCreatorInitData],
2022-07-26 19:07:04 +02:00
salt: config.salt,
})
2022-02-23 17:27:44 +01:00
const result = {
2022-07-28 12:26:39 +02:00
sidechainFactory,
factory,
proposalCreator,
2022-02-23 17:27:44 +01:00
}
return result
}
async function generateWithLog() {
const contracts = await generate()
2022-07-28 12:26:39 +02:00
console.log('SidechainInstanceFactory contract: ', contracts.sidechainFactory.implementation.address)
console.log('SidechainInstanceFactory proxy contract: ', contracts.sidechainFactory.proxy.address)
console.log('Instance factory contract: ', contracts.factory.implementation.address)
console.log('Instance factory proxy contract: ', contracts.factory.proxy.address)
console.log('Proposal creator contract: ', contracts.proposalCreator.implementation.address)
console.log('Proposal creator proxy contract: ', contracts.proposalCreator.proxy.address)
2022-02-23 17:27:44 +01:00
return contracts
}
module.exports = {
generate,
generateWithLog,
}