```\nfunction createSplit(\n  address[] calldata accounts,\n  uint32[] calldata percentAllocations,\n  uint32 distributorFee,\n  address controller\n)\n  external\n  override\n  validSplit(accounts, percentAllocations, distributorFee)\n  returns (address split)\n{\n  bytes32 splitHash = _hashSplit(\n    accounts,\n    percentAllocations,\n    distributorFee\n  );\n  if (controller == address(0)) {\n    // create immutable split\n    split = Clones.cloneDeterministic(walletImplementation, splitHash);\n  } else {\n    // create mutable split\n    split = Clones.clone(walletImplementation);\n    splits[split].controller = controller;\n  }\n  // store split's hash in storage for future verification\n  splits[split].hash = splitHash;\n  emit CreateSplit(split);\n}\n```\n