fix: default state sql

fix(mint/sqlite): add pending proof state

fix(mint): adding proof to pending before checking current

fix(mint): remove double call to verify melt quote
This commit is contained in:
thesimplekid
2024-06-29 00:24:06 +01:00
parent dec11e232a
commit 5db6eaa858
8 changed files with 20 additions and 11 deletions

View File

@@ -34,7 +34,7 @@ const CONFIG_TABLE: TableDefinition<&str, &str> = TableDefinition::new("config")
const BLINDED_SIGNATURES: TableDefinition<[u8; 33], &str> = const BLINDED_SIGNATURES: TableDefinition<[u8; 33], &str> =
TableDefinition::new("blinded_signatures"); TableDefinition::new("blinded_signatures");
const DATABASE_VERSION: u32 = 0; const DATABASE_VERSION: u32 = 1;
/// Mint Redbdatabase /// Mint Redbdatabase
#[derive(Debug, Clone)] #[derive(Debug, Clone)]

View File

@@ -68,6 +68,7 @@ impl WalletRedbDatabase {
match db_version { match db_version {
Some(db_version) => { Some(db_version) => {
let mut current_file_version = u32::from_str(&db_version)?; let mut current_file_version = u32::from_str(&db_version)?;
tracing::info!("Current file version {}", current_file_version);
match current_file_version.cmp(&DATABASE_VERSION) { match current_file_version.cmp(&DATABASE_VERSION) {
Ordering::Less => { Ordering::Less => {

View File

@@ -1,4 +1,4 @@
ALTER TABLE melt_quote ADD state TEXT CHECK ( state IN ('UNPAID', 'PENDING', 'PAID' ) ) NOT NULL; ALTER TABLE melt_quote ADD state TEXT CHECK ( state IN ('UNPAID', 'PENDING', 'PAID' ) ) NOT NULL DEFAULT 'UNPAID';
ALTER TABLE melt_quote ADD payment_preimage TEXT; ALTER TABLE melt_quote ADD payment_preimage TEXT;
ALTER TABLE melt_quote DROP COLUMN paid; ALTER TABLE melt_quote DROP COLUMN paid;
CREATE INDEX IF NOT EXISTS melt_quote_state_index ON melt_quote(state); CREATE INDEX IF NOT EXISTS melt_quote_state_index ON melt_quote(state);

View File

@@ -1,3 +1,3 @@
ALTER TABLE mint_quote ADD state TEXT CHECK ( state IN ('UNPAID', 'PENDING', 'PAID', 'ISSUED' ) ) NOT NULL; ALTER TABLE mint_quote ADD state TEXT CHECK ( state IN ('UNPAID', 'PENDING', 'PAID', 'ISSUED' ) ) NOT NULL DEFAULT 'UNPAID';
ALTER TABLE mint_quote DROP COLUMN paid; ALTER TABLE mint_quote DROP COLUMN paid;
CREATE INDEX IF NOT EXISTS mint_quote_state_index ON mint_quote(state); CREATE INDEX IF NOT EXISTS mint_quote_state_index ON mint_quote(state);

View File

@@ -486,7 +486,7 @@ AND state="SPENT";
sqlx::query( sqlx::query(
r#" r#"
INSERT OR REPLACE INTO proof INSERT OR REPLACE INTO proof
(y, amount, keyset_id, secret, c, witness, spent, pending) (y, amount, keyset_id, secret, c, witness, state)
VALUES (?, ?, ?, ?, ?, ?, ?); VALUES (?, ?, ?, ?, ?, ?, ?);
"#, "#,
) )

View File

@@ -1,4 +1,4 @@
ALTER TABLE melt_quote ADD state TEXT CHECK ( state IN ('UNPAID', 'PENDING', 'PAID' ) ) NOT NULL; ALTER TABLE melt_quote ADD state TEXT CHECK ( state IN ('UNPAID', 'PENDING', 'PAID' ) ) NOT NULL DEFAULT 'UNPAID';
ALTER TABLE melt_quote ADD payment_preimage TEXT; ALTER TABLE melt_quote ADD payment_preimage TEXT;
ALTER TABLE melt_quote DROP COLUMN paid; ALTER TABLE melt_quote DROP COLUMN paid;
CREATE INDEX IF NOT EXISTS melt_quote_state_index ON melt_quote(state); CREATE INDEX IF NOT EXISTS melt_quote_state_index ON melt_quote(state);

View File

@@ -1,3 +1,3 @@
ALTER TABLE mint_quote ADD state TEXT CHECK ( state IN ('UNPAID', 'PENDING', 'PAID', 'ISSUED' ) ) NOT NULL; ALTER TABLE mint_quote ADD state TEXT CHECK ( state IN ('UNPAID', 'PENDING', 'PAID', 'ISSUED' ) ) NOT NULL DEFAULT 'UNPAID';
ALTER TABLE mint_quote DROP COLUMN paid; ALTER TABLE mint_quote DROP COLUMN paid;
CREATE INDEX IF NOT EXISTS mint_quote_state_index ON mint_quote(state); CREATE INDEX IF NOT EXISTS mint_quote_state_index ON mint_quote(state);

View File

@@ -592,10 +592,6 @@ impl Mint {
self.verify_proof(proof).await?; self.verify_proof(proof).await?;
} }
self.localstore
.add_pending_proofs(melt_request.inputs.clone())
.await?;
let state = self let state = self
.localstore .localstore
.update_melt_quote_state(&melt_request.quote, MeltQuoteState::Pending) .update_melt_quote_state(&melt_request.quote, MeltQuoteState::Pending)
@@ -694,17 +690,29 @@ impl Mint {
return Err(Error::DuplicateProofs); return Err(Error::DuplicateProofs);
} }
// Add proofs to pending
self.localstore
.add_pending_proofs(melt_request.inputs.clone())
.await?;
tracing::debug!("Verified melt quote: {}", melt_request.quote);
Ok(quote) Ok(quote)
} }
/// Process melt request marking [`Proofs`] as spent /// Process melt request marking [`Proofs`] as spent
/// The melt request must be verifyed using [`Self::verify_melt_request`] before calling [`Self::process_melt_request`]
pub async fn process_melt_request( pub async fn process_melt_request(
&self, &self,
melt_request: &MeltBolt11Request, melt_request: &MeltBolt11Request,
preimage: &str, preimage: &str,
total_spent: Amount, total_spent: Amount,
) -> Result<MeltQuoteBolt11Response, Error> { ) -> Result<MeltQuoteBolt11Response, Error> {
let quote = self.verify_melt_request(melt_request).await?; tracing::debug!("Processing melt quote: {}", melt_request.quote);
let quote = self
.localstore
.get_melt_quote(&melt_request.quote)
.await?
.ok_or(Error::UnknownQuote)?;
if let Some(outputs) = &melt_request.outputs { if let Some(outputs) = &melt_request.outputs {
for blinded_message in outputs { for blinded_message in outputs {