breez_sdk_core/persist/
migrations.rs

1pub(crate) fn current_migrations() -> Vec<&'static str> {
2    vec![
3        "
4        CREATE TABLE IF NOT EXISTS payments (
5          payment_type TEXT NOT NULL check( payment_type in('sent', 'received')),
6          payment_hash TEXT NOT NULL PRIMARY KEY,
7          payment_time INTEGER NOT NULL,
8          label TEXT,
9          destination_pubkey TEXT NOT NULL,
10          amount_msats INTEGER NOT NULL,
11          fee_msat INTEGER NOT NULL,
12          payment_preimage TEXT,
13          keysend INTEGER NOT NULL,                  
14          bolt11 TEXT,
15          pending INTEGER NOT NULL,
16          description TEXT
17        ) STRICT;  
18        
19        CREATE TABLE IF NOT EXISTS settings (
20         key TEXT NOT NULL PRIMARY KEY,
21         value TEXT NOT NULL
22        ) STRICT;
23
24        CREATE TABLE IF NOT EXISTS cached_items (
25         key TEXT NOT NULL PRIMARY KEY,
26         value TEXT NOT NULL
27        ) STRICT;
28        
29        CREATE TABLE IF NOT EXISTS swaps (
30          bitcoin_address TEXT PRIMARY KEY NOT NULL,
31          created_at INTEGER DEFAULT CURRENT_TIMESTAMP,
32          lock_height INTEGER NOT NULL,
33          payment_hash BLOB NOT NULL UNIQUE,
34          preimage BLOB NOT NULL UNIQUE,
35          private_key BLOB NOT NULL UNIQUE,
36          public_key BLOB NOT NULL UNIQUE,
37          swapper_public_key BLOB NOT NULL UNIQUE,
38          script BLOB NOT NULL UNIQUE,
39          bolt11 TEXT,
40          paid_sats INTEGER NOT NULL DEFAULT 0,
41          confirmed_sats INTEGER NOT NULL DEFAULT 0,               
42          status INTEGER NOT NULL DEFAULT 0,
43          refund_tx_ids TEXT NOT NULL, 
44          confirmed_tx_ids TEXT NOT NULL
45        ) STRICT;
46       ",
47        "
48       CREATE TABLE channels (
49        funding_txid TEXT NOT NULL PRIMARY KEY,
50        short_channel_id TEXT,
51        state TEXT NOT NULL check( state in('PendingOpen', 'Opened', 'PendingClose', 'Closed')),
52        spendable_msat INTEGER NOT NULL,
53        receivable_msat INTEGER NOT NULL,
54        closed_at INTEGER
55       ) STRICT;
56       ",
57       "
58       ALTER TABLE payments RENAME TO old_payments;
59
60       CREATE TABLE IF NOT EXISTS payments (
61        id TEXT NOT NULL PRIMARY KEY,
62        payment_type TEXT NOT NULL check( payment_type in('Sent', 'Received', 'ClosedChannel')),             
63        payment_time INTEGER NOT NULL,             
64        amount_msat INTEGER NOT NULL,
65        fee_msat INTEGER NOT NULL,             
66        pending INTEGER NOT NULL,
67        description TEXT,
68        details TEXT
69       ) STRICT;
70       
71       INSERT INTO payments
72        (id, payment_type, payment_time, amount_msat, fee_msat, pending, description, details)
73        SELECT 
74         payment_hash, 
75         case when payment_type = 'received' then 'Received' else 'Sent' end, 
76         payment_time, 
77         amount_msats,
78         fee_msat, 
79         pending, 
80         description, 
81         json_object(
82          'payment_hash', payment_hash, 
83          'label', label, 
84          'destination_pubkey', destination_pubkey, 
85          'payment_preimage', payment_preimage, 
86          'keysend', CASE keysend WHEN 1 THEN json('true') ELSE json('false') END, 
87          'bolt11', bolt11
88         )
89        FROM old_payments;
90       
91       DROP TABLE old_payments;            
92       ",
93
94       "
95       ALTER TABLE swaps ADD COLUMN min_allowed_deposit INTEGER NOT NULL;
96       ALTER TABLE swaps ADD COLUMN max_allowed_deposit INTEGER NOT NULL;
97       ",
98       "UPDATE payments SET fee_msat = ABS(fee_msat) WHERE fee_msat < 0",
99
100       "
101       ALTER TABLE swaps RENAME TO old_swaps;
102
103       CREATE TABLE IF NOT EXISTS swaps (
104        bitcoin_address TEXT PRIMARY KEY NOT NULL,
105        created_at INTEGER DEFAULT CURRENT_TIMESTAMP,
106        lock_height INTEGER NOT NULL,
107        payment_hash BLOB NOT NULL UNIQUE,
108        preimage BLOB NOT NULL UNIQUE,
109        private_key BLOB NOT NULL UNIQUE,
110        public_key BLOB NOT NULL UNIQUE,
111        swapper_public_key BLOB NOT NULL UNIQUE,
112        script BLOB NOT NULL UNIQUE,
113        bolt11 TEXT,
114        paid_sats INTEGER NOT NULL DEFAULT 0,
115        unconfirmed_sats INTEGER NOT NULL DEFAULT 0, 
116        confirmed_sats INTEGER NOT NULL DEFAULT 0,               
117        status INTEGER NOT NULL DEFAULT 0,
118        refund_tx_ids TEXT NOT NULL,  
119        unconfirmed_tx_ids TEXT NOT NULL,
120        confirmed_tx_ids TEXT NOT NULL,
121        min_allowed_deposit INTEGER NOT NULL,
122        max_allowed_deposit INTEGER NOT NULL,
123        last_redeem_error TEXT
124       ) STRICT;
125       
126       INSERT INTO swaps
127        (
128         bitcoin_address, 
129         created_at,
130         lock_height,
131         payment_hash,
132         preimage,
133         private_key,
134         public_key,
135         swapper_public_key,
136         script,
137         bolt11,
138         paid_sats,
139         unconfirmed_sats,
140         confirmed_sats,
141         status,
142         refund_tx_ids,
143         unconfirmed_tx_ids,
144         confirmed_tx_ids,
145         min_allowed_deposit,
146         max_allowed_deposit,
147         last_redeem_error
148        )
149        SELECT 
150         bitcoin_address, 
151         created_at,
152         lock_height,
153         payment_hash,
154         preimage,
155         private_key,
156         public_key,
157         swapper_public_key,
158         script,
159         bolt11,
160         paid_sats,
161         0,
162         confirmed_sats,
163         status,
164         refund_tx_ids,
165         '[]',
166         confirmed_tx_ids,
167         min_allowed_deposit,
168         max_allowed_deposit,
169         NULL
170        FROM old_swaps;
171       
172       DROP TABLE old_swaps;            
173       ",
174       "
175       CREATE TABLE IF NOT EXISTS payments_external_info (
176        payment_id TEXT NOT NULL PRIMARY KEY,
177        lnurl_success_action TEXT,
178        FOREIGN KEY(payment_id) REFERENCES payments(id)
179       ) STRICT;
180       ",
181       "ALTER TABLE payments_external_info ADD COLUMN ln_address TEXT;",
182       "ALTER TABLE payments_external_info ADD COLUMN lnurl_metadata TEXT;",
183       "
184       ALTER TABLE swaps RENAME TO old_swaps;
185
186       CREATE TABLE IF NOT EXISTS swaps (
187        bitcoin_address TEXT PRIMARY KEY NOT NULL,
188        created_at INTEGER DEFAULT CURRENT_TIMESTAMP,
189        lock_height INTEGER NOT NULL,
190        payment_hash BLOB NOT NULL UNIQUE,
191        preimage BLOB NOT NULL UNIQUE,
192        private_key BLOB NOT NULL UNIQUE,
193        public_key BLOB NOT NULL UNIQUE,
194        swapper_public_key BLOB NOT NULL UNIQUE,
195        script BLOB NOT NULL UNIQUE,
196        min_allowed_deposit INTEGER NOT NULL,
197        max_allowed_deposit INTEGER NOT NULL
198       ) STRICT;
199
200       CREATE TABLE IF NOT EXISTS swaps_info (
201        bitcoin_address TEXT PRIMARY KEY NOT NULL,
202        bolt11 TEXT,
203        paid_sats INTEGER NOT NULL DEFAULT 0,
204        unconfirmed_sats INTEGER NOT NULL DEFAULT 0, 
205        confirmed_sats INTEGER NOT NULL DEFAULT 0,               
206        status INTEGER NOT NULL DEFAULT 0,        
207        unconfirmed_tx_ids TEXT NOT NULL,
208        confirmed_tx_ids TEXT NOT NULL,        
209        last_redeem_error TEXT,
210        FOREIGN KEY(bitcoin_address) REFERENCES swaps(bitcoin_address)
211       ) STRICT;
212
213       CREATE TABLE IF NOT EXISTS swap_refunds (
214        bitcoin_address TEXT NOT NULL,        
215        refund_tx_id TEXT NOT NULL,
216        PRIMARY KEY (bitcoin_address, refund_tx_id),
217        FOREIGN KEY(bitcoin_address) REFERENCES swaps(bitcoin_address)    
218       ) STRICT;
219       
220       INSERT INTO swaps
221        (
222         bitcoin_address, 
223         created_at,
224         lock_height,
225         payment_hash,
226         preimage,
227         private_key,
228         public_key,
229         swapper_public_key,
230         script,
231         min_allowed_deposit,
232         max_allowed_deposit
233        )
234        SELECT 
235         bitcoin_address, 
236         created_at,
237         lock_height,
238         payment_hash,
239         preimage,
240         private_key,
241         public_key,
242         swapper_public_key,
243         script,
244         min_allowed_deposit,
245         max_allowed_deposit         
246        FROM old_swaps;        
247
248       INSERT INTO swaps_info
249        (
250         bitcoin_address,
251         bolt11,
252         paid_sats,
253         unconfirmed_sats,
254         confirmed_sats,
255         status,         
256         unconfirmed_tx_ids,
257         confirmed_tx_ids,
258         last_redeem_error
259        )
260        SELECT 
261         bitcoin_address,
262         bolt11,
263         paid_sats,
264         unconfirmed_sats,
265         confirmed_sats,
266         status,         
267         unconfirmed_tx_ids,
268         confirmed_tx_ids,
269         last_redeem_error
270        FROM old_swaps;
271
272       DROP TABLE old_swaps;            
273       ",
274
275       "
276       CREATE TABLE IF NOT EXISTS sync_versions (
277        last_version INTEGER NOT NULL,
278        data BLOB NOT NULL,
279        created_at TEXT DEFAULT CURRENT_TIMESTAMP
280       ) STRICT;
281       ",
282
283       "
284       CREATE TABLE IF NOT EXISTS sync.swaps (
285        bitcoin_address TEXT PRIMARY KEY NOT NULL,
286        created_at INTEGER DEFAULT CURRENT_TIMESTAMP,
287        lock_height INTEGER NOT NULL,
288        payment_hash BLOB NOT NULL UNIQUE,
289        preimage BLOB NOT NULL UNIQUE,
290        private_key BLOB NOT NULL UNIQUE,
291        public_key BLOB NOT NULL UNIQUE,
292        swapper_public_key BLOB NOT NULL UNIQUE,
293        script BLOB NOT NULL UNIQUE,
294        min_allowed_deposit INTEGER NOT NULL,
295        max_allowed_deposit INTEGER NOT NULL
296       ) STRICT;
297
298       ALTER TABLE swaps_info RENAME TO old_swaps_info;
299
300       CREATE TABLE IF NOT EXISTS swaps_info (
301        bitcoin_address TEXT PRIMARY KEY NOT NULL,
302        bolt11 TEXT,
303        paid_sats INTEGER NOT NULL DEFAULT 0,
304        unconfirmed_sats INTEGER NOT NULL DEFAULT 0,
305        confirmed_sats INTEGER NOT NULL DEFAULT 0,
306        status INTEGER NOT NULL DEFAULT 0,
307        unconfirmed_tx_ids TEXT NOT NULL,
308        confirmed_tx_ids TEXT NOT NULL,
309        last_redeem_error TEXT
310       ) STRICT;
311
312       ALTER TABLE swap_refunds RENAME TO old_swap_refunds;
313       CREATE TABLE IF NOT EXISTS sync.swap_refunds (
314        bitcoin_address TEXT NOT NULL,
315        refund_tx_id TEXT NOT NULL,
316        PRIMARY KEY (bitcoin_address, refund_tx_id)
317       ) STRICT;
318
319       INSERT INTO sync.swaps
320        (
321         bitcoin_address,
322         created_at,
323         lock_height,
324         payment_hash,
325         preimage,
326         private_key,
327         public_key,
328         swapper_public_key,
329         script,
330         min_allowed_deposit,
331         max_allowed_deposit
332        )
333        SELECT
334         bitcoin_address,
335         created_at,
336         lock_height,
337         payment_hash,
338         preimage,
339         private_key,
340         public_key,
341         swapper_public_key,
342         script,
343         min_allowed_deposit,
344         max_allowed_deposit
345        FROM swaps
346        WHERE bitcoin_address NOT IN (SELECT bitcoin_address FROM sync.swaps);
347
348        INSERT INTO swaps_info select * from old_swaps_info;
349        INSERT INTO sync.swap_refunds select * from old_swap_refunds where bitcoin_address in (select bitcoin_address from sync.swap_refunds);
350        DROP TABLE old_swaps_info;
351        DROP TABLE old_swap_refunds;
352        DROP TABLE swaps;
353
354        ALTER TABLE payments_external_info RENAME TO old_payments_external_info;
355        CREATE TABLE IF NOT EXISTS sync.payments_external_info (
356         payment_id TEXT NOT NULL PRIMARY KEY,
357         lnurl_success_action TEXT,
358         ln_address TEXT,
359         lnurl_metadata TEXT
360        ) STRICT;
361
362        INSERT INTO sync.payments_external_info
363         SELECT * FROM old_payments_external_info where payment_id not in (select payment_id from sync.payments_external_info);
364
365         DROP TABLE old_payments_external_info;
366        ",
367
368        "
369        CREATE TABLE IF NOT EXISTS sync.reverse_swaps (
370         id TEXT PRIMARY KEY NOT NULL,
371         created_at_block_height INTEGER NOT NULL,
372         preimage BLOB NOT NULL UNIQUE,
373         private_key BLOB NOT NULL UNIQUE,
374         claim_pubkey TEXT NOT NULL,
375         timeout_block_height INTEGER NOT NULL,
376         invoice TEXT NOT NULL UNIQUE,
377         onchain_amount_sat INTEGER NOT NULL,
378         sat_per_vbyte INTEGER NOT NULL,
379         redeem_script TEXT NOT NULL
380        ) STRICT;
381
382        CREATE TABLE IF NOT EXISTS reverse_swaps_info (
383         id TEXT PRIMARY KEY NOT NULL,
384         status TEXT NOT NULL
385        ) STRICT;
386        ",
387
388        //sync & backup (moved to sync migration function below)
389        "
390        SELECT 1;
391        ",
392        "
393        DROP TABLE sync_versions;
394        CREATE TABLE IF NOT EXISTS sync_versions (
395         last_version INTEGER NOT NULL,
396         data BLOB NOT NULL,
397         created_at TEXT DEFAULT CURRENT_TIMESTAMP
398        ) STRICT;
399       ",       
400       // Swaps synchronization: Add sync table that stores the fees used in swaps
401       "
402       CREATE TABLE IF NOT EXISTS sync.swaps_fees (
403        bitcoin_address TEXT PRIMARY KEY NOT NULL,
404        created_at TEXT DEFAULT CURRENT_TIMESTAMP NOT NULL,
405        channel_opening_fees TEXT NOT NULL
406       ) STRICT;
407       ",
408       "
409       ALTER TABLE channels ADD COLUMN funding_outnum INTEGER;
410       ",
411       "
412       ALTER TABLE payments RENAME COLUMN pending TO status;
413       UPDATE payments SET status = CASE WHEN status = 1 THEN 0 ELSE 1 END;
414       ",
415       "SELECT 1;", // Placeholder statement, to avoid that column is added twice (from sync fn below and here)
416       "ALTER TABLE channels ADD COLUMN alias_local TEXT;",
417       "ALTER TABLE channels ADD COLUMN alias_remote TEXT;",
418       "ALTER TABLE channels ADD COLUMN closing_txid TEXT;", 
419       "
420       ALTER TABLE reverse_swaps_info ADD COLUMN lockup_txid TEXT;
421       ALTER TABLE reverse_swaps_info ADD COLUMN claim_txid TEXT;",
422       "
423       ALTER TABLE swaps_info RENAME COLUMN paid_sats TO paid_msat;
424       ",
425       "ALTER TABLE swaps_info ADD COLUMN confirmed_at INTEGER;",
426       "
427       ALTER TABLE swaps_info ADD COLUMN total_incoming_txs INTEGER;
428       UPDATE swaps_info SET status = 0;
429       ",
430       "SELECT 1;",
431       "
432        ALTER TABLE channels ADD COLUMN local_balance_msat INTEGER;
433        UPDATE channels SET local_balance_msat = spendable_msat;
434       ",
435       "DELETE FROM cached_items WHERE key = 'gl_credentials'",
436       "DELETE FROM cached_items WHERE key = 'last_sync_time'",
437       "DELETE FROM cached_items WHERE key = 'node_state'",
438       "
439       CREATE TABLE IF NOT EXISTS send_pays (
440        created_index INTEGER PRIMARY KEY NOT NULL,
441        updated_index INTEGER,
442        groupid INTEGER NOT NULL,
443        partid INTEGER,
444        payment_hash BLOB NOT NULL,
445        status INTEGER NOT NULL,
446        amount_msat INTEGER,
447        destination BLOB,
448        created_at INTEGER NOT NULL,
449        amount_sent_msat INTEGER,
450        label TEXT,
451        bolt11 TEXT,
452        description TEXT,
453        bolt12 TEXT,
454        payment_preimage BLOB,
455        erroronion BLOB
456       ) STRICT;
457       ",
458       "DELETE FROM payments",
459       "DELETE FROM cached_items WHERE key = 'sync_state'",
460       // Delete send_pays, re-create it with groupid column as TEXT
461       "
462       DROP TABLE send_pays;
463
464       CREATE TABLE send_pays (
465        created_index INTEGER PRIMARY KEY NOT NULL,
466        updated_index INTEGER,
467        groupid TEXT NOT NULL,
468        partid INTEGER,
469        payment_hash BLOB NOT NULL,
470        status INTEGER NOT NULL,
471        amount_msat INTEGER,
472        destination BLOB,
473        created_at INTEGER NOT NULL,
474        amount_sent_msat INTEGER,
475        label TEXT,
476        bolt11 TEXT,
477        description TEXT,
478        bolt12 TEXT,
479        payment_preimage BLOB,
480        erroronion BLOB
481       ) STRICT;
482
483       DELETE FROM cached_items WHERE key = 'sync_state';
484       ",
485       "ALTER TABLE payments ADD COLUMN is_pseudo INTEGER DEFAULT 0 NOT NULL;
486        DELETE FROM payments;
487        DELETE FROM cached_items WHERE key = 'sync_state';
488       "
489    ]
490}
491
492pub(crate) fn current_sync_migrations() -> Vec<&'static str> {
493    vec![
494        "
495        CREATE TABLE IF NOT EXISTS open_channel_payment_info (
496         payment_hash TEXT PRIMARY KEY NOT NULL,
497         payer_amount_msat INTEGER NOT NULL
498        ) STRICT;
499
500       ",
501        // Swaps synchronization: Add sync table that stores the fees used in swaps
502        "
503       CREATE TABLE IF NOT EXISTS swaps_fees (
504        bitcoin_address TEXT PRIMARY KEY NOT NULL,
505        created_at TEXT DEFAULT CURRENT_TIMESTAMP NOT NULL,
506        channel_opening_fees TEXT NOT NULL
507       ) STRICT;
508       ",
509        // Create all sync tables and triggers, if they don't already exist
510        "
511        CREATE TABLE IF NOT EXISTS swaps (
512         bitcoin_address TEXT PRIMARY KEY NOT NULL,
513         created_at INTEGER DEFAULT CURRENT_TIMESTAMP,
514         lock_height INTEGER NOT NULL,
515         payment_hash BLOB NOT NULL UNIQUE,
516         preimage BLOB NOT NULL UNIQUE,
517         private_key BLOB NOT NULL UNIQUE,
518         public_key BLOB NOT NULL UNIQUE,
519         swapper_public_key BLOB NOT NULL UNIQUE,
520         script BLOB NOT NULL UNIQUE,
521         min_allowed_deposit INTEGER NOT NULL,
522         max_allowed_deposit INTEGER NOT NULL
523        ) STRICT;
524
525        CREATE TABLE IF NOT EXISTS swap_refunds (
526         bitcoin_address TEXT NOT NULL,
527         refund_tx_id TEXT NOT NULL,
528         PRIMARY KEY (bitcoin_address, refund_tx_id)
529        ) STRICT;
530
531        CREATE TABLE IF NOT EXISTS payments_external_info (
532         payment_id TEXT NOT NULL PRIMARY KEY,
533         lnurl_success_action TEXT,
534         ln_address TEXT,
535         lnurl_metadata TEXT
536        ) STRICT;
537
538        CREATE TABLE IF NOT EXISTS reverse_swaps (
539         id TEXT PRIMARY KEY NOT NULL,
540         created_at_block_height INTEGER NOT NULL,
541         preimage BLOB NOT NULL UNIQUE,
542         private_key BLOB NOT NULL UNIQUE,
543         claim_pubkey TEXT NOT NULL,
544         timeout_block_height INTEGER NOT NULL,
545         invoice TEXT NOT NULL UNIQUE,
546         onchain_amount_sat INTEGER NOT NULL,
547         sat_per_vbyte INTEGER NOT NULL,
548         redeem_script TEXT NOT NULL
549        ) STRICT;
550
551        CREATE TABLE IF NOT EXISTS sync_requests (
552         id INTEGER PRIMARY KEY AUTOINCREMENT,
553         changed_table TEXT NOT NULL
554        ) STRICT;
555
556        CREATE TRIGGER IF NOT EXISTS sync_requests_swaps
557         AFTER INSERT ON swaps
558        BEGIN
559         INSERT INTO sync_requests(changed_table) VALUES('swaps');
560        END;
561
562        CREATE TRIGGER IF NOT EXISTS sync_requests_swap_refunds
563         AFTER INSERT ON swap_refunds
564        BEGIN
565         INSERT INTO sync_requests(changed_table) VALUES('swap_refunds');
566        END;
567
568        CREATE TRIGGER IF NOT EXISTS sync_requests_reverse_swaps
569         AFTER INSERT ON reverse_swaps
570        BEGIN
571         INSERT INTO sync_requests(changed_table) VALUES('reverse_swaps');
572        END;
573        ",
574        "
575        ALTER TABLE payments_external_info RENAME TO payments_external_info_old;
576
577        CREATE TABLE payments_external_info (
578         payment_id TEXT NOT NULL PRIMARY KEY,
579         lnurl_success_action TEXT,
580         ln_address TEXT,
581         lnurl_metadata TEXT,
582         lnurl_withdraw_endpoint TEXT
583        ) STRICT;
584
585        INSERT INTO payments_external_info
586         (payment_id, lnurl_success_action, ln_address, lnurl_metadata, lnurl_withdraw_endpoint)
587         SELECT
588          payment_id,
589          lnurl_success_action,
590          ln_address,
591          lnurl_metadata,
592          NULL
593         FROM payments_external_info_old;
594
595        DROP TABLE payments_external_info_old;
596
597        CREATE TRIGGER IF NOT EXISTS sync_requests_payments_external_info
598         AFTER INSERT ON payments_external_info
599        BEGIN
600         INSERT INTO sync_requests(changed_table) VALUES('payments_external_info');
601        END;
602        ",
603        "ALTER TABLE payments_external_info ADD COLUMN failed_amount_msat INTEGER;",
604        "ALTER TABLE payments_external_info RENAME COLUMN failed_amount_msat TO attempted_amount_msat;",
605        "
606        CREATE TRIGGER IF NOT EXISTS sync_requests_payments_external_info_update
607         AFTER UPDATE ON payments_external_info
608        BEGIN
609         INSERT INTO sync_requests(changed_table) VALUES('payments_external_info');
610        END;
611
612        ALTER TABLE payments_external_info ADD COLUMN attempted_error TEXT;
613        ",
614        "
615         CREATE TABLE IF NOT EXISTS payments_metadata (
616          payment_id TEXT NOT NULL PRIMARY KEY,
617          metadata TEXT,
618          updated_at TEXT DEFAULT CURRENT_TIMESTAMP
619         ) STRICT;
620        ",
621       "ALTER TABLE payments_external_info ADD COLUMN lnurl_pay_domain TEXT;",
622       "ALTER TABLE open_channel_payment_info ADD COLUMN open_channel_bolt11 TEXT;",
623
624       // Convert sat_per_vbyte to nullable, to keep the field for older clients, who still rely on it.
625       // Add receive_amount_sat, which is used by newer clients and replaces sat_per_vbyte.
626       // Make receive_amount_sat nullable, so older clients can still work with an upgraded sync DB.
627       "
628       ALTER TABLE reverse_swaps RENAME TO reverse_swaps_old;
629
630       CREATE TABLE reverse_swaps (
631         id TEXT PRIMARY KEY NOT NULL,
632         created_at_block_height INTEGER NOT NULL,
633         preimage BLOB NOT NULL UNIQUE,
634         private_key BLOB NOT NULL UNIQUE,
635         claim_pubkey TEXT NOT NULL,
636         timeout_block_height INTEGER NOT NULL,
637         invoice TEXT NOT NULL UNIQUE,
638         onchain_amount_sat INTEGER NOT NULL,
639         sat_per_vbyte INTEGER,
640         receive_amount_sat INTEGER,
641         redeem_script TEXT NOT NULL
642       ) STRICT;
643
644       INSERT INTO reverse_swaps
645         (id, created_at_block_height, preimage, private_key, claim_pubkey, timeout_block_height, invoice, onchain_amount_sat, sat_per_vbyte, redeem_script)
646         SELECT
647           id,
648           created_at_block_height,
649           preimage,
650           private_key,
651           claim_pubkey,
652           timeout_block_height,
653           invoice,
654           onchain_amount_sat,
655           sat_per_vbyte,
656           redeem_script
657         FROM reverse_swaps_old;
658
659       DROP TABLE reverse_swaps_old;
660       ",
661       "
662        CREATE TRIGGER IF NOT EXISTS sync_payments_metadata
663         AFTER INSERT ON payments_metadata
664        BEGIN
665         INSERT INTO sync_requests(changed_table) VALUES('payments_metadata');
666        END;
667       ",
668        // Add max absolute value payable by the swapper. For existing swaps, initialize it to max_allowed_deposit.
669        "
670        ALTER TABLE swaps ADD COLUMN max_swapper_payable INTEGER NOT NULL DEFAULT 0;
671        UPDATE swaps SET max_swapper_payable = max_allowed_deposit;
672        ",
673        "ALTER TABLE payments_external_info ADD COLUMN lnurl_pay_comment TEXT;",
674	]
675}