1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/* Imports: External */
import { DeployFunction } from 'hardhat-deploy/dist/types'
import { hexStringEquals } from '@eth-optimism/core-utils'
/* Imports: Internal */
import {
deployAndVerifyAndThen,
getContractFromArtifact,
} from '../src/hardhat-deploy-ethers'
import { names } from '../src/address-names'
import { predeploys } from '../src/predeploys'
const deployFn: DeployFunction = async (hre) => {
const Lib_AddressManager = await getContractFromArtifact(
hre,
names.unmanaged.Lib_AddressManager
)
let namesAndAddresses: {
name: string
address: string
}[] = await Promise.all(
Object.values(names.managed.contracts).map(async (name) => {
return {
name,
address: (await getContractFromArtifact(hre, name)).address,
}
})
)
// Add non-deployed addresses to the Address Dictator arguments.
namesAndAddresses = [
...namesAndAddresses,
// L2CrossDomainMessenger is the address of the predeploy on L2. We can refactor off-chain
// services such that we can remove the need to set this address, but for now it's easier
// to simply keep setting the address.
{
name: 'L2CrossDomainMessenger',
address: predeploys.L2CrossDomainMessenger,
},
// OVM_Sequencer is the address allowed to submit "Sequencer" blocks to the
// CanonicalTransactionChain.
{
name: names.managed.accounts.OVM_Sequencer,
address: (hre as any).deployConfig.ovmSequencerAddress,
},
// OVM_Proposer is the address allowed to submit state roots (transaction results) to the
// StateCommitmentChain.
{
name: names.managed.accounts.OVM_Proposer,
address: (hre as any).deployConfig.ovmProposerAddress,
},
]
// Filter out all addresses that will not change, so that the log statement is maximally
// verifiable and readable.
const existingAddresses = {}
for (const pair of namesAndAddresses) {
existingAddresses[pair.name] = await Lib_AddressManager.getAddress(
pair.name
)
}
namesAndAddresses = namesAndAddresses.filter(({ name, address }) => {
return !hexStringEquals(existingAddresses[name], address)
})
await deployAndVerifyAndThen({
hre,
name: names.unmanaged.AddressDictator,
args: [
Lib_AddressManager.address,
(hre as any).deployConfig.ovmAddressManagerOwner,
namesAndAddresses.map((pair) => {
return pair.name
}),
namesAndAddresses.map((pair) => {
return pair.address
}),
],
})
}
deployFn.tags = ['upgrade', 'AddressDictator']
export default deployFn