pub async fn insert_proof_generation_details(
        &mut self,
        l1_batch_number: L1BatchNumber,
    ) -> DalResult<()> {
        let result = sqlx::query!(
            r#"
            INSERT INTO
            proof_generation_details (l1_batch_number, status, created_at, updated_at)
            VALUES
            ($1, 'unpicked', NOW(), NOW())
            ON CONFLICT (l1_batch_number) DO NOTHING
            "#,
            i64::from(l1_batch_number.0),
        )
        .instrument("insert_proof_generation_details")
        .with_arg("l1_batch_number", &l1_batch_number)
        .report_latency()
        .execute(self.storage)
        .await?;

        if result.rows_affected() == 0 {
            // Not an error: we may call `insert_proof_generation_details()` from multiple full trees instantiated
            // for the same node. Unlike tree data, we don't particularly care about correspondence of `proof_gen_data_blob_url` across calls,
            // so just log this fact and carry on.
            tracing::debug!("L1 batch #{l1_batch_number}: proof generation data wasn't updated as it's already present");
        }
        Ok(())
    }
The caller should ensure that `l1_batch_number` exists in the database.
core/lib/dal/src/proof_generation_dal.rs