Skip to content

Initialization Strategies#

Example of testing different initialization strategies for a factory contract.

contract Factory {
    enum StrategyType { BASIC, ADVANCED, UPGRADEABLE, PROXY }

    error InvalidStrategy();
    error InvalidParams();

    struct BasicParams {
        address admin;
        uint256 value;
    }

    struct AdvancedParams {
        address admin;
        string name;
        uint8 version;
        uint256 config;
    }

    struct UpgradeableParams {
        address admin;
        address implementation;
        bytes initData;
    }

    struct ProxyParams {
        address admin;
        address logic;
        address proxy;
    }

    function deploy(
        bytes32 salt,
        StrategyType strategyType,
        bytes memory params
    ) external returns (address) {
        // Deploy contract based on strategy
    }
}
@flow()
def flow_deploy_with_strategy(self) -> None:
    # Test different initialization strategies
    strategy_type = random_int(0, 3)
    admin = random_account()

    # Generate params based on strategy
    params = {
        0: self._encode_basic_params(
            admin=admin.address,
            value=random_int(0, 1000)
        ),
        1: self._encode_advanced_params(
            admin=admin.address,
            name=random_string(10),
            version=random_int(1, 5),
            config=random_int(0, 1000)
        ),
        2: self._encode_upgradeable_params(
            admin=admin.address,
            implementation=random_address(),
            init_data=random_bytes(32)
        ),
        3: self._encode_proxy_params(
            admin=admin.address,
            logic=random_address(),
            proxy=random_address()
        )
    }

    salt = random_bytes(32)

    with may_revert(Factory.InvalidStrategy) as e:
        self.factory.deploy(
            salt,
            strategy_type,
            params[strategy_type],
            from_=admin
        )

    if strategy_type > 3:
        assert e.value == Factory.InvalidStrategy()
    else:
        assert e.value is None
        deployed = self.factory.getDeployed(salt)
        self._validate_deployment(deployed, strategy_type, params[strategy_type])