mirror of
https://github.com/ElementsProject/lightning.git
synced 2024-11-19 18:11:28 +01:00
23cd58402a
we weren't making records for 'missed' accounts that had a zero balance at snapshot time (if peer opens channel and is unused) Fixes: #5502 Reported-By: https://github.com/niftynei/cln-logmaid
233 lines
6.8 KiB
C
233 lines
6.8 KiB
C
#ifndef LIGHTNING_PLUGINS_BKPR_RECORDER_H
|
|
#define LIGHTNING_PLUGINS_BKPR_RECORDER_H
|
|
|
|
#include "config.h"
|
|
#include <ccan/tal/tal.h>
|
|
|
|
struct account;
|
|
struct bitcoin_txid;
|
|
struct chain_event;
|
|
struct channel_event;
|
|
struct db;
|
|
enum mvt_tag;
|
|
struct onchain_fee;
|
|
|
|
#define EXTERNAL_ACCT "external"
|
|
#define WALLET_ACCT WALLET
|
|
#define SQLITE_MAX_UINT 0x7FFFFFFFFFFFFFFF
|
|
|
|
struct acct_balance {
|
|
char *currency;
|
|
struct amount_msat credit;
|
|
struct amount_msat debit;
|
|
struct amount_msat balance;
|
|
};
|
|
|
|
struct fee_sum {
|
|
u64 acct_db_id;
|
|
char *acct_name;
|
|
char *currency;
|
|
struct bitcoin_txid *txid;
|
|
struct amount_msat fees_paid;
|
|
};
|
|
|
|
struct txo_pair {
|
|
struct chain_event *txo;
|
|
struct chain_event *spend;
|
|
};
|
|
|
|
struct txo_set {
|
|
struct bitcoin_txid *txid;
|
|
struct txo_pair **pairs;
|
|
};
|
|
|
|
struct rebalance {
|
|
u64 in_ev_id;
|
|
u64 out_ev_id;
|
|
char *in_acct_name;
|
|
char *out_acct_name;
|
|
struct amount_msat rebal_msat;
|
|
struct amount_msat fee_msat;
|
|
};
|
|
|
|
/* Get all accounts */
|
|
struct account **list_accounts(const tal_t *ctx, struct db *db);
|
|
|
|
/* Get all onchain fee records for this account */
|
|
struct onchain_fee **account_onchain_fees(const tal_t *ctx,
|
|
struct db *db,
|
|
struct account *acct);
|
|
|
|
/* Get all channel events for this account */
|
|
struct channel_event **account_get_channel_events(const tal_t *ctx,
|
|
struct db *db,
|
|
struct account *acct);
|
|
|
|
/* Get all channel events, ordered by timestamp */
|
|
struct channel_event **list_channel_events(const tal_t *ctx, struct db *db);
|
|
|
|
/* Get all channel events, order by timestamp.
|
|
*
|
|
* @ctx - context to allocate from
|
|
* @db - database to query
|
|
* @start_time - UNIX timestamp to query after (exclusive)
|
|
* @end_time - UNIX timestamp to query until (inclusive)
|
|
*/
|
|
struct channel_event **list_channel_events_timebox(const tal_t *ctx,
|
|
struct db *db,
|
|
u64 start_time,
|
|
u64 end_time);
|
|
|
|
/* Get all chain events for this account */
|
|
struct chain_event **account_get_chain_events(const tal_t *ctx,
|
|
struct db *db,
|
|
struct account *acct);
|
|
|
|
/* Get all chain events, order by timestamp. */
|
|
struct chain_event **list_chain_events(const tal_t *ctx, struct db *db);
|
|
|
|
/* Get all chain events, order by timestamp.
|
|
*
|
|
* @ctx - context to allocate from
|
|
* @db - database to query
|
|
* @start_time - UNIX timestamp to query after (exclusive)
|
|
* @end_time - UNIX timestamp to query until (inclusive)
|
|
*/
|
|
struct chain_event **list_chain_events_timebox(const tal_t *ctx,
|
|
struct db *db,
|
|
u64 start_time,
|
|
u64 end_time);
|
|
|
|
/* Calculate the balances for an account
|
|
*
|
|
* @calc_sum - compute the total balance. error if negative
|
|
* @skip_ignored - don't include ignored payments in the balance sum
|
|
* */
|
|
char *account_get_balance(const tal_t *ctx,
|
|
struct db *db,
|
|
const char *acct_name,
|
|
bool calc_sum,
|
|
bool skip_ignored,
|
|
struct acct_balance ***balances,
|
|
bool *account_exists);
|
|
|
|
/* Get chain fees for account */
|
|
struct onchain_fee **account_get_chain_fees(const tal_t *ctx, struct db *db,
|
|
struct account *acct);
|
|
|
|
/* Find a chain event by its database id */
|
|
struct chain_event *find_chain_event_by_id(const tal_t *ctx,
|
|
struct db *db,
|
|
u64 event_db_id);
|
|
|
|
/* Find the utxos for this account.
|
|
*
|
|
* Returns true if chain is complete:
|
|
* (all outputs terminate either to wallet or external)
|
|
*/
|
|
bool find_txo_chain(const tal_t *ctx,
|
|
struct db *db,
|
|
struct account *acct,
|
|
struct txo_set ***sets);
|
|
|
|
/* List all chain fees, for all accounts */
|
|
struct onchain_fee **list_chain_fees(const tal_t *ctx, struct db *db);
|
|
|
|
/* Get all chain fees, order by timestamp.
|
|
*
|
|
* @ctx - context to allocate from
|
|
* @db - database to query
|
|
* @start_time - UNIX timestamp to query after (exclusive)
|
|
* @end_time - UNIX timestamp to query until (inclusive)
|
|
*/
|
|
struct onchain_fee **list_chain_fees_timebox(const tal_t *ctx, struct db *db,
|
|
u64 start_time, u64 end_time);
|
|
|
|
/* Returns a list of sums of the fees we've recorded for every txid
|
|
* for the given account */
|
|
struct fee_sum **find_account_onchain_fees(const tal_t *ctx,
|
|
struct db *db,
|
|
struct account *acct);
|
|
|
|
/* Final all the onchain fees */
|
|
struct fee_sum **calculate_onchain_fee_sums(const tal_t *ctx, struct db *db);
|
|
|
|
/* Find the last timestamp for the onchain fees for this txid + account */
|
|
u64 onchain_fee_last_timestamp(struct db *db,
|
|
u64 acct_db_id,
|
|
struct bitcoin_txid *txid);
|
|
/* Add the given account to the database */
|
|
void account_add(struct db *db, struct account *acct);
|
|
/* Given an account name, find that account record */
|
|
struct account *find_account(const tal_t *ctx,
|
|
struct db *db,
|
|
const char *name);
|
|
|
|
/* Find the account that was closed by this txid.
|
|
* Returns NULL if none */
|
|
struct account *find_close_account(const tal_t *ctx,
|
|
struct db *db,
|
|
struct bitcoin_txid *txid);
|
|
|
|
/* Some events update account information */
|
|
void maybe_update_account(struct db *db,
|
|
struct account *acct,
|
|
struct chain_event *e,
|
|
const enum mvt_tag *tags,
|
|
u32 closed_count,
|
|
struct node_id *peer_id);
|
|
|
|
/* Update our onchain fees now? */
|
|
char *maybe_update_onchain_fees(const tal_t *ctx,
|
|
struct db *db,
|
|
struct bitcoin_txid *txid);
|
|
|
|
/* We calculate onchain fees for channel closes a bit different */
|
|
char *update_channel_onchain_fees(const tal_t *ctx,
|
|
struct db *db,
|
|
struct account *acct);
|
|
|
|
/* Have all the outputs for this account's close tx
|
|
* been resolved onchain? If so, update the account with the
|
|
* highest blockheight that has a resolving tx in it.
|
|
*
|
|
* The point of this is to allow us to prune data, eventually */
|
|
void maybe_mark_account_onchain(struct db *db, struct account *acct);
|
|
|
|
/* We fetch invoice desc data after the fact and then update it
|
|
* Updates both the chain_event and channel_event tables for all
|
|
* matching payment_hashes
|
|
* */
|
|
void add_payment_hash_desc(struct db *db,
|
|
struct sha256 *payment_hash,
|
|
const char *desc);
|
|
|
|
/* When we make external deposits from the wallet, we don't
|
|
* count them until any output that was spent *into* them is
|
|
* confirmed onchain.
|
|
*
|
|
* This method updates the blockheight on these events to the
|
|
* height an input was spent into */
|
|
void maybe_closeout_external_deposits(struct db *db, struct chain_event *ev);
|
|
|
|
/* Keep track of rebalancing payments (payments paid to/from ourselves.
|
|
* Returns true if was rebalance */
|
|
void maybe_record_rebalance(struct db *db,
|
|
struct channel_event *out);
|
|
|
|
/* List all rebalances */
|
|
struct rebalance **list_rebalances(const tal_t *ctx, struct db *db);
|
|
|
|
/* Log a channel event */
|
|
void log_channel_event(struct db *db,
|
|
const struct account *acct,
|
|
struct channel_event *e);
|
|
|
|
/* Log a chain event.
|
|
* Returns true if inserted, false if already exists */
|
|
bool log_chain_event(struct db *db,
|
|
const struct account *acct,
|
|
struct chain_event *e);
|
|
|
|
#endif /* LIGHTNING_PLUGINS_BKPR_RECORDER_H */
|