diff --git a/.github/workflows/check-gen-code.yml b/.github/workflows/check-gen-code.yml new file mode 100644 index 0000000..2cf66b9 --- /dev/null +++ b/.github/workflows/check-gen-code.yml @@ -0,0 +1,34 @@ +name: Check forge-gen +on: + push: + branches: + - main + pull_request: + +env: + FOUNDRY_PROFILE: ci + +jobs: + check-forge-gen: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Install deps + run: forge install + + - name: Generate forge-gen + run: go run ./tools/forge-gen/main.go --apply + + - name: Compare the expected and actual src/forge/ directories + run: | + if [ "$(git diff --ignore-space-at-eol src/forge/ | wc -l)" -gt "0" ]; then + echo "Detected uncommitted changes after build. See status below:" + git diff + exit 1 + fi diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c6934b6..19efddc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,7 @@ name: CI on: push: branches: - - master + - main pull_request: env: diff --git a/src/forge/Registry.sol b/src/forge/Registry.sol index 7758c49..995e42d 100644 --- a/src/forge/Registry.sol +++ b/src/forge/Registry.sol @@ -14,7 +14,7 @@ library Registry { function enableLib(address addr) public { // code for Wrapper bytes memory code = - hex"608060405234801561001057600080fd5b506004361061002b5760003560e01c8063671ff786146100a1575b6040516bffffffffffffffffffffffff193060601b1660208201526000906100959060340160408051808303601f19018152602036601f8101829004820285018201909352828452909291600091819084018382808284376000920191909152506100ca92505050565b90508081518060208301f35b6100b46100af366004610491565b61025e565b6040516100c19190610561565b60405180910390f35b606060006100d78461025e565b905060006100e48461025e565b60408051600480825260a0820190925291925060009190816020015b60608152602001906001900390816101005790505090506040518060400160405280600a8152602001690e6eac2ecca5acecae8d60b31b8152508160008151811061014d5761014d61057b565b602002602001018190525060405180604001604052806005815260200164666f72676560d81b815250816001815181106101895761018961057b565b602002602001018190525082816002815181106101a8576101a861057b565b602002602001018190525081816003815181106101c7576101c761057b565b6020908102919091010152604051638916046760e01b8152600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063891604679061020c908590600401610591565b600060405180830381865afa158015610229573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261025191908101906105f3565b9450505050505b92915050565b60606000825160026102709190610680565b67ffffffffffffffff81111561028857610288610422565b6040519080825280601f01601f1916602001820160405280156102b2576020820181803683370190505b5060408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b602082015290915060005b84518110156103f8578182518683815181106102fe576102fe61057b565b0160200151610310919060f81c6106ad565b815181106103205761032061057b565b01602001516001600160f81b0319168361033b836002610680565b8151811061034b5761034b61057b565b60200101906001600160f81b031916908160001a9053508182518683815181106103775761037761057b565b0160200151610389919060f81c6106c1565b815181106103995761039961057b565b01602001516001600160f81b031916836103b4836002610680565b6103bf9060016106d5565b815181106103cf576103cf61057b565b60200101906001600160f81b031916908160001a905350806103f0816106e8565b9150506102e0565b508160405160200161040a9190610701565b60405160208183030381529060405292505050919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561046157610461610422565b604052919050565b600067ffffffffffffffff82111561048357610483610422565b50601f01601f191660200190565b6000602082840312156104a357600080fd5b813567ffffffffffffffff8111156104ba57600080fd5b8201601f810184136104cb57600080fd5b80356104de6104d982610469565b610438565b8181528560208385010111156104f357600080fd5b81602084016020830137600091810160200191909152949350505050565b60005b8381101561052c578181015183820152602001610514565b50506000910152565b6000815180845261054d816020860160208601610511565b601f01601f19169290920160200192915050565b6020815260006105746020830184610535565b9392505050565b634e487b7160e01b600052603260045260246000fd5b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156105e657603f198886030184526105d4858351610535565b945092850192908501906001016105b8565b5092979650505050505050565b60006020828403121561060557600080fd5b815167ffffffffffffffff81111561061c57600080fd5b8201601f8101841361062d57600080fd5b805161063b6104d982610469565b81815285602083850101111561065057600080fd5b610661826020830160208601610511565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176102585761025861066a565b634e487b7160e01b600052601260045260246000fd5b6000826106bc576106bc610697565b500490565b6000826106d0576106d0610697565b500690565b808201808211156102585761025861066a565b6000600182016106fa576106fa61066a565b5060010190565b61060f60f31b81526000825161071e816002850160208701610511565b919091016002019291505056fea2646970667358221220918efca7b62d20c0fa19067dd7a091ef7cf76b94f70985c100a506284cf9d54664736f6c63430008130033"; + hex"608060405234801561001057600080fd5b506004361061002b5760003560e01c8063671ff786146100a1575b6040516bffffffffffffffffffffffff193060601b1660208201526000906100959060340160408051808303601f19018152602036601f8101829004820285018201909352828452909291600091819084018382808284376000920191909152506100ca92505050565b90508081518060208301f35b6100b46100af366004610487565b61025e565b6040516100c19190610557565b60405180910390f35b606060006100d78461025e565b905060006100e48461025e565b60408051600480825260a0820190925291925060009190816020015b60608152602001906001900390816101005790505090506040518060400160405280600a8152602001690e6eac2ecca5acecae8d60b31b8152508160008151811061014d5761014d610571565b602002602001018190525060405180604001604052806005815260200164666f72676560d81b8152508160018151811061018957610189610571565b602002602001018190525082816002815181106101a8576101a8610571565b602002602001018190525081816003815181106101c7576101c7610571565b6020908102919091010152604051638916046760e01b8152600090737109709ecfa91a80626ff3989d68f67f5b1dd12d9063891604679061020c908590600401610587565b600060405180830381865afa158015610229573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261025191908101906105eb565b9450505050505b92915050565b60606000825160026102709190610678565b67ffffffffffffffff81111561028857610288610418565b6040519080825280601f01601f1916602001820160405280156102b2576020820181803683370190505b5060408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b602082015290915060005b84518110156103ee578182518683815181106102fe576102fe610571565b0160200151610310919060f81c6106a5565b8151811061032057610320610571565b01602001516001600160f81b0319168361033b836002610678565b8151811061034b5761034b610571565b60200101906001600160f81b031916908160001a90535081825186838151811061037757610377610571565b0160200151610389919060f81c6106b9565b8151811061039957610399610571565b01602001516001600160f81b031916836103b4836002610678565b6103bf9060016106cd565b815181106103cf576103cf610571565b60200101906001600160f81b031916908160001a9053506001016102e0565b508160405160200161040091906106e0565b60405160208183030381529060405292505050919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561045757610457610418565b604052919050565b600067ffffffffffffffff82111561047957610479610418565b50601f01601f191660200190565b60006020828403121561049957600080fd5b813567ffffffffffffffff8111156104b057600080fd5b8201601f810184136104c157600080fd5b80356104d46104cf8261045f565b61042e565b8181528560208385010111156104e957600080fd5b81602084016020830137600091810160200191909152949350505050565b60005b8381101561052257818101518382015260200161050a565b50506000910152565b60008151808452610543816020860160208601610507565b601f01601f19169290920160200192915050565b60208152600061056a602083018461052b565b9392505050565b634e487b7160e01b600052603260045260246000fd5b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b828110156105de57603f198886030184526105cc85835161052b565b945092850192908501906001016105b0565b5092979650505050505050565b6000602082840312156105fd57600080fd5b815167ffffffffffffffff81111561061457600080fd5b8201601f8101841361062557600080fd5b80516106336104cf8261045f565b81815285602083850101111561064857600080fd5b610659826020830160208601610507565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761025857610258610662565b634e487b7160e01b600052601260045260246000fd5b6000826106b4576106b461068f565b500490565b6000826106c8576106c861068f565b500690565b8082018082111561025857610258610662565b61060f60f31b8152600082516106fd816002850160208701610507565b919091016002019291505056fea164736f6c6343000817000a"; vm.etch(addr, code); } diff --git a/tools/forge-gen/foundry.toml b/tools/forge-gen/foundry.toml new file mode 100644 index 0000000..3967eda --- /dev/null +++ b/tools/forge-gen/foundry.toml @@ -0,0 +1,6 @@ +[profile.default] +solc_version = "0.8.23" +src = "../../src" +out = "./out" +libs = ["../../lib"] +bytecode_hash = "none" \ No newline at end of file diff --git a/tools/forge-gen/main.go b/tools/forge-gen/main.go index 80fefff..92bba9a 100644 --- a/tools/forge-gen/main.go +++ b/tools/forge-gen/main.go @@ -8,7 +8,9 @@ import ( "html/template" "os" "os/exec" + "path/filepath" "regexp" + "runtime" "strings" ) @@ -85,7 +87,7 @@ func applyTemplate(bytecode string, precompileNames []string) error { } if applyFlag { - if err := os.WriteFile("./src/forge/Registry.sol", []byte(str), 0644); err != nil { + if err := os.WriteFile(resolvePath("../../src/forge/Registry.sol"), []byte(str), 0644); err != nil { return err } } else { @@ -95,7 +97,12 @@ func applyTemplate(bytecode string, precompileNames []string) error { } func getForgeConnectorBytecode() (string, error) { - abiContent, err := os.ReadFile("./out/Connector.sol/Connector.json") + // compile the Connector contract with forge and the local configuration + if _, err := execForgeCommand([]string{"build", "--config-path", resolvePath("./foundry.toml")}, ""); err != nil { + return "", err + } + + abiContent, err := os.ReadFile(resolvePath("./out/Connector.sol/Connector.json")) if err != nil { return "", err } @@ -138,21 +145,22 @@ func getPrecompileNames() ([]string, error) { } func formatSolidity(code string) (string, error) { - // Check if "forge" command is available in PATH + return execForgeCommand([]string{"fmt", "--raw", "-"}, code) +} + +func execForgeCommand(args []string, stdin string) (string, error) { _, err := exec.LookPath("forge") if err != nil { return "", fmt.Errorf("forge command not found in PATH: %v", err) } - // Command and arguments for forge fmt - command := "forge" - args := []string{"fmt", "--raw", "-"} - - // Create a command to run the forge fmt command - cmd := exec.Command(command, args...) + // Create a command to run the forge command + cmd := exec.Command("forge", args...) // Set up input from stdin - cmd.Stdin = bytes.NewBufferString(code) + if stdin != "" { + cmd.Stdin = bytes.NewBufferString(stdin) + } // Set up output buffer var outBuf, errBuf bytes.Buffer @@ -160,9 +168,20 @@ func formatSolidity(code string) (string, error) { cmd.Stderr = &errBuf // Run the command - if err = cmd.Run(); err != nil { + if err := cmd.Run(); err != nil { return "", fmt.Errorf("error running command: %v", err) } return outBuf.String(), nil } + +func resolvePath(path string) string { + // Get the caller's file path. + _, filename, _, _ := runtime.Caller(1) + + // Resolve the directory of the caller's file. + callerDir := filepath.Dir(filename) + + // Construct the absolute path to the target file. + return filepath.Join(callerDir, path) +}