Skip to content
Merged
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
15 changes: 15 additions & 0 deletions script/DeployInfrastructure.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,21 @@ contract DeployInfrastructure is Script {
);
console.log("Onboarding config set: maxCost=0.01 ETH, dailyLimit=1000, registry:", globalAccountRegistry);

// Configure org deployment sponsorship (must come after OrgDeployer deployment)
PoaManager(poaManager)
.adminCall(
paymasterHub,
abi.encodeWithSignature(
"setOrgDeployConfig(uint128,uint128,uint8,bool,address)",
uint128(0.05 ether),
uint128(100),
uint8(2),
true,
orgDeployer
)
);
console.log("Org deploy config set: orgDeployer:", orgDeployer);

// Deploy universal PasskeyAccountFactory (infrastructure singleton)
address passkeyAccountBeacon = pm.getBeaconById(keccak256("PasskeyAccount"));
address passkeyFactoryBeaconAddr = pm.getBeaconById(keccak256("PasskeyAccountFactory"));
Expand Down
99 changes: 99 additions & 0 deletions script/MainDeploy.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,12 @@ contract DeployHomeChain is DeployHelper {
PaymasterHub(payable(infra.paymasterHub)).donateToSolidarity{value: solidarityFund}();
console.log("PaymasterHub:", infra.paymasterHub);

// Unpause solidarity distribution so onboarding can use the fund
// (initialize() sets distributionPaused=true for collection-only mode)
PoaManager(infra.poaManager)
.adminCall(infra.paymasterHub, abi.encodeWithSignature("unpauseSolidarityDistribution()"));
console.log("Solidarity distribution unpaused for onboarding");

// Deploy OrgDeployer proxy
address deployerBeacon = PoaManager(infra.poaManager).getBeaconById(keccak256("OrgDeployer"));
bytes memory orgDeployerInit = abi.encodeWithSignature(
Expand Down Expand Up @@ -241,6 +247,35 @@ contract DeployHomeChain is DeployHelper {
infra.globalAccountRegistry = address(new BeaconProxy(accRegBeacon, accRegInit));
console.log("GlobalAccountRegistry:", infra.globalAccountRegistry);

// Configure onboarding with registry address (must come after registry deployment)
PoaManager(infra.poaManager)
.adminCall(
infra.paymasterHub,
abi.encodeWithSignature(
"setOnboardingConfig(uint128,uint128,bool,address)",
uint128(0.01 ether),
uint128(1000),
true,
infra.globalAccountRegistry
)
);
console.log("Onboarding config set: registry:", infra.globalAccountRegistry);

// Configure org deployment sponsorship (must come after OrgDeployer deployment)
PoaManager(infra.poaManager)
.adminCall(
infra.paymasterHub,
abi.encodeWithSignature(
"setOrgDeployConfig(uint128,uint128,uint8,bool,address)",
uint128(0.05 ether),
uint128(100),
uint8(2),
true,
infra.orgDeployer
)
);
console.log("Org deploy config set: orgDeployer:", infra.orgDeployer);

// Deploy universal PasskeyAccountFactory
address passkeyAccountBeacon = pm.getBeaconById(keccak256("PasskeyAccount"));
address passkeyFactoryBeaconAddr = pm.getBeaconById(keccak256("PasskeyAccountFactory"));
Expand Down Expand Up @@ -594,6 +629,11 @@ contract DeploySatellite is DeployHelper {
PaymasterHub(payable(infra.paymasterHub)).donateToSolidarity{value: solidarityFund}();
console.log("PaymasterHub:", infra.paymasterHub);

// Unpause solidarity distribution so onboarding can use the fund
// (initialize() sets distributionPaused=true for collection-only mode)
pm.adminCall(infra.paymasterHub, abi.encodeWithSignature("unpauseSolidarityDistribution()"));
console.log("Solidarity distribution unpaused for onboarding");

// --- OrgDeployer proxy ---
address deployerBeacon = pm.getBeaconById(keccak256("OrgDeployer"));
bytes memory orgDeployerInit = abi.encodeWithSignature(
Expand Down Expand Up @@ -623,6 +663,33 @@ contract DeploySatellite is DeployHelper {
infra.globalAccountRegistry = address(new BeaconProxy(accRegBeacon, accRegInit));
console.log("GlobalAccountRegistry:", infra.globalAccountRegistry);

// Configure onboarding with registry address (must come after registry deployment)
pm.adminCall(
infra.paymasterHub,
abi.encodeWithSignature(
"setOnboardingConfig(uint128,uint128,bool,address)",
uint128(0.01 ether),
uint128(1000),
true,
infra.globalAccountRegistry
)
);
console.log("Onboarding config set: registry:", infra.globalAccountRegistry);

// Configure org deployment sponsorship (must come after OrgDeployer deployment)
pm.adminCall(
infra.paymasterHub,
abi.encodeWithSignature(
"setOrgDeployConfig(uint128,uint128,uint8,bool,address)",
uint128(0.05 ether),
uint128(100),
uint8(2),
true,
infra.orgDeployer
)
);
console.log("Org deploy config set: orgDeployer:", infra.orgDeployer);

// --- Deploy UniversalPasskeyFactory ---
address passkeyAccountBeacon = pm.getBeaconById(keccak256("PasskeyAccount"));
address passkeyFactoryBeacon = pm.getBeaconById(keccak256("PasskeyAccountFactory"));
Expand Down Expand Up @@ -795,6 +862,12 @@ contract RegisterAndTransfer is Script {
* --rpc-url $HOME_RPC
*/
contract VerifyDeployment is Script {
function _staticCall(address target, bytes memory data) internal view returns (bytes memory) {
(bool ok, bytes memory ret) = target.staticcall(data);
require(ok, "staticcall failed");
return ret;
}

function run() public view {
string memory state = vm.readFile("script/main-deploy-state.json");
address hubAddr = vm.parseJsonAddress(state, ".homeChain.hub");
Expand Down Expand Up @@ -850,6 +923,32 @@ contract VerifyDeployment is Script {
checks++;
if (deployerCheck) passed++;

// Check PaymasterHub onboarding config
address registryAddr = vm.parseJsonAddress(state, ".homeChain.globalAccountRegistry");
(uint128 maxGas, uint128 dailyLimit,, bool onboardingEnabled, address accountRegistry) = abi.decode(
_staticCall(paymasterAddr, abi.encodeWithSignature("getOnboardingConfig()")),
(uint128, uint128, uint128, bool, address)
);
console.log("\nOnboarding enabled:", onboardingEnabled ? "true" : "false");
bool onboardingCheck = onboardingEnabled && accountRegistry == registryAddr && accountRegistry != address(0);
console.log("Onboarding registry:", accountRegistry);
console.log("Expected registry:", registryAddr);
console.log("Onboarding config:", onboardingCheck ? "PASS" : "FAIL");
checks++;
if (onboardingCheck) passed++;

// Check solidarity distribution is unpaused
(uint256 solBalance,,, bool distPaused) = abi.decode(
_staticCall(paymasterAddr, abi.encodeWithSignature("getSolidarityFund()")),
(uint256, uint256, uint256, bool)
);
console.log("\nSolidarity balance:", solBalance);
bool solidarityCheck = solBalance > 0 && !distPaused;
console.log("Distribution paused:", distPaused ? "true" : "false");
console.log("Solidarity fund:", solidarityCheck ? "PASS" : "FAIL");
checks++;
if (solidarityCheck) passed++;

// Summary
console.log("\n=== Verification Summary ===");
console.log("Passed:", passed, "/", checks);
Expand Down
Loading