lightning/runes: added last_used in showrunes

Changelog-Added: JSON-RPC: `showrunes` new field `last_used`
This commit is contained in:
ShahanaFarooqui 2023-09-14 12:10:41 +09:30 committed by Rusty Russell
parent db55deae2a
commit d745323f74
6 changed files with 44 additions and 5 deletions

View file

@ -31,6 +31,7 @@ On success, an object containing **runes** is returned. It is an array of objec
- **restrictions\_as\_english** (string): English readable description of the restrictions array above
- **stored** (boolean, optional): This is false if the rune does not appear in our datastore (only possible when `rune` is specified) (always *false*)
- **blacklisted** (boolean, optional): The rune has been blacklisted; see commando-blacklist(7) (always *true*)
- **last\_used** (number, optional): The last time this rune was successfully used *(added 23.11)*
- **our\_rune** (boolean, optional): This is not a rune for this node (only possible when `rune` is specified) (always *false*)
[comment]: # (GENERATE-FROM-SCHEMA-END)
@ -50,4 +51,4 @@ RESOURCES
Main web site: <https://github.com/ElementsProject/lightning>
[comment]: # ( SHA256STAMP:cd0e75bbeef3d5824448f67485de4679b0c163e97f405673b2ba9495f970d498)
[comment]: # ( SHA256STAMP:900e91777cd1e181c87a78913ab6f914585fcd99cd0dba16da19a81159f98aea)

View file

@ -29,6 +29,7 @@ On success, an object containing **runes** is returned. It is an array of objec
- **restrictions\_as\_english** (string): English readable description of the restrictions array above
- **stored** (boolean, optional): This is false if the rune does not appear in our datastore (only possible when `rune` is specified) (always *false*)
- **blacklisted** (boolean, optional): The rune has been blacklisted; see commando-blacklist(7) (always *true*)
- **last\_used** (number, optional): The last time this rune was successfully used *(added 23.11)*
- **our\_rune** (boolean, optional): This is not a rune for this node (only possible when `rune` is specified) (always *false*)
[comment]: # (GENERATE-FROM-SCHEMA-END)
@ -48,4 +49,4 @@ RESOURCES
Main web site: <https://github.com/ElementsProject/lightning>
[comment]: # ( SHA256STAMP:cd0e75bbeef3d5824448f67485de4679b0c163e97f405673b2ba9495f970d498)
[comment]: # ( SHA256STAMP:900e91777cd1e181c87a78913ab6f914585fcd99cd0dba16da19a81159f98aea)

View file

@ -93,6 +93,11 @@
],
"description": "The rune has been blacklisted; see commando-blacklist(7)"
},
"last_used": {
"type": "number",
"description": "The last time this rune was successfully used",
"added": "23.11"
},
"our_rune": {
"type": "boolean",
"enum": [

View file

@ -93,6 +93,11 @@
],
"description": "The rune has been blacklisted; see commando-blacklist(7)"
},
"last_used": {
"type": "number",
"description": "The last time this rune was successfully used",
"added": "23.11"
},
"our_rune": {
"type": "boolean",
"enum": [

View file

@ -317,7 +317,8 @@ static struct command_result *json_add_rune(struct lightningd *ld,
const char *fieldname,
const char *runestr,
const struct rune *rune,
bool stored)
bool stored,
struct timeabs last_used)
{
char *rune_english;
rune_english = "";
@ -332,6 +333,9 @@ static struct command_result *json_add_rune(struct lightningd *ld,
if (rune_is_ours(ld, rune) != NULL) {
json_add_bool(js, "our_rune", false);
}
if (last_used.ts.tv_sec != 0) {
json_add_timeabs(js, "last_used", last_used);
}
json_add_string(js, "unique_id", rune->unique_id);
json_array_start(js, "restrictions");
for (size_t i = 0; i < tal_count(rune->restrs); i++) {
@ -377,15 +381,18 @@ static struct command_result *json_showrunes(struct command *cmd,
struct timeabs last_used;
const char *from_db = wallet_get_rune(tmpctx, cmd->ld->wallet, uid, &last_used);
/* This is how we indicate no timestamp: */
if (!from_db)
last_used.ts.tv_sec = 0;
/* We consider it stored iff this is exactly stored */
json_add_rune(cmd->ld, response, NULL, ras->runestr, ras->rune,
from_db && streq(from_db, ras->runestr));
from_db && streq(from_db, ras->runestr), last_used);
} else {
struct timeabs *last_used;
const char **strs = wallet_get_runes(cmd, cmd->ld->wallet, &last_used);
for (size_t i = 0; i < tal_count(strs); i++) {
const struct rune *r = rune_from_base64(cmd, strs[i]);
json_add_rune(cmd->ld, response, NULL, strs[i], r, true);
json_add_rune(cmd->ld, response, NULL, strs[i], r, true, last_used[i]);
}
}
json_array_end(response);

View file

@ -250,6 +250,26 @@ def test_showrunes(node_factory):
assert not_our_rune['stored'] is False
assert not_our_rune['our_rune'] is False
# test that we don't set timestamp if rune fails
new_rune = l1.rpc.createrune(restrictions=[["method=getinfo"]])['rune']
assert "last_used" not in l1.rpc.showrunes(rune=new_rune)['runes'][0]
with pytest.raises(RpcError, match='Not permitted:'):
l1.rpc.checkrune(nodeid=l1.info['id'],
rune=new_rune,
method='listchannels',
params={})
assert "last_used" not in l1.rpc.showrunes(rune=new_rune)['runes'][0]
before = time.time()
l1.rpc.checkrune(nodeid=l1.info['id'],
rune=new_rune,
method='getinfo',
params={})
after = time.time()
assert before <= l1.rpc.showrunes(rune=new_rune)['runes'][0]['last_used'] <= after
def test_blacklistrune(node_factory):
l1 = node_factory.get_node()