Bookkeeper migration part 1: the cleanups - #8445

Merged
rustyrussell merged 29 commits into
ElementsProject:masterfrom
rustyrussell:bkpr-part1
Aug 14, 2025
Merged

Bookkeeper migration part 1: the cleanups#8445
rustyrussell merged 29 commits into
ElementsProject:masterfrom
rustyrussell:bkpr-part1

Conversation

@rustyrussell

Copy link
Copy Markdown
Collaborator

This does various cleanups in anticipation of moving the audit log of moves into the core.

The next part will do the rest (unfortunately, that's a giant PR because we need to do the bookeeper -> internal migration at the end, and we must do that before anyone records coin movements).

@niftyneiniftynei left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Easy build error from CI, otherwise lgtm tho I wish the currency types were justifiable to be left in :)

Include(s) from common/coin_mvt.h duplicated in common/coin_mvt.c:
#include <bitcoin/tx.h>

Comment threadcommon/coin_mvt.c
assert(mvt_tags_valid(tags));

/* We put the *primary* tag first */
for (size_t i = 0; i < NUM_MVT_TAGS; i++) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh this is fun.

Comment threadcommon/coin_mvt.h

enum mvt_tag *new_tag_arr(const tal_t *ctx, enum mvt_tag tag);
/* Convenience macro for creating tag bitmaps */
#define mk_mvt_tags(...) mk_mvt_tags_(__VA_ARGS__, 999)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is cool.

Comment threadplugins/bkpr/test/run-recorder.c Outdated

@cdeckercdecker left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ACK

Comment threadcommon/coin_mvt.h Outdated
We can use these to test migrations.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Print the error!
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This means it doesn't have to be a tal ptr.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This makes our final balance not match our wallet:
1. We only spend the anchor when we need to boost the commitment tx,
which we don't always do (sometimes the peer does, sometimes it's
not worth it).
2. We don't put the UTXO in our wallet, because we don't consider it
"ours": anyone can spend it after 16 blocks.
We used to use the tag "ignored" for this, but that's overly complex
IMHO.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We don't actually set it any more. The bookkeeper db does a migration
for old anchors.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This is how we handle amount_msat and amount_sat everywhere these days, and this
wasn't updated.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…cations.
Rather than converting to a generic coin_mvt struct, use these directly in
the notification, which is more explicit.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Now we only ever use `struct chain_coin_mvt` or `struct channel_coin_mvt`.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
The part id is *only* unique within a group. The payment_hash / partid / groupid tuple is unique.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Added: Plugins: `coin_movement` notification with `part_id` field now always has `group_id` field.
More readable for me. Also, change order so we definitely break
compilation on all callers (putting enum before amount).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…others.
This means we can keep a pointer to the channel directly, *or* a string.
This avoids gratuitous formatting (on creation) and lookups (later).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Make the common fields the first ones, and make part_and_group and
payment_hash const pointers.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Prefix MVT_ to them, for clarity.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This isn't a robust assumption, so sort them before comparison.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Undocumented, but the first tag in the coin_movement notification is
considered the primary tag, and the others are optional. The
bookkeeper plugin relies on this!
Enforce that this is true, and in the process document in the code which
is the primary tag.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rather than open-coding in json_parse.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We're going to store them in the db this way, so I thought I'd see what it looks like if
we lift that interface all the way through.
We use a struct, so that types are checked strictly.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…d `extra_tags`.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Deprecated: JSON-RPC: `coin_movement` notification `tags` array (use `primary_tag` and `extra_tags`).
Changelog-Added: JSON-RPC: `coin_movement` notification `primary_tag` and `extra_tags`.
This is not particularly relevant now (it's always the current time) but will be
useful when we implement the list commands.
Note that timestamp is set to be "u32" in various schemas. This will
only become a problem on Sun 07 Feb 2106 06:28:15 UTC. I apologize to
my grandchildren in advance.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
It's always set, and in fact we assume it is (journal entries are not
internal to lightningd, so we won't see them in
lightningd/notification.c: that comment is misleading).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…st functions.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Deprecated: JSON-RPC: `coin_movement` notification `utxo_txid`, `vout` and `txid` fields (use `utxo` and `spending_txid`).
Changelog-Added: JSON-RPC: `coin_movement` notification `utxo` field.
Changelog-Added: JSON-RPC: `coin_movement` notification `spending_txid` field.
…common/coin_mvt.h
They're scattered and reproduced in many places: unify them.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Only used in tests.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We're going to get rid of this concept, but the main change is that the
account_get_balance API can be drastically simplified:
account_get_credit_debit() accesses the raw fields, never fails, but
returns the a flag which tells us if the account doesn't actually have
any events.
The one place we care about the balance, calculate by hand. Then
account_get_balance() (and struct account_balance) can simply be
moved to th test.
Subtly, without the "GROUP BY" clause, you always get one row, even if
there are no rows (but the SUM are null).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We still output the fields, they're just always the currency of the node.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Plugins: `bookkeeper` now explicitly assumes every transaction is in the same currency as the node (true unless you added manually)
bookkeeper used to generate these as channel events, now lightningd does.
We also add a "journal" event, which we will need later too.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@rustyrussell
rustyrussell merged commit 22b452a into ElementsProject:masterAug 14, 2025
38 of 40 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rustyrussell@cdecker@niftynei
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Bookkeeper migration part 1: the cleanups - #8445

Merged
rustyrussell merged 29 commits into
ElementsProject:masterfrom
rustyrussell:bkpr-part1
Aug 14, 2025
Merged

Bookkeeper migration part 1: the cleanups#8445
rustyrussell merged 29 commits into
ElementsProject:masterfrom
rustyrussell:bkpr-part1

Conversation

@rustyrussell

Copy link
Copy Markdown
Collaborator

This does various cleanups in anticipation of moving the audit log of moves into the core.

The next part will do the rest (unfortunately, that's a giant PR because we need to do the bookeeper -> internal migration at the end, and we must do that before anyone records coin movements).

@niftyneiniftynei left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Easy build error from CI, otherwise lgtm tho I wish the currency types were justifiable to be left in :)

Include(s) from common/coin_mvt.h duplicated in common/coin_mvt.c:
#include <bitcoin/tx.h>

Comment threadcommon/coin_mvt.c
assert(mvt_tags_valid(tags));

/* We put the *primary* tag first */
for (size_t i = 0; i < NUM_MVT_TAGS; i++) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh this is fun.

Comment threadcommon/coin_mvt.h

enum mvt_tag *new_tag_arr(const tal_t *ctx, enum mvt_tag tag);
/* Convenience macro for creating tag bitmaps */
#define mk_mvt_tags(...) mk_mvt_tags_(__VA_ARGS__, 999)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is cool.

Comment threadplugins/bkpr/test/run-recorder.c Outdated

@cdeckercdecker left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ACK

Comment threadcommon/coin_mvt.h Outdated
We can use these to test migrations.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Print the error!
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This means it doesn't have to be a tal ptr.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This makes our final balance not match our wallet:
1. We only spend the anchor when we need to boost the commitment tx,
which we don't always do (sometimes the peer does, sometimes it's
not worth it).
2. We don't put the UTXO in our wallet, because we don't consider it
"ours": anyone can spend it after 16 blocks.
We used to use the tag "ignored" for this, but that's overly complex
IMHO.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We don't actually set it any more. The bookkeeper db does a migration
for old anchors.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This is how we handle amount_msat and amount_sat everywhere these days, and this
wasn't updated.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…cations.
Rather than converting to a generic coin_mvt struct, use these directly in
the notification, which is more explicit.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Now we only ever use `struct chain_coin_mvt` or `struct channel_coin_mvt`.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
The part id is *only* unique within a group. The payment_hash / partid / groupid tuple is unique.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Added: Plugins: `coin_movement` notification with `part_id` field now always has `group_id` field.
More readable for me. Also, change order so we definitely break
compilation on all callers (putting enum before amount).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…others.
This means we can keep a pointer to the channel directly, *or* a string.
This avoids gratuitous formatting (on creation) and lookups (later).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Make the common fields the first ones, and make part_and_group and
payment_hash const pointers.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Prefix MVT_ to them, for clarity.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This isn't a robust assumption, so sort them before comparison.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Undocumented, but the first tag in the coin_movement notification is
considered the primary tag, and the others are optional. The
bookkeeper plugin relies on this!
Enforce that this is true, and in the process document in the code which
is the primary tag.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rather than open-coding in json_parse.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We're going to store them in the db this way, so I thought I'd see what it looks like if
we lift that interface all the way through.
We use a struct, so that types are checked strictly.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…d `extra_tags`.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Deprecated: JSON-RPC: `coin_movement` notification `tags` array (use `primary_tag` and `extra_tags`).
Changelog-Added: JSON-RPC: `coin_movement` notification `primary_tag` and `extra_tags`.
This is not particularly relevant now (it's always the current time) but will be
useful when we implement the list commands.
Note that timestamp is set to be "u32" in various schemas. This will
only become a problem on Sun 07 Feb 2106 06:28:15 UTC. I apologize to
my grandchildren in advance.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
It's always set, and in fact we assume it is (journal entries are not
internal to lightningd, so we won't see them in
lightningd/notification.c: that comment is misleading).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…st functions.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Deprecated: JSON-RPC: `coin_movement` notification `utxo_txid`, `vout` and `txid` fields (use `utxo` and `spending_txid`).
Changelog-Added: JSON-RPC: `coin_movement` notification `utxo` field.
Changelog-Added: JSON-RPC: `coin_movement` notification `spending_txid` field.
…common/coin_mvt.h
They're scattered and reproduced in many places: unify them.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Only used in tests.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We're going to get rid of this concept, but the main change is that the
account_get_balance API can be drastically simplified:
account_get_credit_debit() accesses the raw fields, never fails, but
returns the a flag which tells us if the account doesn't actually have
any events.
The one place we care about the balance, calculate by hand. Then
account_get_balance() (and struct account_balance) can simply be
moved to th test.
Subtly, without the "GROUP BY" clause, you always get one row, even if
there are no rows (but the SUM are null).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We still output the fields, they're just always the currency of the node.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Plugins: `bookkeeper` now explicitly assumes every transaction is in the same currency as the node (true unless you added manually)
bookkeeper used to generate these as channel events, now lightningd does.
We also add a "journal" event, which we will need later too.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@rustyrussell
rustyrussell merged commit 22b452a into ElementsProject:masterAug 14, 2025
38 of 40 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rustyrussell@cdecker@niftynei
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Bookkeeper migration part 1: the cleanups - #8445

Merged
rustyrussell merged 29 commits into
ElementsProject:masterfrom
rustyrussell:bkpr-part1
Aug 14, 2025
Merged

Bookkeeper migration part 1: the cleanups#8445
rustyrussell merged 29 commits into
ElementsProject:masterfrom
rustyrussell:bkpr-part1

Conversation

@rustyrussell

Copy link
Copy Markdown
Collaborator

This does various cleanups in anticipation of moving the audit log of moves into the core.

The next part will do the rest (unfortunately, that's a giant PR because we need to do the bookeeper -> internal migration at the end, and we must do that before anyone records coin movements).

@niftyneiniftynei left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Easy build error from CI, otherwise lgtm tho I wish the currency types were justifiable to be left in :)

Include(s) from common/coin_mvt.h duplicated in common/coin_mvt.c:
#include <bitcoin/tx.h>

Comment threadcommon/coin_mvt.c
assert(mvt_tags_valid(tags));

/* We put the *primary* tag first */
for (size_t i = 0; i < NUM_MVT_TAGS; i++) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh this is fun.

Comment threadcommon/coin_mvt.h

enum mvt_tag *new_tag_arr(const tal_t *ctx, enum mvt_tag tag);
/* Convenience macro for creating tag bitmaps */
#define mk_mvt_tags(...) mk_mvt_tags_(__VA_ARGS__, 999)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is cool.

Comment threadplugins/bkpr/test/run-recorder.c Outdated

@cdeckercdecker left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ACK

Comment threadcommon/coin_mvt.h Outdated
We can use these to test migrations.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Print the error!
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This means it doesn't have to be a tal ptr.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This makes our final balance not match our wallet:
1. We only spend the anchor when we need to boost the commitment tx,
which we don't always do (sometimes the peer does, sometimes it's
not worth it).
2. We don't put the UTXO in our wallet, because we don't consider it
"ours": anyone can spend it after 16 blocks.
We used to use the tag "ignored" for this, but that's overly complex
IMHO.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We don't actually set it any more. The bookkeeper db does a migration
for old anchors.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This is how we handle amount_msat and amount_sat everywhere these days, and this
wasn't updated.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…cations.
Rather than converting to a generic coin_mvt struct, use these directly in
the notification, which is more explicit.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Now we only ever use `struct chain_coin_mvt` or `struct channel_coin_mvt`.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
The part id is *only* unique within a group. The payment_hash / partid / groupid tuple is unique.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Added: Plugins: `coin_movement` notification with `part_id` field now always has `group_id` field.
More readable for me. Also, change order so we definitely break
compilation on all callers (putting enum before amount).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…others.
This means we can keep a pointer to the channel directly, *or* a string.
This avoids gratuitous formatting (on creation) and lookups (later).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Make the common fields the first ones, and make part_and_group and
payment_hash const pointers.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Prefix MVT_ to them, for clarity.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This isn't a robust assumption, so sort them before comparison.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Undocumented, but the first tag in the coin_movement notification is
considered the primary tag, and the others are optional. The
bookkeeper plugin relies on this!
Enforce that this is true, and in the process document in the code which
is the primary tag.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rather than open-coding in json_parse.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We're going to store them in the db this way, so I thought I'd see what it looks like if
we lift that interface all the way through.
We use a struct, so that types are checked strictly.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…d `extra_tags`.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Deprecated: JSON-RPC: `coin_movement` notification `tags` array (use `primary_tag` and `extra_tags`).
Changelog-Added: JSON-RPC: `coin_movement` notification `primary_tag` and `extra_tags`.
This is not particularly relevant now (it's always the current time) but will be
useful when we implement the list commands.
Note that timestamp is set to be "u32" in various schemas. This will
only become a problem on Sun 07 Feb 2106 06:28:15 UTC. I apologize to
my grandchildren in advance.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
It's always set, and in fact we assume it is (journal entries are not
internal to lightningd, so we won't see them in
lightningd/notification.c: that comment is misleading).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…st functions.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Deprecated: JSON-RPC: `coin_movement` notification `utxo_txid`, `vout` and `txid` fields (use `utxo` and `spending_txid`).
Changelog-Added: JSON-RPC: `coin_movement` notification `utxo` field.
Changelog-Added: JSON-RPC: `coin_movement` notification `spending_txid` field.
…common/coin_mvt.h
They're scattered and reproduced in many places: unify them.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Only used in tests.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We're going to get rid of this concept, but the main change is that the
account_get_balance API can be drastically simplified:
account_get_credit_debit() accesses the raw fields, never fails, but
returns the a flag which tells us if the account doesn't actually have
any events.
The one place we care about the balance, calculate by hand. Then
account_get_balance() (and struct account_balance) can simply be
moved to th test.
Subtly, without the "GROUP BY" clause, you always get one row, even if
there are no rows (but the SUM are null).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We still output the fields, they're just always the currency of the node.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Plugins: `bookkeeper` now explicitly assumes every transaction is in the same currency as the node (true unless you added manually)
bookkeeper used to generate these as channel events, now lightningd does.
We also add a "journal" event, which we will need later too.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@rustyrussell
rustyrussell merged commit 22b452a into ElementsProject:masterAug 14, 2025
38 of 40 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rustyrussell@cdecker@niftynei
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Bookkeeper migration part 1: the cleanups - #8445

Merged
rustyrussell merged 29 commits into
ElementsProject:masterfrom
rustyrussell:bkpr-part1
Aug 14, 2025
Merged

Bookkeeper migration part 1: the cleanups#8445
rustyrussell merged 29 commits into
ElementsProject:masterfrom
rustyrussell:bkpr-part1

Conversation

@rustyrussell

Copy link
Copy Markdown
Collaborator

This does various cleanups in anticipation of moving the audit log of moves into the core.

The next part will do the rest (unfortunately, that's a giant PR because we need to do the bookeeper -> internal migration at the end, and we must do that before anyone records coin movements).

@niftyneiniftynei left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Easy build error from CI, otherwise lgtm tho I wish the currency types were justifiable to be left in :)

Include(s) from common/coin_mvt.h duplicated in common/coin_mvt.c:
#include <bitcoin/tx.h>

Comment threadcommon/coin_mvt.c
assert(mvt_tags_valid(tags));

/* We put the *primary* tag first */
for (size_t i = 0; i < NUM_MVT_TAGS; i++) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh this is fun.

Comment threadcommon/coin_mvt.h

enum mvt_tag *new_tag_arr(const tal_t *ctx, enum mvt_tag tag);
/* Convenience macro for creating tag bitmaps */
#define mk_mvt_tags(...) mk_mvt_tags_(__VA_ARGS__, 999)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is cool.

Comment threadplugins/bkpr/test/run-recorder.c Outdated

@cdeckercdecker left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ACK

Comment threadcommon/coin_mvt.h Outdated
We can use these to test migrations.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Print the error!
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This means it doesn't have to be a tal ptr.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This makes our final balance not match our wallet:
1. We only spend the anchor when we need to boost the commitment tx,
which we don't always do (sometimes the peer does, sometimes it's
not worth it).
2. We don't put the UTXO in our wallet, because we don't consider it
"ours": anyone can spend it after 16 blocks.
We used to use the tag "ignored" for this, but that's overly complex
IMHO.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We don't actually set it any more. The bookkeeper db does a migration
for old anchors.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This is how we handle amount_msat and amount_sat everywhere these days, and this
wasn't updated.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…cations.
Rather than converting to a generic coin_mvt struct, use these directly in
the notification, which is more explicit.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Now we only ever use `struct chain_coin_mvt` or `struct channel_coin_mvt`.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
The part id is *only* unique within a group. The payment_hash / partid / groupid tuple is unique.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Added: Plugins: `coin_movement` notification with `part_id` field now always has `group_id` field.
More readable for me. Also, change order so we definitely break
compilation on all callers (putting enum before amount).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…others.
This means we can keep a pointer to the channel directly, *or* a string.
This avoids gratuitous formatting (on creation) and lookups (later).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Make the common fields the first ones, and make part_and_group and
payment_hash const pointers.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Prefix MVT_ to them, for clarity.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This isn't a robust assumption, so sort them before comparison.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Undocumented, but the first tag in the coin_movement notification is
considered the primary tag, and the others are optional. The
bookkeeper plugin relies on this!
Enforce that this is true, and in the process document in the code which
is the primary tag.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rather than open-coding in json_parse.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We're going to store them in the db this way, so I thought I'd see what it looks like if
we lift that interface all the way through.
We use a struct, so that types are checked strictly.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…d `extra_tags`.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Deprecated: JSON-RPC: `coin_movement` notification `tags` array (use `primary_tag` and `extra_tags`).
Changelog-Added: JSON-RPC: `coin_movement` notification `primary_tag` and `extra_tags`.
This is not particularly relevant now (it's always the current time) but will be
useful when we implement the list commands.
Note that timestamp is set to be "u32" in various schemas. This will
only become a problem on Sun 07 Feb 2106 06:28:15 UTC. I apologize to
my grandchildren in advance.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
It's always set, and in fact we assume it is (journal entries are not
internal to lightningd, so we won't see them in
lightningd/notification.c: that comment is misleading).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…st functions.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Deprecated: JSON-RPC: `coin_movement` notification `utxo_txid`, `vout` and `txid` fields (use `utxo` and `spending_txid`).
Changelog-Added: JSON-RPC: `coin_movement` notification `utxo` field.
Changelog-Added: JSON-RPC: `coin_movement` notification `spending_txid` field.
…common/coin_mvt.h
They're scattered and reproduced in many places: unify them.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Only used in tests.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We're going to get rid of this concept, but the main change is that the
account_get_balance API can be drastically simplified:
account_get_credit_debit() accesses the raw fields, never fails, but
returns the a flag which tells us if the account doesn't actually have
any events.
The one place we care about the balance, calculate by hand. Then
account_get_balance() (and struct account_balance) can simply be
moved to th test.
Subtly, without the "GROUP BY" clause, you always get one row, even if
there are no rows (but the SUM are null).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We still output the fields, they're just always the currency of the node.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Plugins: `bookkeeper` now explicitly assumes every transaction is in the same currency as the node (true unless you added manually)
bookkeeper used to generate these as channel events, now lightningd does.
We also add a "journal" event, which we will need later too.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@rustyrussell
rustyrussell merged commit 22b452a into ElementsProject:masterAug 14, 2025
38 of 40 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rustyrussell@cdecker@niftynei
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Bookkeeper migration part 1: the cleanups - #8445

Merged
rustyrussell merged 29 commits into
ElementsProject:masterfrom
rustyrussell:bkpr-part1
Aug 14, 2025
Merged

Bookkeeper migration part 1: the cleanups#8445
rustyrussell merged 29 commits into
ElementsProject:masterfrom
rustyrussell:bkpr-part1

Conversation

@rustyrussell

Copy link
Copy Markdown
Collaborator

This does various cleanups in anticipation of moving the audit log of moves into the core.

The next part will do the rest (unfortunately, that's a giant PR because we need to do the bookeeper -> internal migration at the end, and we must do that before anyone records coin movements).

@niftyneiniftynei left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Easy build error from CI, otherwise lgtm tho I wish the currency types were justifiable to be left in :)

Include(s) from common/coin_mvt.h duplicated in common/coin_mvt.c:
#include <bitcoin/tx.h>

Comment threadcommon/coin_mvt.c
assert(mvt_tags_valid(tags));

/* We put the *primary* tag first */
for (size_t i = 0; i < NUM_MVT_TAGS; i++) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh this is fun.

Comment threadcommon/coin_mvt.h

enum mvt_tag *new_tag_arr(const tal_t *ctx, enum mvt_tag tag);
/* Convenience macro for creating tag bitmaps */
#define mk_mvt_tags(...) mk_mvt_tags_(__VA_ARGS__, 999)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is cool.

Comment threadplugins/bkpr/test/run-recorder.c Outdated

@cdeckercdecker left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ACK

Comment threadcommon/coin_mvt.h Outdated
We can use these to test migrations.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Print the error!
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This means it doesn't have to be a tal ptr.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This makes our final balance not match our wallet:
1. We only spend the anchor when we need to boost the commitment tx,
which we don't always do (sometimes the peer does, sometimes it's
not worth it).
2. We don't put the UTXO in our wallet, because we don't consider it
"ours": anyone can spend it after 16 blocks.
We used to use the tag "ignored" for this, but that's overly complex
IMHO.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We don't actually set it any more. The bookkeeper db does a migration
for old anchors.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This is how we handle amount_msat and amount_sat everywhere these days, and this
wasn't updated.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…cations.
Rather than converting to a generic coin_mvt struct, use these directly in
the notification, which is more explicit.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Now we only ever use `struct chain_coin_mvt` or `struct channel_coin_mvt`.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
The part id is *only* unique within a group. The payment_hash / partid / groupid tuple is unique.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Added: Plugins: `coin_movement` notification with `part_id` field now always has `group_id` field.
More readable for me. Also, change order so we definitely break
compilation on all callers (putting enum before amount).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…others.
This means we can keep a pointer to the channel directly, *or* a string.
This avoids gratuitous formatting (on creation) and lookups (later).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Make the common fields the first ones, and make part_and_group and
payment_hash const pointers.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Prefix MVT_ to them, for clarity.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This isn't a robust assumption, so sort them before comparison.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Undocumented, but the first tag in the coin_movement notification is
considered the primary tag, and the others are optional. The
bookkeeper plugin relies on this!
Enforce that this is true, and in the process document in the code which
is the primary tag.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rather than open-coding in json_parse.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We're going to store them in the db this way, so I thought I'd see what it looks like if
we lift that interface all the way through.
We use a struct, so that types are checked strictly.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…d `extra_tags`.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Deprecated: JSON-RPC: `coin_movement` notification `tags` array (use `primary_tag` and `extra_tags`).
Changelog-Added: JSON-RPC: `coin_movement` notification `primary_tag` and `extra_tags`.
This is not particularly relevant now (it's always the current time) but will be
useful when we implement the list commands.
Note that timestamp is set to be "u32" in various schemas. This will
only become a problem on Sun 07 Feb 2106 06:28:15 UTC. I apologize to
my grandchildren in advance.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
It's always set, and in fact we assume it is (journal entries are not
internal to lightningd, so we won't see them in
lightningd/notification.c: that comment is misleading).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…st functions.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Deprecated: JSON-RPC: `coin_movement` notification `utxo_txid`, `vout` and `txid` fields (use `utxo` and `spending_txid`).
Changelog-Added: JSON-RPC: `coin_movement` notification `utxo` field.
Changelog-Added: JSON-RPC: `coin_movement` notification `spending_txid` field.
…common/coin_mvt.h
They're scattered and reproduced in many places: unify them.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Only used in tests.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We're going to get rid of this concept, but the main change is that the
account_get_balance API can be drastically simplified:
account_get_credit_debit() accesses the raw fields, never fails, but
returns the a flag which tells us if the account doesn't actually have
any events.
The one place we care about the balance, calculate by hand. Then
account_get_balance() (and struct account_balance) can simply be
moved to th test.
Subtly, without the "GROUP BY" clause, you always get one row, even if
there are no rows (but the SUM are null).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We still output the fields, they're just always the currency of the node.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Plugins: `bookkeeper` now explicitly assumes every transaction is in the same currency as the node (true unless you added manually)
bookkeeper used to generate these as channel events, now lightningd does.
We also add a "journal" event, which we will need later too.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@rustyrussell
rustyrussell merged commit 22b452a into ElementsProject:masterAug 14, 2025
38 of 40 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rustyrussell@cdecker@niftynei
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Bookkeeper migration part 1: the cleanups - #8445

Merged
rustyrussell merged 29 commits into
ElementsProject:masterfrom
rustyrussell:bkpr-part1
Aug 14, 2025
Merged

Bookkeeper migration part 1: the cleanups#8445
rustyrussell merged 29 commits into
ElementsProject:masterfrom
rustyrussell:bkpr-part1

Conversation

@rustyrussell

Copy link
Copy Markdown
Collaborator

This does various cleanups in anticipation of moving the audit log of moves into the core.

The next part will do the rest (unfortunately, that's a giant PR because we need to do the bookeeper -> internal migration at the end, and we must do that before anyone records coin movements).

@niftyneiniftynei left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Easy build error from CI, otherwise lgtm tho I wish the currency types were justifiable to be left in :)

Include(s) from common/coin_mvt.h duplicated in common/coin_mvt.c:
#include <bitcoin/tx.h>

Comment threadcommon/coin_mvt.c
assert(mvt_tags_valid(tags));

/* We put the *primary* tag first */
for (size_t i = 0; i < NUM_MVT_TAGS; i++) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh this is fun.

Comment threadcommon/coin_mvt.h

enum mvt_tag *new_tag_arr(const tal_t *ctx, enum mvt_tag tag);
/* Convenience macro for creating tag bitmaps */
#define mk_mvt_tags(...) mk_mvt_tags_(__VA_ARGS__, 999)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is cool.

Comment threadplugins/bkpr/test/run-recorder.c Outdated

@cdeckercdecker left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ACK

Comment threadcommon/coin_mvt.h Outdated
We can use these to test migrations.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Print the error!
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This means it doesn't have to be a tal ptr.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This makes our final balance not match our wallet:
1. We only spend the anchor when we need to boost the commitment tx,
which we don't always do (sometimes the peer does, sometimes it's
not worth it).
2. We don't put the UTXO in our wallet, because we don't consider it
"ours": anyone can spend it after 16 blocks.
We used to use the tag "ignored" for this, but that's overly complex
IMHO.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We don't actually set it any more. The bookkeeper db does a migration
for old anchors.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This is how we handle amount_msat and amount_sat everywhere these days, and this
wasn't updated.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…cations.
Rather than converting to a generic coin_mvt struct, use these directly in
the notification, which is more explicit.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Now we only ever use `struct chain_coin_mvt` or `struct channel_coin_mvt`.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
The part id is *only* unique within a group. The payment_hash / partid / groupid tuple is unique.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Added: Plugins: `coin_movement` notification with `part_id` field now always has `group_id` field.
More readable for me. Also, change order so we definitely break
compilation on all callers (putting enum before amount).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…others.
This means we can keep a pointer to the channel directly, *or* a string.
This avoids gratuitous formatting (on creation) and lookups (later).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Make the common fields the first ones, and make part_and_group and
payment_hash const pointers.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Prefix MVT_ to them, for clarity.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This isn't a robust assumption, so sort them before comparison.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Undocumented, but the first tag in the coin_movement notification is
considered the primary tag, and the others are optional. The
bookkeeper plugin relies on this!
Enforce that this is true, and in the process document in the code which
is the primary tag.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rather than open-coding in json_parse.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We're going to store them in the db this way, so I thought I'd see what it looks like if
we lift that interface all the way through.
We use a struct, so that types are checked strictly.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…d `extra_tags`.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Deprecated: JSON-RPC: `coin_movement` notification `tags` array (use `primary_tag` and `extra_tags`).
Changelog-Added: JSON-RPC: `coin_movement` notification `primary_tag` and `extra_tags`.
This is not particularly relevant now (it's always the current time) but will be
useful when we implement the list commands.
Note that timestamp is set to be "u32" in various schemas. This will
only become a problem on Sun 07 Feb 2106 06:28:15 UTC. I apologize to
my grandchildren in advance.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
It's always set, and in fact we assume it is (journal entries are not
internal to lightningd, so we won't see them in
lightningd/notification.c: that comment is misleading).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…st functions.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Deprecated: JSON-RPC: `coin_movement` notification `utxo_txid`, `vout` and `txid` fields (use `utxo` and `spending_txid`).
Changelog-Added: JSON-RPC: `coin_movement` notification `utxo` field.
Changelog-Added: JSON-RPC: `coin_movement` notification `spending_txid` field.
…common/coin_mvt.h
They're scattered and reproduced in many places: unify them.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Only used in tests.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We're going to get rid of this concept, but the main change is that the
account_get_balance API can be drastically simplified:
account_get_credit_debit() accesses the raw fields, never fails, but
returns the a flag which tells us if the account doesn't actually have
any events.
The one place we care about the balance, calculate by hand. Then
account_get_balance() (and struct account_balance) can simply be
moved to th test.
Subtly, without the "GROUP BY" clause, you always get one row, even if
there are no rows (but the SUM are null).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We still output the fields, they're just always the currency of the node.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Plugins: `bookkeeper` now explicitly assumes every transaction is in the same currency as the node (true unless you added manually)
bookkeeper used to generate these as channel events, now lightningd does.
We also add a "journal" event, which we will need later too.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@rustyrussell
rustyrussell merged commit 22b452a into ElementsProject:masterAug 14, 2025
38 of 40 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rustyrussell@cdecker@niftynei
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Bookkeeper migration part 1: the cleanups - #8445

Merged
rustyrussell merged 29 commits into
ElementsProject:masterfrom
rustyrussell:bkpr-part1
Aug 14, 2025
Merged

Bookkeeper migration part 1: the cleanups#8445
rustyrussell merged 29 commits into
ElementsProject:masterfrom
rustyrussell:bkpr-part1

Conversation

@rustyrussell

Copy link
Copy Markdown
Collaborator

This does various cleanups in anticipation of moving the audit log of moves into the core.

The next part will do the rest (unfortunately, that's a giant PR because we need to do the bookeeper -> internal migration at the end, and we must do that before anyone records coin movements).

@niftyneiniftynei left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Easy build error from CI, otherwise lgtm tho I wish the currency types were justifiable to be left in :)

Include(s) from common/coin_mvt.h duplicated in common/coin_mvt.c:
#include <bitcoin/tx.h>

Comment threadcommon/coin_mvt.c
assert(mvt_tags_valid(tags));

/* We put the *primary* tag first */
for (size_t i = 0; i < NUM_MVT_TAGS; i++) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh this is fun.

Comment threadcommon/coin_mvt.h

enum mvt_tag *new_tag_arr(const tal_t *ctx, enum mvt_tag tag);
/* Convenience macro for creating tag bitmaps */
#define mk_mvt_tags(...) mk_mvt_tags_(__VA_ARGS__, 999)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is cool.

Comment threadplugins/bkpr/test/run-recorder.c Outdated

@cdeckercdecker left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ACK

Comment threadcommon/coin_mvt.h Outdated
We can use these to test migrations.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Print the error!
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This means it doesn't have to be a tal ptr.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This makes our final balance not match our wallet:
1. We only spend the anchor when we need to boost the commitment tx,
which we don't always do (sometimes the peer does, sometimes it's
not worth it).
2. We don't put the UTXO in our wallet, because we don't consider it
"ours": anyone can spend it after 16 blocks.
We used to use the tag "ignored" for this, but that's overly complex
IMHO.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We don't actually set it any more. The bookkeeper db does a migration
for old anchors.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This is how we handle amount_msat and amount_sat everywhere these days, and this
wasn't updated.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…cations.
Rather than converting to a generic coin_mvt struct, use these directly in
the notification, which is more explicit.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Now we only ever use `struct chain_coin_mvt` or `struct channel_coin_mvt`.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
The part id is *only* unique within a group. The payment_hash / partid / groupid tuple is unique.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Added: Plugins: `coin_movement` notification with `part_id` field now always has `group_id` field.
More readable for me. Also, change order so we definitely break
compilation on all callers (putting enum before amount).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…others.
This means we can keep a pointer to the channel directly, *or* a string.
This avoids gratuitous formatting (on creation) and lookups (later).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Make the common fields the first ones, and make part_and_group and
payment_hash const pointers.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Prefix MVT_ to them, for clarity.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This isn't a robust assumption, so sort them before comparison.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Undocumented, but the first tag in the coin_movement notification is
considered the primary tag, and the others are optional. The
bookkeeper plugin relies on this!
Enforce that this is true, and in the process document in the code which
is the primary tag.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rather than open-coding in json_parse.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We're going to store them in the db this way, so I thought I'd see what it looks like if
we lift that interface all the way through.
We use a struct, so that types are checked strictly.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…d `extra_tags`.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Deprecated: JSON-RPC: `coin_movement` notification `tags` array (use `primary_tag` and `extra_tags`).
Changelog-Added: JSON-RPC: `coin_movement` notification `primary_tag` and `extra_tags`.
This is not particularly relevant now (it's always the current time) but will be
useful when we implement the list commands.
Note that timestamp is set to be "u32" in various schemas. This will
only become a problem on Sun 07 Feb 2106 06:28:15 UTC. I apologize to
my grandchildren in advance.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
It's always set, and in fact we assume it is (journal entries are not
internal to lightningd, so we won't see them in
lightningd/notification.c: that comment is misleading).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…st functions.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Deprecated: JSON-RPC: `coin_movement` notification `utxo_txid`, `vout` and `txid` fields (use `utxo` and `spending_txid`).
Changelog-Added: JSON-RPC: `coin_movement` notification `utxo` field.
Changelog-Added: JSON-RPC: `coin_movement` notification `spending_txid` field.
…common/coin_mvt.h
They're scattered and reproduced in many places: unify them.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Only used in tests.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We're going to get rid of this concept, but the main change is that the
account_get_balance API can be drastically simplified:
account_get_credit_debit() accesses the raw fields, never fails, but
returns the a flag which tells us if the account doesn't actually have
any events.
The one place we care about the balance, calculate by hand. Then
account_get_balance() (and struct account_balance) can simply be
moved to th test.
Subtly, without the "GROUP BY" clause, you always get one row, even if
there are no rows (but the SUM are null).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We still output the fields, they're just always the currency of the node.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Plugins: `bookkeeper` now explicitly assumes every transaction is in the same currency as the node (true unless you added manually)
bookkeeper used to generate these as channel events, now lightningd does.
We also add a "journal" event, which we will need later too.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@rustyrussell
rustyrussell merged commit 22b452a into ElementsProject:masterAug 14, 2025
38 of 40 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rustyrussell@cdecker@niftynei
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Bookkeeper migration part 1: the cleanups - #8445

Merged
rustyrussell merged 29 commits into
ElementsProject:masterfrom
rustyrussell:bkpr-part1
Aug 14, 2025
Merged

Bookkeeper migration part 1: the cleanups#8445
rustyrussell merged 29 commits into
ElementsProject:masterfrom
rustyrussell:bkpr-part1

Conversation

@rustyrussell

Copy link
Copy Markdown
Collaborator

This does various cleanups in anticipation of moving the audit log of moves into the core.

The next part will do the rest (unfortunately, that's a giant PR because we need to do the bookeeper -> internal migration at the end, and we must do that before anyone records coin movements).

@niftyneiniftynei left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Easy build error from CI, otherwise lgtm tho I wish the currency types were justifiable to be left in :)

Include(s) from common/coin_mvt.h duplicated in common/coin_mvt.c:
#include <bitcoin/tx.h>

Comment threadcommon/coin_mvt.c
assert(mvt_tags_valid(tags));

/* We put the *primary* tag first */
for (size_t i = 0; i < NUM_MVT_TAGS; i++) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh this is fun.

Comment threadcommon/coin_mvt.h

enum mvt_tag *new_tag_arr(const tal_t *ctx, enum mvt_tag tag);
/* Convenience macro for creating tag bitmaps */
#define mk_mvt_tags(...) mk_mvt_tags_(__VA_ARGS__, 999)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is cool.

Comment threadplugins/bkpr/test/run-recorder.c Outdated

@cdeckercdecker left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ACK

Comment threadcommon/coin_mvt.h Outdated
We can use these to test migrations.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Print the error!
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This means it doesn't have to be a tal ptr.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This makes our final balance not match our wallet:
1. We only spend the anchor when we need to boost the commitment tx,
which we don't always do (sometimes the peer does, sometimes it's
not worth it).
2. We don't put the UTXO in our wallet, because we don't consider it
"ours": anyone can spend it after 16 blocks.
We used to use the tag "ignored" for this, but that's overly complex
IMHO.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We don't actually set it any more. The bookkeeper db does a migration
for old anchors.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This is how we handle amount_msat and amount_sat everywhere these days, and this
wasn't updated.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…cations.
Rather than converting to a generic coin_mvt struct, use these directly in
the notification, which is more explicit.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Now we only ever use `struct chain_coin_mvt` or `struct channel_coin_mvt`.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
The part id is *only* unique within a group. The payment_hash / partid / groupid tuple is unique.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Added: Plugins: `coin_movement` notification with `part_id` field now always has `group_id` field.
More readable for me. Also, change order so we definitely break
compilation on all callers (putting enum before amount).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…others.
This means we can keep a pointer to the channel directly, *or* a string.
This avoids gratuitous formatting (on creation) and lookups (later).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Make the common fields the first ones, and make part_and_group and
payment_hash const pointers.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Prefix MVT_ to them, for clarity.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This isn't a robust assumption, so sort them before comparison.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Undocumented, but the first tag in the coin_movement notification is
considered the primary tag, and the others are optional. The
bookkeeper plugin relies on this!
Enforce that this is true, and in the process document in the code which
is the primary tag.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rather than open-coding in json_parse.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We're going to store them in the db this way, so I thought I'd see what it looks like if
we lift that interface all the way through.
We use a struct, so that types are checked strictly.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…d `extra_tags`.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Deprecated: JSON-RPC: `coin_movement` notification `tags` array (use `primary_tag` and `extra_tags`).
Changelog-Added: JSON-RPC: `coin_movement` notification `primary_tag` and `extra_tags`.
This is not particularly relevant now (it's always the current time) but will be
useful when we implement the list commands.
Note that timestamp is set to be "u32" in various schemas. This will
only become a problem on Sun 07 Feb 2106 06:28:15 UTC. I apologize to
my grandchildren in advance.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
It's always set, and in fact we assume it is (journal entries are not
internal to lightningd, so we won't see them in
lightningd/notification.c: that comment is misleading).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
…st functions.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Deprecated: JSON-RPC: `coin_movement` notification `utxo_txid`, `vout` and `txid` fields (use `utxo` and `spending_txid`).
Changelog-Added: JSON-RPC: `coin_movement` notification `utxo` field.
Changelog-Added: JSON-RPC: `coin_movement` notification `spending_txid` field.
…common/coin_mvt.h
They're scattered and reproduced in many places: unify them.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Only used in tests.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We're going to get rid of this concept, but the main change is that the
account_get_balance API can be drastically simplified:
account_get_credit_debit() accesses the raw fields, never fails, but
returns the a flag which tells us if the account doesn't actually have
any events.
The one place we care about the balance, calculate by hand. Then
account_get_balance() (and struct account_balance) can simply be
moved to th test.
Subtly, without the "GROUP BY" clause, you always get one row, even if
there are no rows (but the SUM are null).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
We still output the fields, they're just always the currency of the node.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Changelog-Changed: Plugins: `bookkeeper` now explicitly assumes every transaction is in the same currency as the node (true unless you added manually)
bookkeeper used to generate these as channel events, now lightningd does.
We also add a "journal" event, which we will need later too.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
@rustyrussell
rustyrussell merged commit 22b452a into ElementsProject:masterAug 14, 2025
38 of 40 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@rustyrussell@cdecker@niftynei