| 276 | } |
| 277 | |
| 278 | const queryValidatorManagerConfig = async ( |
| 279 | hre: HardhatRuntimeEnvironment, |
| 280 | client: PublicClient, |
| 281 | validatorRegisterers?: Array<Address>, |
| 282 | configValidators?: Array<{ controllers?: Array<{ address: Address }> }>, |
| 283 | ): Promise<GenesisConfig['ValidatorManager']> => { |
| 284 | const abiValidatorRegistry = hre.artifacts.readArtifactSync('ValidatorRegistry').abi |
| 285 | const abiPermissionedValidatorManager = hre.artifacts.readArtifactSync('PermissionedValidatorManager').abi |
| 286 | const abiAdminProxy = hre.artifacts.readArtifactSync('AdminUpgradeableProxy').abi |
| 287 | |
| 288 | const validatorRegistry = getContract({ |
| 289 | abi: [...abiValidatorRegistry, ...abiAdminProxy], |
| 290 | address: validatorRegistryAddress, |
| 291 | client, |
| 292 | }).read |
| 293 | const poaManager = getContract({ |
| 294 | abi: [...abiPermissionedValidatorManager, ...abiAdminProxy], |
| 295 | address: permissionedManagerAddress, |
| 296 | client, |
| 297 | }).read |
| 298 | |
| 299 | const [vrAdmin, vrImpl, nextRegistrationId, admin, impl, owner, pauser, ...isValidatorRegisterer] = await Promise.all( |
| 300 | [ |
| 301 | validatorRegistry.admin(), |
| 302 | validatorRegistry.implementation(), |
| 303 | validatorRegistry.getNextRegistrationId(), |
| 304 | poaManager.admin(), |
| 305 | poaManager.implementation(), |
| 306 | poaManager.owner(), |
| 307 | poaManager.pauser(), |
| 308 | ...(validatorRegisterers ?? []).map((x) => poaManager.isValidatorRegisterer([x])), |
| 309 | ], |
| 310 | ) |
| 311 | |
| 312 | const onChainValidators = await Promise.all( |
| 313 | Array(Number(nextRegistrationId - 1n)) |
| 314 | .fill(0) |
| 315 | .map((_, i) => validatorRegistry.getValidator([BigInt(i) + 1n])), |
| 316 | ) |
| 317 | |
| 318 | // For each validator, query the on-chain state for the controller addresses |
| 319 | // that config says should manage it. A controller is considered to belong to |
| 320 | // validator i if its on-chain registrationId equals i+1 — mismatches produce |
| 321 | // a missing entry here, which the comparator flags as a diff. |
| 322 | const validators = await Promise.all( |
| 323 | onChainValidators.map(async (v, i) => { |
| 324 | const expectedRegistrationId = BigInt(i + 1) |
| 325 | const configControllers = configValidators?.[i]?.controllers ?? [] |
| 326 | const controllers = await Promise.all( |
| 327 | configControllers.map(async (c) => { |
| 328 | const [registrationId, votingPowerLimit] = await Promise.all([ |
| 329 | poaManager.getRegistrationId([c.address]), |
| 330 | poaManager.getVotingPowerLimit([c.address]), |
| 331 | ]) |
| 332 | return registrationId === expectedRegistrationId ? { address: c.address, votingPowerLimit } : null |
| 333 | }), |
| 334 | ) |
| 335 | return { |