All files / src/deploygen deployScriptGen.ts

100% Statements 39/39
83.33% Branches 5/6
100% Functions 6/6
100% Lines 39/39

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79    1x         1x 1x 1x 1x 1x 1x 2x 2x       1x     1x 1x 1x     1x 1x 1x 1x 1x   1x 1x     1x 1x 1x         1x 2x 2x 2x             1x 2x 2x 2x 1x           1x 2x       2x     1x   1x 1x   1x    
import { ContractConfig, ProjectConfig } from "../types";
 
export class DeployScriptGen {
    constructor() { }
 
    gen(projectConfig: ProjectConfig): string {
        // Start building the script
        let script = `// SPDX-License-Identifier: UNLICENSED\n`;
        script += `pragma solidity ^0.8.13;\n\n`;
        script += `import "forge-std/Script.sol";\n`;
        script += `import "forge-std/console.sol";\n`;
        console.log(Object.keys(projectConfig.contracts));
        Object.values(projectConfig.contracts).forEach((value: string | ContractConfig) => {
            if (typeof value === "string") {
                script += `import "./${value.replace(".json", ".sol")}";\n`;
            }
        });
 
        script += `import "@patchwork/PatchworkProtocol.sol";\n`;
 
        // Assuming the first contract in the config is the main deployer contract
        const mainContractName = projectConfig.name.replace(/\s/g, "");
        script += `\ncontract ${mainContractName}Deploy is Script {\n`;
        script += `    function run() external {\n`;
 
 
        script += `        address ownerAddress = vm.envAddress("OWNER");\n`;
        script += `        address ppAddress = vm.envAddress("PATCHWORK_PROTOCOL");\n`
        script += `        console.log("Deployer starting");\n`;
        script += `        console.log("owner: ", ownerAddress);\n`;
        script += `        console.log("patchwork protocol: ", ppAddress);\n\n`;
 
        script += `        vm.startBroadcast();\n`;
        script += `        PatchworkProtocol pp = PatchworkProtocol(ppAddress);\n`;
 
        // Iterate through each scope in the project configuration
        for (const scopeConfig of projectConfig.scopes) {
            script += `        pp.claimScope("${scopeConfig.name}");\n`;
            script += `        pp.setScopeRules("${scopeConfig.name}", false, false, true);\n`;
        }
 
        // deploy each contract
 
        Object.entries(projectConfig.contracts).forEach(([key, value]) => {
            const contractName = key;
            if (typeof value === "string") {
                script += `        ${contractName} ${contractName.toLowerCase()} = new ${contractName}(ppAddress, ownerAddress);\n`;
            } else E{
            // Handle ContractConfig logic here
            }
        });
 
        // register fragments
        Object.entries(projectConfig.contracts).forEach(([key, value]) => {
            const contractName = key;
            if (projectConfig.contractRelations !== undefined) {
                for (const fragment of projectConfig.contractRelations[key]?.fragments || []) {
                    script += `        ${contractName.toLowerCase()}.registerFragment(${fragment.toLowerCase()});\n`;
                }
            }
        });
 
        // whitelist
        Object.entries(projectConfig.contracts).forEach(([key, value]) => {
            const contractName = key;
            // TODO FIX - load contract config to get scope name
            // Additional logic for whitelisting if applicable
            //if (scopeConfig.whitelist) {
                script += `        pp.addWhitelist("${projectConfig.scopes[0].name}", address(${contractName.toLowerCase()}));\n`;
            //}
        });
        script += `        vm.stopBroadcast();\n`;
 
        script += `    }\n`;
        script += `}\n`;
 
        return script;
    }
}