Deploy PoA Manager
Deploy the PoA Manager contract with your multi-sig wallet as the owner
Now that you have your Safe/Ash wallet set up, it's time to deploy the PoA Manager contract. This contract will act as the intermediary between your multi-sig and the Validator Manager.
What the PoA Manager Does
The PoA Manager is initialized with two key addresses:
- Owner: Your Safe/Ash multi-sig wallet address
- Validator Manager: if your Validator Manager is behind a proxy (the default here), its proxy address (e.g.
0xfacade...) — not the implementation you deployed earlier. (Deployed without a proxy? Use the Validator Manager address directly.)
constructor(address _owner, address _validatorManager) {
_transferOwnership(_owner);
validatorManager = IValidatorManager(_validatorManager);
}If your Validator Manager is behind a proxy, pass the proxy address (e.g. 0xfacade...) as _validatorManager, never the implementation. The PoA Manager stores this address and forwards every validator call to it; pointed at the stateless implementation, those calls revert with OwnableUnauthorizedAccount once the multi-sig tries to use them (a Safe surfaces this as GS013). See Proxy vs. Implementation. The Console tool below resolves the proxy automatically; this bites manual/scripted deployments.
Deployment Architecture
After this deployment, you'll have:
Note: After deployment, the PoA Manager will be owned by your Safe wallet, but it won't own the Validator Manager yet. That ownership transfer happens in the next step.
Deploy the Contract
Use the tool below to deploy your PoA Manager. You'll need:
- Safe Address: Your Ash/Safe wallet address from the previous section
- Subnet ID: To identify your L1's Validator Manager
The tool will:
- Automatically detect your Validator Manager address from the selected subnet
- Deploy the PoA Manager with your Safe as the owner
- Verify the deployment
Checking requirements...
Verification Checklist
After deployment, verify:
- ✅ Contract Deployed: You have a valid PoA Manager address
- ✅ Owner Set: The
owner()function returns your Safe address - ✅ Validator Manager Linked: The
validatorManager()function returns the proxy address (0xfacade...), not the implementation
Current Ownership State
At this point, the ownership chain looks like this:
Safe Wallet → owns → PoA Manager
Your EOA → owns → Validator Manager (still!)We need one more step to complete the chain: transferring Validator Manager ownership to the PoA Manager.
Next Steps
In the next section, you'll:
- Transfer Validator Manager ownership to the PoA Manager
- Complete the multi-sig governance setup
This will establish the full ownership chain:
Safe Wallet → owns → PoA Manager → owns → Validator ManagerIs this guide helpful?


