diff --git a/tap-agent/src/agent/sender_allocation.rs b/tap-agent/src/agent/sender_allocation.rs index a25b6df71..85a66bcf6 100644 --- a/tap-agent/src/agent/sender_allocation.rs +++ b/tap-agent/src/agent/sender_allocation.rs @@ -685,7 +685,15 @@ impl SenderAllocationState { &mut self, receipts: &[ReceiptWithState], ) -> Result<()> { - for received_receipt in receipts.iter() { + let reciepts_len = receipts.len(); + let mut reciepts_signers = Vec::with_capacity(reciepts_len); + let mut encoded_signatures = Vec::with_capacity(reciepts_len); + let mut allocation_ids = Vec::with_capacity(reciepts_len); + let mut timestamps = Vec::with_capacity(reciepts_len); + let mut nounces = Vec::with_capacity(reciepts_len); + let mut values = Vec::with_capacity(reciepts_len); + + for received_receipt in receipts.iter(){ let receipt = received_receipt.signed_receipt(); let allocation_id = receipt.message.allocation_id; let encoded_signature = receipt.signature.as_bytes().to_vec(); @@ -696,31 +704,48 @@ impl SenderAllocationState { error!("Failed to recover receipt signer: {}", e); anyhow!(e) })?; - sqlx::query!( - r#" - INSERT INTO scalar_tap_receipts_invalid ( - signer_address, - signature, - allocation_id, - timestamp_ns, - nonce, - value, - error_log - ) - VALUES ($1, $2, $3, $4, $5, $6, $7) - "#, - receipt_signer.encode_hex(), - encoded_signature, + debug!( + "Receipt for allocation {} and signer {} failed reason: {}", allocation_id.encode_hex(), - BigDecimal::from(receipt.message.timestamp_ns), - BigDecimal::from(receipt.message.nonce), - BigDecimal::from(BigInt::from(receipt.message.value)), + receipt_signer.encode_hex(), receipt_error - ) - .execute(&self.pgpool) - .await - .map_err(|e| anyhow!("Failed to store invalid receipt: {:?}", e))?; + ); + reciepts_signers.push(receipt_signer.encode_hex()); + encoded_signatures.push(encoded_signature); + allocation_ids.push(allocation_id.encode_hex()); + timestamps.push(BigDecimal::from(receipt.message.timestamp_ns)); + nounces.push(BigDecimal::from(receipt.message.nonce)); + values.push(BigDecimal::from(BigInt::from(receipt.message.value))); } + sqlx::query!( + r#"INSERT INTO scalar_tap_receipts_invalid ( + signer_address, + signature, + allocation_id, + timestamp_ns, + nonce, + value + ) SELECT * FROM UNNEST( + $1::CHAR(40)[], + $2::BYTEA[], + $3::CHAR(40)[], + $4::NUMERIC(20)[], + $5::NUMERIC(20)[], + $6::NUMERIC(40)[] + )"#, + &signers, + &signatures, + &allocation_ids, + ×tamps, + &nonces, + &values, + ).execute(&self.pgpool) + .await + .map_err(|e| { + error!("Failed to store receipt: {}", e); + anyhow!(e) + })?; + let fees = receipts .iter() .map(|receipt| receipt.signed_receipt().message.value)