2021-12-04 12:23:56 +01:00
|
|
|
#include "config.h"
|
2021-12-13 23:44:32 +01:00
|
|
|
#include <ccan/array_size/array_size.h>
|
2021-12-07 17:05:29 +01:00
|
|
|
#include <common/onion.h>
|
2021-12-13 23:44:32 +01:00
|
|
|
#include <common/type_to_string.h>
|
2021-09-16 07:00:42 +02:00
|
|
|
#include <lightningd/channel.h>
|
2020-03-19 00:35:59 +01:00
|
|
|
#include <lightningd/coin_mvts.h>
|
|
|
|
#include <lightningd/notification.h>
|
2021-12-13 23:44:32 +01:00
|
|
|
#include <lightningd/peer_control.h>
|
|
|
|
|
2020-03-19 00:35:59 +01:00
|
|
|
|
|
|
|
void notify_channel_mvt(struct lightningd *ld, const struct channel_coin_mvt *mvt)
|
|
|
|
{
|
|
|
|
const struct coin_mvt *cm;
|
|
|
|
u32 timestamp;
|
|
|
|
|
|
|
|
timestamp = time_now().ts.tv_sec;
|
2021-11-29 08:10:06 +01:00
|
|
|
cm = finalize_channel_mvt(mvt, mvt, chainparams->lightning_hrp,
|
2021-12-01 17:34:58 +01:00
|
|
|
timestamp, &ld->id);
|
|
|
|
|
2020-03-19 00:35:59 +01:00
|
|
|
notify_coin_mvt(ld, cm);
|
|
|
|
}
|
|
|
|
|
|
|
|
void notify_chain_mvt(struct lightningd *ld, const struct chain_coin_mvt *mvt)
|
|
|
|
{
|
|
|
|
const struct coin_mvt *cm;
|
|
|
|
u32 timestamp;
|
|
|
|
|
|
|
|
timestamp = time_now().ts.tv_sec;
|
2021-11-29 08:10:06 +01:00
|
|
|
cm = finalize_chain_mvt(mvt, mvt, chainparams->onchain_hrp,
|
2021-12-01 17:34:58 +01:00
|
|
|
timestamp, &ld->id);
|
2020-03-19 00:35:59 +01:00
|
|
|
notify_coin_mvt(ld, cm);
|
|
|
|
}
|
2020-04-04 01:58:04 +02:00
|
|
|
|
2020-04-14 21:01:18 +02:00
|
|
|
struct channel_coin_mvt *new_channel_mvt_invoice_hin(const tal_t *ctx,
|
|
|
|
struct htlc_in *hin,
|
|
|
|
struct channel *channel)
|
|
|
|
{
|
2020-09-09 09:20:53 +02:00
|
|
|
return new_channel_coin_mvt(ctx, &channel->cid,
|
2021-12-29 01:09:56 +01:00
|
|
|
&hin->payment_hash, NULL,
|
2021-12-06 19:24:20 +01:00
|
|
|
hin->msat, new_tag_arr(ctx, INVOICE),
|
2021-12-07 17:05:29 +01:00
|
|
|
true, AMOUNT_MSAT(0));
|
2020-04-14 21:01:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
struct channel_coin_mvt *new_channel_mvt_routed_hin(const tal_t *ctx,
|
|
|
|
struct htlc_in *hin,
|
|
|
|
struct channel *channel)
|
|
|
|
{
|
2021-12-07 17:05:29 +01:00
|
|
|
struct amount_msat fees_collected;
|
|
|
|
|
|
|
|
if (!hin->payload)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (!amount_msat_sub(&fees_collected, hin->msat,
|
|
|
|
hin->payload->amt_to_forward))
|
|
|
|
return NULL;
|
|
|
|
|
2020-09-09 09:20:53 +02:00
|
|
|
return new_channel_coin_mvt(ctx, &channel->cid,
|
2021-12-29 01:09:56 +01:00
|
|
|
&hin->payment_hash, NULL,
|
2021-12-06 19:24:20 +01:00
|
|
|
hin->msat, new_tag_arr(ctx, ROUTED),
|
2021-12-07 17:05:29 +01:00
|
|
|
true, fees_collected);
|
2020-04-14 21:01:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
struct channel_coin_mvt *new_channel_mvt_invoice_hout(const tal_t *ctx,
|
|
|
|
struct htlc_out *hout,
|
|
|
|
struct channel *channel)
|
|
|
|
{
|
2020-09-09 09:20:53 +02:00
|
|
|
return new_channel_coin_mvt(ctx, &channel->cid,
|
2021-12-29 01:09:56 +01:00
|
|
|
&hout->payment_hash, &hout->partid,
|
2021-12-06 19:24:20 +01:00
|
|
|
hout->msat, new_tag_arr(ctx, INVOICE),
|
2021-12-07 21:09:28 +01:00
|
|
|
false, hout->fees);
|
2020-04-14 21:01:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
struct channel_coin_mvt *new_channel_mvt_routed_hout(const tal_t *ctx,
|
|
|
|
struct htlc_out *hout,
|
|
|
|
struct channel *channel)
|
|
|
|
{
|
2020-09-09 09:20:53 +02:00
|
|
|
return new_channel_coin_mvt(ctx, &channel->cid,
|
2021-12-29 01:09:56 +01:00
|
|
|
&hout->payment_hash, NULL,
|
2021-12-06 19:24:20 +01:00
|
|
|
hout->msat, new_tag_arr(ctx, ROUTED),
|
2021-12-07 17:05:29 +01:00
|
|
|
false,
|
2021-12-07 21:09:28 +01:00
|
|
|
hout->fees);
|
2020-04-14 21:01:18 +02:00
|
|
|
}
|
2021-12-13 23:44:32 +01:00
|
|
|
|
|
|
|
void send_account_balance_snapshot(struct lightningd *ld, u32 blockheight)
|
|
|
|
{
|
|
|
|
struct balance_snapshot *snap = tal(NULL, struct balance_snapshot);
|
|
|
|
struct account_balance *bal;
|
|
|
|
struct utxo **utxos;
|
|
|
|
struct channel *chan;
|
|
|
|
struct peer *p;
|
|
|
|
/* Available + reserved utxos are A+, as reserved things have not yet
|
|
|
|
* been spent */
|
|
|
|
enum output_status utxo_states[] = {OUTPUT_STATE_AVAILABLE,
|
|
|
|
OUTPUT_STATE_RESERVED};
|
|
|
|
|
|
|
|
snap->blockheight = blockheight;
|
|
|
|
snap->timestamp = time_now().ts.tv_sec;
|
|
|
|
snap->node_id = &ld->id;
|
|
|
|
|
|
|
|
/* Add the 'wallet' account balance */
|
|
|
|
snap->accts = tal_arr(snap, struct account_balance *, 1);
|
|
|
|
bal = tal(snap, struct account_balance);
|
2021-12-10 16:46:42 +01:00
|
|
|
bal->balance = AMOUNT_MSAT(0);
|
2021-12-13 23:44:32 +01:00
|
|
|
bal->acct_id = WALLET;
|
|
|
|
bal->bip173_name = chainparams->lightning_hrp;
|
|
|
|
|
|
|
|
for (size_t i = 0; i < ARRAY_SIZE(utxo_states); i++) {
|
|
|
|
utxos = wallet_get_utxos(NULL, ld->wallet, utxo_states[i]);
|
|
|
|
for (size_t j = 0; j < tal_count(utxos); j++) {
|
|
|
|
if (!amount_msat_add_sat(&bal->balance,
|
|
|
|
bal->balance, utxos[j]->amount))
|
|
|
|
fatal("Overflow adding node balance");
|
|
|
|
}
|
|
|
|
tal_free(utxos);
|
|
|
|
}
|
|
|
|
snap->accts[0] = bal;
|
|
|
|
|
|
|
|
/* Add channel balances */
|
|
|
|
list_for_each(&ld->peers, p, list) {
|
|
|
|
list_for_each(&p->channels, chan, list) {
|
|
|
|
if (channel_active(chan)) {
|
|
|
|
bal = tal(snap, struct account_balance);
|
|
|
|
bal->bip173_name = chainparams->lightning_hrp;
|
|
|
|
bal->acct_id = type_to_string(bal,
|
|
|
|
struct channel_id,
|
|
|
|
&chan->cid);
|
|
|
|
bal->balance = chan->our_msat;
|
|
|
|
tal_arr_expand(&snap->accts, bal);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
notify_balance_snapshot(ld, snap);
|
|
|
|
tal_free(snap);
|
|
|
|
}
|