Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test(script): Assert state changes for script tests #79

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
8 changes: 4 additions & 4 deletions script/BaseDeployScript.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ pragma solidity ^0.8.25;

/* solhint-disable no-console, gas-custom-errors */

import { Script } from "forge-std/Script.sol";
import { console } from "forge-std/console.sol";
import { Verifier } from "@zk-email/ether-email-auth-contracts/src/utils/Verifier.sol";
import { Script } from "forge-std/Script.sol";
import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
import { Groth16Verifier } from "@zk-email/ether-email-auth-contracts/src/utils/Groth16Verifier.sol";
import { UserOverrideableDKIMRegistry } from "@zk-email/contracts/UserOverrideableDKIMRegistry.sol";
import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
import { Verifier } from "@zk-email/ether-email-auth-contracts/src/utils/Verifier.sol";

contract BaseDeployScript is Script {
function run() public virtual { }
Expand Down Expand Up @@ -55,7 +55,7 @@ contract BaseDeployScript is Script {
)
);
address dkim = address(dkimProxy);
console.log("UseroverrideableDKIMRegistry proxy deployed at: %s", dkim);
console.log("UserOverrideableDKIMRegistry proxy deployed at: %s", dkim);
return dkim;
}
}
27 changes: 19 additions & 8 deletions script/Compute7579RecoveryDataHash.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,29 @@ pragma solidity ^0.8.25;

/* solhint-disable no-console */

import { Script } from "forge-std/Script.sol";
import { console } from "forge-std/console.sol";
import { Script } from "forge-std/Script.sol";

contract Compute7579RecoveryDataHash is Script {
function run() public view {
bytes4 functionSelector = bytes4(keccak256(bytes("changeOwner(address)")));
address newOwner = vm.envAddress("NEW_OWNER");
address validator = vm.envAddress("VALIDATOR");
contract Compute7579RecoveryDataHashScript is Script {
address private newOwner;
address private validator;

bytes public recoveryData;
bytes32 public recoveryDataHash;

function loadEnvVars() private {
// revert if these are not set
newOwner = vm.envAddress("NEW_OWNER");
validator = vm.envAddress("VALIDATOR");
}

function run() public {
loadEnvVars();

bytes4 functionSelector = bytes4(keccak256(bytes("changeOwner(address)")));
bytes memory changeOwnerCalldata = abi.encodeWithSelector(functionSelector, newOwner);
bytes memory recoveryData = abi.encode(validator, changeOwnerCalldata);
bytes32 recoveryDataHash = keccak256(recoveryData);
recoveryData = abi.encode(validator, changeOwnerCalldata);
recoveryDataHash = keccak256(recoveryData);

console.log("recoveryData", vm.toString(recoveryData));
console.log("recoveryDataHash", vm.toString(recoveryDataHash));
Expand Down
22 changes: 16 additions & 6 deletions script/ComputeSafeRecoveryCalldata.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,26 @@ pragma solidity ^0.8.25;

/* solhint-disable no-console */

import { Script } from "forge-std/Script.sol";
import { console } from "forge-std/console.sol";
import { Script } from "forge-std/Script.sol";

contract ComputeSafeRecoveryCalldataScript is Script {
function run() public view {
address oldOwner = vm.envAddress("OLD_OWNER");
address newOwner = vm.envAddress("NEW_OWNER");
address previousOwnerInLinkedList = address(1);
address private oldOwner;
address private newOwner;

bytes public recoveryCalldata;

bytes memory recoveryCalldata = abi.encodeWithSignature(
function loadEnvVars() private {
// revert if these are not set
oldOwner = vm.envAddress("OLD_OWNER");
newOwner = vm.envAddress("NEW_OWNER");
}

function run() public {
loadEnvVars();

address previousOwnerInLinkedList = address(1);
recoveryCalldata = abi.encodeWithSignature(
"swapOwner(address,address,address)", previousOwnerInLinkedList, oldOwner, newOwner
);

Expand Down
127 changes: 72 additions & 55 deletions script/DeployEmailRecoveryModule.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,86 +4,103 @@ pragma solidity ^0.8.25;
/* solhint-disable no-console, gas-custom-errors */

import { console } from "forge-std/console.sol";
import { EmailRecoveryCommandHandler } from "src/handlers/EmailRecoveryCommandHandler.sol";
import { UserOverrideableDKIMRegistry } from "@zk-email/contracts/UserOverrideableDKIMRegistry.sol";
import { BaseDeployScript } from "./BaseDeployScript.s.sol";
import { EmailAuth } from "@zk-email/ether-email-auth-contracts/src/EmailAuth.sol";
import { EmailRecoveryCommandHandler } from "src/handlers/EmailRecoveryCommandHandler.sol";
import { EmailRecoveryFactory } from "src/factories/EmailRecoveryFactory.sol";
import { OwnableValidator } from "src/test/OwnableValidator.sol";
import { BaseDeployScript } from "./BaseDeployScript.s.sol";

contract DeployEmailRecoveryModuleScript is BaseDeployScript {
address public verifier;
address public dkimRegistrySigner;
address public emailAuthImpl;
address public validatorAddr;
uint256 public minimumDelay;
address public killSwitchAuthorizer;
uint256 private privateKey;
uint256 private create2Salt;
uint256 private dkimDelay;
uint256 private minimumDelay;
address private killSwitchAuthorizer;
address private dkimSigner;

address public initialOwner;
uint256 public salt;
address private verifier;
address private dkimRegistry;
address private emailAuthImpl;
address private validator;
address private recoveryFactory;

UserOverrideableDKIMRegistry public dkim;
address public emailRecoveryModule;
address public emailRecoveryHandler;

function run() public override {
super.run();
vm.startBroadcast(vm.envUint("PRIVATE_KEY"));
function loadEnvVars() private {
// revert if not set
privateKey = vm.envUint("PRIVATE_KEY");
killSwitchAuthorizer = vm.envAddress("KILL_SWITCH_AUTHORIZER");

// default to uint256(0) if not set
create2Salt = vm.envOr("CREATE2_SALT", uint256(0));
dkimDelay = vm.envOr("DKIM_DELAY", uint256(0));
minimumDelay = vm.envOr("MINIMUM_DELAY", uint256(0));

// default to address(0) if not set
dkimSigner = vm.envOr("DKIM_SIGNER", address(0));
verifier = vm.envOr("VERIFIER", address(0));
dkimRegistrySigner = vm.envOr("DKIM_SIGNER", address(0));
dkimRegistry = vm.envOr("DKIM_REGISTRY", address(0));
emailAuthImpl = vm.envOr("EMAIL_AUTH_IMPL", address(0));
validatorAddr = vm.envOr("VALIDATOR", address(0));
minimumDelay = vm.envOr("MINIMUM_DELAY", uint256(0));
killSwitchAuthorizer = vm.envAddress("KILL_SWITCH_AUTHORIZER");
validator = vm.envOr("VALIDATOR", address(0));
recoveryFactory = vm.envOr("RECOVERY_FACTORY", address(0));

initialOwner = vm.addr(vm.envUint("PRIVATE_KEY"));
salt = vm.envOr("CREATE2_SALT", uint256(0));
// other reverts
if (dkimRegistry == address(0)) {
require(dkimSigner != address(0), "DKIM_REGISTRY or DKIM_SIGNER is required");
}
}

function run() public override {
super.run();

loadEnvVars();
vm.startBroadcast(privateKey);

address initialOwner = vm.addr(privateKey);

if (verifier == address(0)) {
verifier = deployVerifier(initialOwner, salt);
verifier = super.deployVerifier(initialOwner, create2Salt);
}

// Deploy Useroverridable DKIM registry
dkim = UserOverrideableDKIMRegistry(vm.envOr("DKIM_REGISTRY", address(0)));
uint256 setTimeDelay = vm.envOr("DKIM_DELAY", uint256(0));
if (address(dkim) == address(0)) {
dkim = UserOverrideableDKIMRegistry(
deployUserOverrideableDKIMRegistry(
initialOwner, dkimRegistrySigner, setTimeDelay, salt
)
if (dkimRegistry == address(0)) {
dkimRegistry = super.deployUserOverrideableDKIMRegistry(
initialOwner, dkimSigner, dkimDelay, create2Salt
);
}

if (emailAuthImpl == address(0)) {
emailAuthImpl = address(new EmailAuth{ salt: bytes32(salt) }());
emailAuthImpl = address(new EmailAuth{ salt: bytes32(create2Salt) }());
console.log("Deployed Email Auth at", emailAuthImpl);
}

if (validatorAddr == address(0)) {
validatorAddr = address(new OwnableValidator{ salt: bytes32(salt) }());
console.log("Deployed Ownable Validator at", validatorAddr);
if (validator == address(0)) {
validator = address(new OwnableValidator{ salt: bytes32(create2Salt) }());
console.log("Deployed Ownable Validator at", validator);
}

address _factory = vm.envOr("RECOVERY_FACTORY", address(0));
if (_factory == address(0)) {
_factory =
address(new EmailRecoveryFactory{ salt: bytes32(salt) }(verifier, emailAuthImpl));
console.log("Deployed Email Recovery Factory at", _factory);
}
{
EmailRecoveryFactory factory = EmailRecoveryFactory(_factory);
(address module, address commandHandler) = factory.deployEmailRecoveryModule(
bytes32(uint256(0)),
bytes32(uint256(0)),
type(EmailRecoveryCommandHandler).creationCode,
minimumDelay,
killSwitchAuthorizer,
address(dkim),
validatorAddr,
bytes4(keccak256(bytes("changeOwner(address)")))
if (recoveryFactory == address(0)) {
recoveryFactory = address(
new EmailRecoveryFactory{ salt: bytes32(create2Salt) }(verifier, emailAuthImpl)
);

console.log("Deployed Email Recovery Module at", vm.toString(module));
console.log("Deployed Email Recovery Handler at", vm.toString(commandHandler));
vm.stopBroadcast();
console.log("Deployed Email Recovery Factory at", recoveryFactory);
}

EmailRecoveryFactory factory = EmailRecoveryFactory(recoveryFactory);
(emailRecoveryModule, emailRecoveryHandler) = factory.deployEmailRecoveryModule(
bytes32(uint256(0)),
bytes32(uint256(0)),
type(EmailRecoveryCommandHandler).creationCode,
minimumDelay,
killSwitchAuthorizer,
dkimRegistry,
validator,
bytes4(keccak256(bytes("changeOwner(address)")))
);

console.log("Deployed Email Recovery Module at", vm.toString(emailRecoveryModule));
console.log("Deployed Email Recovery Handler at", vm.toString(emailRecoveryHandler));

vm.stopBroadcast();
}
}
88 changes: 55 additions & 33 deletions script/DeploySafeNativeRecovery.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,60 +4,82 @@ pragma solidity ^0.8.25;
/* solhint-disable no-console, gas-custom-errors */

import { console } from "forge-std/console.sol";
import { UserOverrideableDKIMRegistry } from "@zk-email/contracts/UserOverrideableDKIMRegistry.sol";
import { BaseDeployScript } from "./BaseDeployScript.s.sol";
import { EmailAuth } from "@zk-email/ether-email-auth-contracts/src/EmailAuth.sol";
import { SafeRecoveryCommandHandler } from "src/handlers/SafeRecoveryCommandHandler.sol";
import { SafeEmailRecoveryModule } from "src/modules/SafeEmailRecoveryModule.sol";
import { BaseDeployScript } from "./BaseDeployScript.s.sol";
import { SafeRecoveryCommandHandler } from "src/handlers/SafeRecoveryCommandHandler.sol";

contract DeploySafeNativeRecovery_Script is BaseDeployScript {
function run() public override {
super.run();
vm.startBroadcast(vm.envUint("PRIVATE_KEY"));
address verifier = vm.envOr("ZK_VERIFIER", address(0));
address dkimRegistrySigner = vm.envOr("DKIM_SIGNER", address(0));
address emailAuthImpl = vm.envOr("EMAIL_AUTH_IMPL", address(0));
address commandHandler = vm.envOr("COMMAND_HANDLER", address(0));
uint256 minimumDelay = vm.envOr("MINIMUM_DELAY", uint256(0));
address killSwitchAuthorizer = vm.envAddress("KILL_SWITCH_AUTHORIZER");
contract DeploySafeNativeRecoveryScript is BaseDeployScript {
uint256 private privateKey;
uint256 private create2Salt;
uint256 private dkimDelay;
uint256 private minimumDelay;
address private killSwitchAuthorizer;
address private dkimSigner;

address private zkVerifier;
address private dkimRegistry;
address private emailAuthImpl;
address private commandHandler;

address public module;

address initialOwner = vm.addr(vm.envUint("PRIVATE_KEY"));
function loadEnvVars() private {
// revert if not set
privateKey = vm.envUint("PRIVATE_KEY");
killSwitchAuthorizer = vm.envAddress("KILL_SWITCH_AUTHORIZER");

uint256 salt = vm.envOr("CREATE2_SALT", uint256(0));
// default to uint256(0) if not set
create2Salt = vm.envOr("CREATE2_SALT", uint256(0));
dkimDelay = vm.envOr("DKIM_DELAY", uint256(0));
minimumDelay = vm.envOr("MINIMUM_DELAY", uint256(0));

// default to address(0) if not set
dkimSigner = vm.envOr("DKIM_SIGNER", address(0));
zkVerifier = vm.envOr("ZK_VERIFIER", address(0));
dkimRegistry = vm.envOr("DKIM_REGISTRY", address(0));
emailAuthImpl = vm.envOr("EMAIL_AUTH_IMPL", address(0));
commandHandler = vm.envOr("COMMAND_HANDLER", address(0));

// other reverts
if (dkimRegistry == address(0)) {
require(dkimSigner != address(0), "DKIM_REGISTRY or DKIM_SIGNER is required");
}
}

function run() public override {
super.run();

console.log("verifier %s", verifier);
loadEnvVars();
vm.startBroadcast(privateKey);

UserOverrideableDKIMRegistry dkim;
address initialOwner = vm.addr(privateKey);

if (verifier == address(0)) {
verifier = deployVerifier(initialOwner, salt);
console.log("verifier %s", zkVerifier);
if (zkVerifier == address(0)) {
zkVerifier = super.deployVerifier(initialOwner, create2Salt);
}

// Deploy Useroverridable DKIM registry
dkim = UserOverrideableDKIMRegistry(vm.envOr("DKIM_REGISTRY", address(0)));
uint256 setTimeDelay = vm.envOr("DKIM_DELAY", uint256(0));
if (address(dkim) == address(0)) {
dkim = UserOverrideableDKIMRegistry(
deployUserOverrideableDKIMRegistry(
initialOwner, dkimRegistrySigner, setTimeDelay, salt
)
if (dkimRegistry == address(0)) {
dkimRegistry = super.deployUserOverrideableDKIMRegistry(
initialOwner, dkimSigner, dkimDelay, create2Salt
);
}

if (emailAuthImpl == address(0)) {
emailAuthImpl = address(new EmailAuth{ salt: bytes32(salt) }());
emailAuthImpl = address(new EmailAuth{ salt: bytes32(create2Salt) }());
console.log("Deployed Email Auth at", emailAuthImpl);
}

if (commandHandler == address(0)) {
commandHandler = address(new SafeRecoveryCommandHandler{ salt: bytes32(salt) }());
commandHandler = address(new SafeRecoveryCommandHandler{ salt: bytes32(create2Salt) }());
console.log("Deployed Command Handler at", commandHandler);
}

address module = address(
new SafeEmailRecoveryModule{ salt: bytes32(salt) }(
verifier,
address(dkim),
module = address(
new SafeEmailRecoveryModule{ salt: bytes32(create2Salt) }(
zkVerifier,
dkimRegistry,
emailAuthImpl,
commandHandler,
minimumDelay,
Expand Down
Loading