script_sig: ScriptBuf::new(),
        sequence: Sequence::MAX,
        witness: witness.clone(),
      });
    }

    let value_per_output = (total_value - template.fee) / template.outputs as u64;

    assert_eq!(
      value_per_output * template.outputs as u64 + template.fee,
      total_value
    );

    let mut tx = Transaction {
      version: 0,
      lock_time: LockTime::ZERO,
      input,
      output: (0..template.outputs)
        .map(|i| TxOut {
          value: template
            .output_values
            .get(i)
            .cloned()
            .unwrap_or(value_per_output),
          script_pubkey: script::Builder::new().into_script(),
        })
        .collect(),
    };

    if let Some(script_pubkey) = template.op_return {
      tx.output.insert(
        template.op_return_index.unwrap_or(tx.output.len()),
        TxOut {
          value: 0,
          script_pubkey,
        },
      );
    }

    self.mempool.push(tx.clone());

    tx.txid()
  }

  pub(crate) fn mempool(&self) -> &[Transaction] {