@hyperlane-xyz/core
Version:
Core solidity contracts for Hyperlane
118 lines (97 loc) • 3.97 kB
text/typescript
/* Imports: External */
import { hexStringEquals, awaitCondition } from '@eth-optimism/core-utils'
import { DeployFunction } from 'hardhat-deploy/dist/types'
/* Imports: Internal */
import { getContractFromArtifact, isHardhatNode } from '../src/deploy-utils'
import { names } from '../src/address-names'
const deployFn: DeployFunction = async (hre) => {
const { deployer } = await hre.getNamedAccounts()
// We use this task to print out the list of addresses that will be updated by the
// AddressDictator contract. The idea here is that the owner of the AddressManager will then
// review these names and addresses before transferring ownership to the AddressDictator.
// Once ownership has been transferred to the AddressDictator, we execute `setAddresses` which
// triggers a series of setAddress calls on the AddressManager and then transfers ownership back
// to the original owner.
// First get relevant contract references.
const AddressDictator = await getContractFromArtifact(
hre,
names.unmanaged.AddressDictator,
{
signerOrProvider: deployer,
}
)
const Lib_AddressManager = await getContractFromArtifact(
hre,
names.unmanaged.Lib_AddressManager
)
const namedAddresses: Array<{ name: string; addr: string }> =
await AddressDictator.getNamedAddresses()
const finalOwner = await AddressDictator.finalOwner()
const currentOwner = await Lib_AddressManager.owner()
console.log(`
The AddressDictator contract (glory to Arstotzka) has been deployed.
FOLLOW THESE INSTRUCTIONS CAREFULLY!
(1) Review the Contract Name / Contract Address pairs below and confirm that they match
the addresses found in the contract artifacts of your current deployment.
${namedAddresses
.map((namedAddress) => {
const padding = ' '.repeat(40 - namedAddress.name.length)
return `
${namedAddress.name}${padding} ${namedAddress.addr}
`
})
.join('\n')}
(2) Review the CURRENT and FINAL AddressManager owners and verify that these are the expected values:
Current AddressManager owner: (${currentOwner})
Final AddressManager owner: (${finalOwner})
[${
currentOwner === finalOwner
? 'THESE ARE THE SAME ADDRESSES'
: 'THESE ARE >>>NOT<<< THE SAME ADDRESSES'
}]
(3) Transfer ownership of the AddressManager located at (${
Lib_AddressManager.address
})
to the AddressDictator contract located at the following address:
TRANSFER OWNERSHIP TO THE FOLLOWING ADDRESS ONLY:
>>>>> (${AddressDictator.address}) <<<<<
(4) Wait for the deploy process to continue.
`)
// Check if if we're on the hardhat chain ID. This will only happen in CI. If this is the case, we
// can skip directly to transferring ownership over to the ChugSplashDictator contract.
if (
(await isHardhatNode(hre)) ||
process.env.AUTOMATICALLY_TRANSFER_OWNERSHIP === 'true'
) {
const owner = await hre.ethers.getSigner(currentOwner)
await Lib_AddressManager.connect(owner).transferOwnership(
AddressDictator.address
)
}
// Wait for ownership to be transferred to the AddressDictator contract.
await awaitCondition(
async () => {
return hexStringEquals(
await Lib_AddressManager.owner(),
AddressDictator.address
)
},
// Try every 30 seconds for 500 minutes.
30000,
1000
)
// Set the addresses!
console.log('Ownership successfully transferred. Invoking setAddresses...')
await AddressDictator.setAddresses()
// Make sure ownership has been correctly sent back to the original owner.
console.log('Verifying final ownership of Lib_AddressManager...')
await awaitCondition(
async () => {
return hexStringEquals(await Lib_AddressManager.owner(), finalOwner)
},
500,
1000
)
}
deployFn.tags = ['set-addresses', 'upgrade']
export default deployFn