diff --git a/loopdb/sqlc/migrations/000001_swap.down.sql b/loopdb/sqlc/migrations/000001_swap.down.sql new file mode 100644 index 00000000..625842ca --- /dev/null +++ b/loopdb/sqlc/migrations/000001_swap.down.sql @@ -0,0 +1,7 @@ +DROP INDEX IF EXISTS updates_swap_hash_idx; + +DROP TABLE IF EXISTS swaps; +DROP TABLE IF EXISTS loopin_swaps; +DROP TABLE IF EXISTS loopout_swaps; +DROP TABLE IF EXISTS swap_updates; +DROP TABLE IF EXISTS htlc_keys; diff --git a/loopdb/sqlc/migrations/000001_swap.up.sql b/loopdb/sqlc/migrations/000001_swap.up.sql new file mode 100644 index 00000000..f18ffdfb --- /dev/null +++ b/loopdb/sqlc/migrations/000001_swap.up.sql @@ -0,0 +1,166 @@ +-- swaps stores all base data that is shared between loop-outs and loop-ins, +-- as well as the updates. +CREATE TABLE swaps ( + -- id is the autoincrementing primary key. + id INTEGER PRIMARY KEY, + + -- swap_hash is the randomly generated hash of the swap, which is used + -- as the swap identifier for the clients. + swap_hash BLOB NOT NULL UNIQUE, + + -- preimage is the preimage for swap htlc. + preimage BLOB NOT NULL UNIQUE, + + -- initiation_time is the creation time (when stored) of the contract. + initiation_time TIMESTAMP NOT NULL, + + -- amount_requested is the requested swap amount in sats. + amount_requested BIGINT NOT NULL, + + -- cltv_expiry defines the on-chain HTLC's CLTV. In specific, + -- * For loop in swap, this value must be greater than the off-chain + -- payment's CLTV. + -- * For loop out swap, this value must be smaller than the off-chain + -- payment's CLTV. + cltv_expiry INTEGER NOT NULL, + + -- max_miner_fee is the maximum in on-chain fees that we are willing to + -- spend. + max_miner_fee BIGINT NOT NULL, + + -- max_swap_fee is the maximum we are willing to pay the server for the + -- swap. + max_swap_fee BIGINT NOT NULL, + + -- initiation_height is the block height at which the swap was initiated. + initiation_height INTEGER NOT NULL, + + -- protocol_version is the protocol version that the swap was created with. + -- Note that this version is not upgraded if the client upgrades or + -- downgrades their protocol version mid-swap. + protocol_version INTEGER NOT NULL, + + -- label contains an optional label for the swap. + label TEXT NOT NULL +); + + +-- swap_updates stores timestamps and states of swap updates. +CREATE TABLE swap_updates ( + -- id is the autoincrementing primary key. + id INTEGER PRIMARY KEY, + + -- swap_id is the foreign key referencing the swap in the swaps table. + swap_hash BLOB NOT NULL, + + -- update_timestamp is the timestamp the swap was updated at. + update_timestamp TIMESTAMP NOT NULL, + + -- update_state is the state the swap was in at a given timestamp. + update_state INTEGER NOT NULL, + + -- htlc_txhash is the hash of the transaction that creates the htlc. + htlc_txhash TEXT NOT NULL, + + -- server_cost is the amount paid to the server. + server_cost BIGINT NOT NULL DEFAULT 0, + + -- onchain_cost is the amount paid to miners for the onchain tx. + onchain_cost BIGINT NOT NULL DEFAULT 0, + + -- offchain_cost is the amount paid in routing fees. + offchain_cost BIGINT NOT NULL DEFAULT 0, + + -- Foreign key constraint to ensure that swap_id references an existing swap. + FOREIGN KEY (swap_hash) REFERENCES swaps (swap_hash) +); + + +-- loopin_swaps stores the loop-in specific data. +CREATE TABLE loopin_swaps ( + -- swap_hash points to the parent swap hash. + swap_hash BLOB PRIMARY KEY REFERENCES swaps(swap_hash), + + -- htlc_conf_target specifies the targeted confirmation target for the + -- sweep transaction. + htlc_conf_target INTEGER NOT NULL, + + -- last_hop is an optional parameter that specifies the last hop to be + -- used for a loop in swap. + last_hop BLOB, + + -- external_htlc specifies whether the htlc is published by an external + -- source. + external_htlc BOOLEAN NOT NULL +); + +-- loopout_swaps stores the loop-out specific data. +CREATE TABLE loopout_swaps ( + -- swap_hash points to the parent swap hash. + swap_hash BLOB PRIMARY KEY REFERENCES swaps(swap_hash), + + -- dest_address is the destination address of the loop out swap. + dest_address TEXT NOT NULL, + + -- SwapInvoice is the invoice that is to be paid by the client to + -- initiate the loop out swap. + swap_invoice TEXT NOT NULL, + + -- MaxSwapRoutingFee is the maximum off-chain fee in msat that may be + -- paid for the swap payment to the server. + max_swap_routing_fee BIGINT NOT NULL, + + -- SweepConfTarget specifies the targeted confirmation target for the + -- client sweep tx. + sweep_conf_target INTEGER NOT NULL, + + -- HtlcConfirmations is the number of confirmations we require the on + -- chain htlc to have before proceeding with the swap. + htlc_confirmations INTEGER NOT NULL, + + -- OutgoingChanSet is the set of short ids of channels that may be used. + -- If empty, any channel may be used. + outgoing_chan_set TEXT NOT NULL, + + -- PrepayInvoice is the invoice that the client should pay to the + -- server that will be returned if the swap is complete. + prepay_invoice TEXT NOT NULL, + + -- MaxPrepayRoutingFee is the maximum off-chain fee in msat that may be + -- paid for the prepayment to the server. + max_prepay_routing_fee BIGINT NOT NULL, + + -- SwapPublicationDeadline is a timestamp that the server commits to + -- have the on-chain swap published by. It is set by the client to + -- allow the server to delay the publication in exchange for possibly + -- lower fees. + publication_deadline TIMESTAMP NOT NULL +); + + +-- htlc_keys stores public and private keys used when construcing swap HTLCs. +CREATE TABLE htlc_keys ( + -- swap_hash points to the parent swap hash. + swap_hash BLOB PRIMARY KEY REFERENCES swaps(swap_hash), + + -- sender_script_pubkey is the sender's script pubkey used in the HTLC. + sender_script_pubkey BLOB NOT NULL, + + -- receiver_script_pubkey is the receivers's script pubkey used in the HTLC. + receiver_script_pubkey BLOB NOT NULL, + + -- sender_internal_pubkey is the public key for the sender_internal_key. + sender_internal_pubkey BLOB, + + -- receiver_internal_pubkey is the public key for the receiver_internal_key. + receiver_internal_pubkey BLOB, + + -- client_key_family is the family of key being identified. + client_key_family INTEGER NOT NULL, + + -- client_key_index is the precise index of the key being identified. + client_key_index INTEGER NOT NULL +); + + +CREATE INDEX IF NOT EXISTS updates_swap_hash_idx ON swap_updates(swap_hash); \ No newline at end of file diff --git a/loopdb/sqlc/migrations/000002_liquidity_params.down.sql b/loopdb/sqlc/migrations/000002_liquidity_params.down.sql new file mode 100644 index 00000000..7339ddb8 --- /dev/null +++ b/loopdb/sqlc/migrations/000002_liquidity_params.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS liquidity_params; \ No newline at end of file diff --git a/loopdb/sqlc/migrations/000002_liquidity_params.up.sql b/loopdb/sqlc/migrations/000002_liquidity_params.up.sql new file mode 100644 index 00000000..d37f838c --- /dev/null +++ b/loopdb/sqlc/migrations/000002_liquidity_params.up.sql @@ -0,0 +1,6 @@ +-- liquidity_params stores the liquidity parameters for autoloop as a single row +-- with a blob column, which is the serialized proto request. +CREATE TABLE liquidity_params ( + id INTEGER PRIMARY KEY, + params BLOB +); \ No newline at end of file