/ services.nix
services.nix
 1  {inputs}: {
 2    config,
 3    lib,
 4    pkgs,
 5    ...
 6  }: let
 7    cfg = config.services;
 8  in {
 9    options = {
10      services.anvil = {
11        enable = lib.mkEnableOption "Start anvil";
12      };
13      services.deploy-contracts = {
14        enable = lib.mkEnableOption "Deploy contracts";
15        rpcUrl = lib.mkOption {
16          type = lib.types.str;
17          default = "http://localhost:8545";
18          description = "The Ethereum RPC URL to be used";
19        };
20        privateKey = lib.mkOption {
21          type = lib.types.str;
22          default = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80";
23          description = "The private key to be used";
24        };
25      };
26    };
27    config = {
28      settings.processes = lib.mkMerge [
29        (lib.mkIf cfg.deploy-contracts.enable {
30          deploy-contracts = {
31            environment = {
32              PRIVATE_KEY = cfg.deploy-contracts.privateKey;
33              FOUNDRY_ETH_RPC_URL = cfg.deploy-contracts.rpcUrl;
34            };
35            command = inputs.self.packages.${pkgs.system}.deploy-market;
36            depends_on = lib.mkIf cfg.anvil.enable {
37              "anvil".condition = "process_log_ready";
38            };
39            log_location = "$FLAKE_ROOT/logs/deploy.log";
40          };
41        })
42        (lib.mkIf cfg.anvil.enable {
43          anvil = {
44            command = "${pkgs.foundry}/bin/anvil";
45            ready_log_line = "Listening on";
46            log_location = "$FLAKE_ROOT/logs/anvil.log";
47          };
48        })
49      ];
50    };
51  }