Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 16 additions & 6 deletions script/DeployHub.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ pragma solidity ^0.8.20;

import "forge-std/Script.sol";
import "forge-std/console.sol";
import "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol";
import {PoaManager} from "../src/PoaManager.sol";
import {PoaManagerHub} from "../src/crosschain/PoaManagerHub.sol";

/**
* @title DeployHub
* @notice Deploys PoaManagerHub on the home chain and transfers PoaManager ownership to it.
* @notice Deploys PoaManagerHub on the home chain via BeaconProxy and transfers
* PoaManager ownership to it.
* @dev Requires existing infrastructure (PoaManager) and a Hyperlane Mailbox address.
*
* Usage:
Expand All @@ -21,20 +23,28 @@ contract DeployHub is Script {
uint256 deployerKey = vm.envUint("PRIVATE_KEY");
address poaManagerAddr = vm.envAddress("POAMANAGER");
address mailboxAddr = vm.envAddress("MAILBOX");
address deployer = vm.addr(deployerKey);

console.log("\n=== Deploying PoaManagerHub ===");
console.log("Deployer:", vm.addr(deployerKey));
console.log("Deployer:", deployer);
console.log("PoaManager:", poaManagerAddr);
console.log("Mailbox:", mailboxAddr);

vm.startBroadcast(deployerKey);

// 1. Deploy Hub
PoaManagerHub hub = new PoaManagerHub(poaManagerAddr, mailboxAddr);
// 1. Deploy PoaManagerHub implementation and register type
PoaManager pm = PoaManager(poaManagerAddr);
address hubImpl = address(new PoaManagerHub());
pm.addContractType("PoaManagerHub", hubImpl);

// 2. Deploy PoaManagerHub behind BeaconProxy
address hubBeacon = pm.getBeaconById(keccak256("PoaManagerHub"));
bytes memory hubInit = abi.encodeCall(PoaManagerHub.initialize, (deployer, poaManagerAddr, mailboxAddr));
PoaManagerHub hub = PoaManagerHub(payable(address(new BeaconProxy(hubBeacon, hubInit))));
console.log("PoaManagerHub deployed:", address(hub));

// 2. Transfer PoaManager ownership to Hub
PoaManager(poaManagerAddr).transferOwnership(address(hub));
// 3. Transfer PoaManager ownership to Hub
pm.transferOwnership(address(hub));
console.log("PoaManager ownership transferred to Hub");

vm.stopBroadcast();
Expand Down
25 changes: 25 additions & 0 deletions script/DeployInfrastructure.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ import {OrgRegistry} from "../src/OrgRegistry.sol";
import {OrgDeployer} from "../src/OrgDeployer.sol";
import {PaymasterHub} from "../src/PaymasterHub.sol";

// Cross-chain (optional)
import {NameRegistryHub} from "../src/crosschain/NameRegistryHub.sol";

// Factories
import {GovernanceFactory} from "../src/factories/GovernanceFactory.sol";
import {AccessFactory} from "../src/factories/AccessFactory.sol";
Expand Down Expand Up @@ -72,6 +75,7 @@ contract DeployInfrastructure is Script {
address public implRegistry;
address public paymasterHub;
address public universalPasskeyFactory;
address public nameRegistryHub;

// Factories
address public governanceFactory;
Expand Down Expand Up @@ -263,6 +267,24 @@ contract DeployInfrastructure is Script {
orgDeployer, orgRegistry, implRegistry, paymasterHub, globalAccountRegistry, universalPasskeyFactory
);
console.log("\n--- Infrastructure Registered (for subgraph indexing) ---");

// Optional: Deploy NameRegistryHub if MAILBOX is provided
address mailboxAddr = vm.envOr("MAILBOX", address(0));
if (mailboxAddr != address(0)) {
address nameHubImpl = address(new NameRegistryHub());
pm.addContractType("NameRegistryHub", nameHubImpl);
address nameHubBeacon = pm.getBeaconById(keccak256("NameRegistryHub"));
bytes memory nameHubInit =
abi.encodeCall(NameRegistryHub.initialize, (deployer, globalAccountRegistry, mailboxAddr));
NameRegistryHub hub = NameRegistryHub(payable(address(new BeaconProxy(nameHubBeacon, nameHubInit))));
UniversalAccountRegistry(globalAccountRegistry).setNameRegistryHub(address(hub));
nameRegistryHub = address(hub);
console.log("\n--- Cross-Chain Name Registry ---");
console.log("NameRegistryHub:", nameRegistryHub);
console.log("GlobalAccountRegistry wired to NameRegistryHub");
} else {
console.log("\n--- Cross-Chain Name Registry: SKIPPED (no MAILBOX env var) ---");
}
}

function _outputAddresses() internal {
Expand Down Expand Up @@ -352,6 +374,9 @@ contract DeployInfrastructure is Script {
'",\n',
' "passkeyAccountFactoryBeacon": "',
vm.toString(pm.getBeaconById(keccak256("PasskeyAccountFactory"))),
'",\n',
' "nameRegistryHub": "',
vm.toString(nameRegistryHub),
'"\n',
"}\n"
);
Expand Down
62 changes: 62 additions & 0 deletions script/DeployNameRegistryHub.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "forge-std/Script.sol";
import "forge-std/console.sol";
import "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol";
import {NameRegistryHub} from "../src/crosschain/NameRegistryHub.sol";
import {UniversalAccountRegistry} from "../src/UniversalAccountRegistry.sol";
import {PoaManager} from "../src/PoaManager.sol";

/**
* @title DeployNameRegistryHub
* @notice Deploys NameRegistryHub on Arbitrum (home chain) via BeaconProxy and wires
* it to the existing UniversalAccountRegistry.
*
* Usage:
* UAR=0x... MAILBOX=0x... POA_MANAGER=0x... \
* forge script script/DeployNameRegistryHub.s.sol:DeployNameRegistryHub \
* --rpc-url $RPC_URL --broadcast --verify
*/
contract DeployNameRegistryHub is Script {
function run() public {
uint256 deployerKey = vm.envUint("PRIVATE_KEY");
address uarAddr = vm.envAddress("UAR");
address mailboxAddr = vm.envAddress("MAILBOX");
address poaManagerAddr = vm.envAddress("POA_MANAGER");
address deployer = vm.addr(deployerKey);

console.log("\n=== Deploying NameRegistryHub ===");
console.log("Deployer:", deployer);
console.log("UAR:", uarAddr);
console.log("Mailbox:", mailboxAddr);
console.log("PoaManager:", poaManagerAddr);

vm.startBroadcast(deployerKey);

// 1. Deploy NameRegistryHub implementation and register type
PoaManager pm = PoaManager(poaManagerAddr);
address nameHubImpl = address(new NameRegistryHub());
pm.addContractType("NameRegistryHub", nameHubImpl);

// 2. Deploy NameRegistryHub behind BeaconProxy
address nameHubBeacon = pm.getBeaconById(keccak256("NameRegistryHub"));
bytes memory nameHubInit = abi.encodeCall(NameRegistryHub.initialize, (deployer, uarAddr, mailboxAddr));
NameRegistryHub hub = NameRegistryHub(payable(address(new BeaconProxy(nameHubBeacon, nameHubInit))));
console.log("NameRegistryHub deployed:", address(hub));

// 3. Wire UAR to hub (enables global uniqueness checks)
UniversalAccountRegistry(uarAddr).setNameRegistryHub(address(hub));
console.log("UAR.nameRegistryHub set to hub");

vm.stopBroadcast();

console.log("\n=== NameRegistryHub Deployment Complete ===");
console.log("Hub address:", address(hub));
console.log("\nNext steps:");
console.log(" 1. Fund hub with ETH for return-trip Hyperlane fees");
console.log(" 2. Set return fee: hub.setReturnFee(fee)");
console.log(" 3. Deploy RegistryRelay on satellite chains");
console.log(" 4. Register relays: hub.registerSatellite(domain, relayAddr)");
}
}
57 changes: 57 additions & 0 deletions script/DeployRegistryRelay.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "forge-std/Script.sol";
import "forge-std/console.sol";
import "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol";
import {RegistryRelay} from "../src/crosschain/RegistryRelay.sol";
import {PoaManager} from "../src/PoaManager.sol";

/**
* @title DeployRegistryRelay
* @notice Deploys a RegistryRelay on a satellite chain via BeaconProxy, pointed at
* the NameRegistryHub on Arbitrum.
*
* Usage:
* MAILBOX=0x... HUB_DOMAIN=42161 HUB_ADDRESS=0x... POA_MANAGER=0x... \
* forge script script/DeployRegistryRelay.s.sol:DeployRegistryRelay \
* --rpc-url $RPC_URL --broadcast --verify
*/
contract DeployRegistryRelay is Script {
function run() public {
uint256 deployerKey = vm.envUint("PRIVATE_KEY");
address mailboxAddr = vm.envAddress("MAILBOX");
uint32 hubDomain = uint32(vm.envUint("HUB_DOMAIN"));
address hubAddress = vm.envAddress("HUB_ADDRESS");
address poaManagerAddr = vm.envAddress("POA_MANAGER");
address deployer = vm.addr(deployerKey);

console.log("\n=== Deploying RegistryRelay ===");
console.log("Deployer:", deployer);
console.log("Mailbox:", mailboxAddr);
console.log("Hub domain:", hubDomain);
console.log("Hub address:", hubAddress);
console.log("PoaManager:", poaManagerAddr);

vm.startBroadcast(deployerKey);

// 1. Deploy RegistryRelay implementation and register type
PoaManager pm = PoaManager(poaManagerAddr);
address relayImpl = address(new RegistryRelay());
pm.addContractType("RegistryRelay", relayImpl);

// 2. Deploy RegistryRelay behind BeaconProxy
address relayBeacon = pm.getBeaconById(keccak256("RegistryRelay"));
bytes memory relayInit =
abi.encodeCall(RegistryRelay.initialize, (deployer, mailboxAddr, hubDomain, hubAddress));
RegistryRelay relay = RegistryRelay(payable(address(new BeaconProxy(relayBeacon, relayInit))));
console.log("RegistryRelay deployed:", address(relay));

vm.stopBroadcast();

console.log("\n=== RegistryRelay Deployment Complete ===");
console.log("Relay address:", address(relay));
console.log("\nNext steps:");
console.log(" 1. Register on hub: hub.registerSatellite(<this_chain_domain>,", address(relay), ")");
}
}
9 changes: 7 additions & 2 deletions script/DeploySatelliteInfrastructure.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,13 @@ contract DeploySatelliteInfrastructure is Script {
// 5. Register all contract types (using deterministic addresses)
_registerContractTypes(pm, dd);

// 6. Deploy PoaManagerSatellite
PoaManagerSatellite satellite = new PoaManagerSatellite(address(pm), mailboxAddr, hubDomain, hubAddress);
// 6. Deploy PoaManagerSatellite via BeaconProxy
address satImpl = address(new PoaManagerSatellite());
pm.addContractType("PoaManagerSatellite", satImpl);
address satBeacon = pm.getBeaconById(keccak256("PoaManagerSatellite"));
bytes memory satInit =
abi.encodeCall(PoaManagerSatellite.initialize, (deployer, address(pm), mailboxAddr, hubDomain, hubAddress));
PoaManagerSatellite satellite = PoaManagerSatellite(payable(address(new BeaconProxy(satBeacon, satInit))));

// 7. Transfer PoaManager ownership to Satellite
pm.transferOwnership(address(satellite));
Expand Down
Loading
Loading