{
 "number": 31668,
 "repo": "bitcoin/bitcoin",
 "url": "https://github.com/bitcoin/bitcoin/pull/31668",
 "title": "Added rescan option for import descriptors",
 "author": "saikiran57",
 "author_association": "CONTRIBUTOR",
 "created_at": "2025-01-16T08:11:27Z",
 "updated_at": "2026-09-17T02:33:50Z",
 "age_days": 609,
 "draft": false,
 "labels": [
  "Needs rebase"
 ],
 "milestone": null,
 "base": "master",
 "head_sha": "6916d40866f343480ef61094f6354bfe15cb1c04",
 "head_ref": "set_rescan_option_import_descriptors",
 "head_repo": "saikiran57/bitcoin",
 "head_history": [
  {
   "t": "2025-03-03T13:56:13Z",
   "sha": "c3538839bdeba49bb816304ebf696496c62c8777"
  },
  {
   "t": "2025-03-05T13:29:20Z",
   "sha": "e77515ac382601a0d2d2bf46c8a296576417b57d"
  },
  {
   "t": "2025-03-13T10:15:52Z",
   "sha": "630210e20546d04c5f008e5b3290c878ec8e97e6"
  },
  {
   "t": "2025-03-19T15:56:03Z",
   "sha": "1ac35590f0d7e44a19bbac628ceedf50a6bbc2fc"
  },
  {
   "t": "2025-04-08T08:02:27Z",
   "sha": "8ebba0a87495743c2f33c88cd9310a0c6ce8f792"
  },
  {
   "t": "2025-04-08T11:02:38Z",
   "sha": "7f3bb5c95aa4cd73083ff73a7bc8dd895eb81307"
  },
  {
   "t": "2025-04-08T11:10:56Z",
   "sha": "36cf993e2ac2cd948483147b56a8c786ba9c01ac"
  },
  {
   "t": "2025-04-11T07:04:32Z",
   "sha": "c11a3c71426b1112511ed18199e4d896af1f8cf7"
  },
  {
   "t": "2025-05-01T09:46:08Z",
   "sha": "367a329c3f71f3cb917c01c2845f516cb3bd1f80"
  },
  {
   "t": "2025-05-13T05:51:44Z",
   "sha": "81d603dcf12de7d38ce35e31b752781b6b926dd8"
  },
  {
   "t": "2025-05-19T07:56:45Z",
   "sha": "0341e021fe6edfa21252f4bd93b9e1a209383891"
  },
  {
   "t": "2025-06-02T13:49:44Z",
   "sha": "ec8e5df4c148991481e6273f4df81da760e878e8"
  },
  {
   "t": "2025-06-03T06:32:33Z",
   "sha": "5c213595fe91108d191c1550f8ba24206ea341ba"
  },
  {
   "t": "2025-06-04T08:43:50Z",
   "sha": "2fd0fd51237d236ac98330426224180346e69538"
  },
  {
   "t": "2025-06-12T12:51:33Z",
   "sha": "e7ee990a83bf1e6c782c55206ecbba4a256ebe60"
  },
  {
   "t": "2025-06-12T14:43:06Z",
   "sha": "8a6786847c95d9454d5fcc931bc8249e6ff4af28"
  },
  {
   "t": "2025-07-28T14:10:57Z",
   "sha": "8a6786847c95d9454d5fcc931bc8249e6ff4af28"
  },
  {
   "t": "2025-07-28T14:26:01Z",
   "sha": "8d625b8b2cb6bcb41e058d182d88cf23e4993df7"
  },
  {
   "t": "2025-07-30T11:53:15Z",
   "sha": "43ec16989ef1959c20be135b8d6a2547757dfc45"
  },
  {
   "t": "2025-07-30T11:56:08Z",
   "sha": "6e523bda47854333d267f53cfa5292fd2eb40ec7"
  },
  {
   "t": "2025-12-05T13:01:51Z",
   "sha": "98444fe014db8d15bd48f20e4bf50af1c54bf914"
  },
  {
   "t": "2025-12-05T13:03:21Z",
   "sha": "0d36bcb0658dc81da803f4bdfa8e5134c7d050fb"
  },
  {
   "t": "2025-12-08T07:41:17Z",
   "sha": "cda5cb3ec27ac9bf15b947eff0c5cc87cc835c48"
  },
  {
   "t": "2025-12-09T07:24:34Z",
   "sha": "2a2fbec23bafd29bd52ff58b448196eb21c9ada7"
  },
  {
   "t": "2025-12-09T07:25:32Z",
   "sha": "1960799bf5bf353fe17741f725e3e173ac131642"
  },
  {
   "t": "2025-12-10T07:44:11Z",
   "sha": "ee388473c78bca7d99e55a303173ce54a4ad5aa4"
  },
  {
   "t": "2025-12-10T07:46:39Z",
   "sha": "625bbd496433986d4e8500a69163f1be3342ab5c"
  },
  {
   "t": "2025-12-26T09:25:49Z",
   "sha": "5fbef2178a999d7235229525e132cf5b3fe80c2f"
  },
  {
   "t": "2025-12-30T10:14:08Z",
   "sha": "3458d90fad97ecaa2d34fcff0d842aed2db525a6"
  },
  {
   "t": "2025-12-30T10:25:53Z",
   "sha": "0b407dda05f90d2e12d39bfc9ec977ff28757139"
  },
  {
   "t": "2025-12-30T11:19:45Z",
   "sha": "9bd280c121acd8e18395a33189d5b48070a542fc"
  },
  {
   "t": "2026-01-03T05:07:40Z",
   "sha": "1733ddfa1f140da0d6e246159bb9258d6c1b562e"
  },
  {
   "t": "2026-01-22T13:47:30Z",
   "sha": "02d374cc243dd08365b5ccbc0620b2048082a4c6"
  },
  {
   "t": "2026-01-22T13:48:37Z",
   "sha": "34b09c44f4cce80236485fb62c6a05e7fb9a1cd5"
  },
  {
   "t": "2026-02-03T14:47:35Z",
   "sha": "5164b6421d05922282048affa8d4778d4cd72ce6"
  },
  {
   "t": "2026-05-14T11:44:13Z",
   "sha": "76daf4bb0dd1349cf82f7c0c83b259da5111980c"
  },
  {
   "t": "2026-05-16T08:54:12Z",
   "sha": "7af4ee35b58246edb287647ab954b84d1a95c712"
  },
  {
   "t": "2026-05-16T11:01:57Z",
   "sha": "c6a5f1d12ce5e40696f877b1427daf99373f54b7"
  },
  {
   "t": "2026-05-16T15:52:15Z",
   "sha": "197e90d3e366227db66f25a3c39171e2f5a54b2b"
  },
  {
   "t": "2026-05-16T16:05:37Z",
   "sha": "28294c0e71bccc687dbc039d98fe1e45911059b0"
  },
  {
   "t": "2026-05-27T02:58:46Z",
   "sha": "9788e25d3c19cd120c7ff0f87dfc4c9827d27d72"
  },
  {
   "t": "2026-05-27T04:03:18Z",
   "sha": "d141e0bb78dabddbf4729172d991908a2f2a595d"
  },
  {
   "t": "2026-08-11T10:12:28Z",
   "sha": "09211e2f14752d67a6ca83191c96028827627af7"
  },
  {
   "t": "2026-08-27T15:08:03Z",
   "sha": "49fb71420ef76b00ff1a926b924d6ccb57b17c28"
  },
  {
   "t": "2026-08-28T10:52:30Z",
   "sha": "6916d40866f343480ef61094f6354bfe15cb1c04"
  }
 ],
 "additions": 200,
 "deletions": 29,
 "changed_files": 2,
 "commit_count": 1,
 "size_bucket": "M",
 "mergeable_state": "dirty",
 "bot": {
  "drahtbot": {
   "present": true,
   "reviews": {
    "concept_ack": [
     {
      "login": "rkrux",
      "url": "https://github.com/bitcoin/bitcoin/pull/31668#pullrequestreview-3505373212"
     }
    ]
   },
   "conflicts": [
    {
     "number": 35377,
     "title": "wallet: Allow importing of descriptors without private keys when the wallet has the private keys",
     "author": "achow101"
    },
    {
     "number": 35224,
     "title": "wallet: importdescriptors should output the request on error",
     "author": "kevkevinpal"
    },
    {
     "number": 34861,
     "title": "wallet: Add importdescriptors interface",
     "author": "polespinasa"
    }
   ]
  }
 },
 "acks_parsed": {
  "rkrux": {
   "kind": "concept_ack",
   "hash": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "t": "2025-11-25T14:54:07Z",
   "stale": false
  }
 },
 "acks_tally": {
  "ack": 0,
  "stale_ack": 0,
  "concept_ack": 1,
  "approach_ack": 0,
  "nack": 0,
  "concept_nack": 0,
  "approach_nack": 0
 },
 "reviews": {
  "approved": 0,
  "changes_requested": 4,
  "distinct_reviewers": [
   "achow101",
   "darosior",
   "davidrobinsonau",
   "fanquake",
   "furszy",
   "maflcko",
   "mprenditore",
   "rkrux",
   "sedited",
   "w0xlt"
  ]
 },
 "signals": {
  "needs_rebase": true,
  "ci_failed": false,
  "mergeable_state": "dirty",
  "last_author_activity": "2026-08-31T09:36:22Z",
  "last_reviewer_activity": "2026-09-04T10:02:36Z",
  "last_reviewer": "mprenditore",
  "author_silent_days": 17,
  "waiting_on_author_days": 13,
  "days_since_update": 0
 },
 "refs": {
  "mentioned": [
   34135
  ],
  "depends_on": [],
  "fixes": [],
  "linked_issues": [],
  "references": [
   {
    "number": 34135,
    "type": "pull",
    "state": "closed",
    "merged": true,
    "merged_at": "2026-01-06",
    "title": "rpc: [wallet] Use unsigned type for tx version in sendall"
   }
  ],
  "conflicts": [
   35377,
   35224,
   34861
  ]
 },
 "stack": {
  "shares_commits_with": [],
  "based_on": [],
  "base_for": []
 },
 "review_paths": [
  "src/wallet/rpc/backup.cpp",
  "test/functional/wallet_importdescriptors.py",
  "test/functional/wallet_transactiontime_rescan.py"
 ],
 "body": "Fix related to issue: https://github.com/bitcoin/bitcoin/issues/31263",
 "commits": [
  {
   "sha": "6916d40866f343480ef61094f6354bfe15cb1c04",
   "date": "2026-08-28T10:52:08Z",
   "message": "Implement rescan stop with timestamp as never for import descriptors"
  }
 ],
 "timeline": [
  {
   "t": "2025-01-16T13:28:38Z",
   "kind": "comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "text": "This needs a test and the tests fixed"
  },
  {
   "t": "2025-01-17T15:18:20Z",
   "kind": "review_comment",
   "who": "furszy",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": null,
   "text": "This overrides the flag for each imported descriptor, meaning the final value depends solely on the last imported element."
  },
  {
   "t": "2025-01-21T11:06:49Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": null,
   "text": "How does this interact with `timestamp`? As mentioned in the issue thread, I agree it would be better to have another special timestamp value, no?"
  },
  {
   "t": "2025-01-21T11:57:17Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 1920344559,
   "text": "Hi @furszy  I have updated the commit can you please review it once."
  },
  {
   "t": "2025-01-21T12:19:25Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 1923524934,
   "text": "I've seen two major issues while we are importing 2M address to bitcoin using this importdescriptor method.\n\nFirst issue was rescan because we are passing timestamp as 'now' so when we pass now it is taking median time of last scanned block, whereas if we take currentimestamp or futuretimestamp it is considering last mined block timestamp. So when the request is imported successfully it is setting rescan flag as true.\n\n---- Rescan operation\n1. In rescan operation it is taking either last mined block timestamp or median timestamp of last block + last 2 hours.\n\n--- My solution\nSkip rescan if we provide rescan option as false (default true) so irrespective timestamp it won't scan block chain.\nAnd whatever timestamp we got as a request we are passing this to `ProcessDescriptorImport(*pwallet, request, timestamp);`\n\nSecond Issue: not part of this fix its my observation\nI sent a batch of 1000 address each time to importdescriptors method even rescan option as false we may get delay i think its because https://github.com/bitcoin/bitcoin/blob/master/src/wallet/rpc/backup.cpp#L1579 `    std::map<uint256, std::unique_ptr<ScriptPubKeyMan>> m_spk_managers;`"
  },
  {
   "t": "2025-01-21T13:10:39Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 1923524934,
   "text": "[quoted text omitted]\n\nThis seems confusing to users to silently ignore the timestamp. Why not simply have another timestamp value?"
  },
  {
   "t": "2025-01-22T13:29:21Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 1923524934,
   "text": "Hi @maflcko something like`{\"timestamp | \\\"now\\\"|\\\"never\\\"\", \"integer / string\"}`  here never means no scanning. Please suggest your expectation."
  },
  {
   "t": "2025-02-20T16:22:56Z",
   "kind": "review_comment",
   "who": "mprenditore",
   "assoc": "NONE",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 1923524934,
   "text": "I do agree to add `never` to the list of timestamp values to handle this case."
  },
  {
   "t": "2025-02-20T20:47:11Z",
   "kind": "comment",
   "who": "fanquake",
   "assoc": "MEMBER",
   "text": "Moved to draft for now. You'll need to squash your commits, and address the various review feedback."
  },
  {
   "t": "2025-03-02T23:14:26Z",
   "kind": "review_comment",
   "who": "davidrobinsonau",
   "assoc": "NONE",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 1923524934,
   "text": "What do you suggest as the return value for the function when never is passed? So that this can be easily checked against for rescan? it can't be 0 as \"0 can be specified to scan the entire blockchain.\" -1, null?\n\nstatic int64_t GetImportTimestamp(const UniValue& data, int64_t now)\n```\n{\n    if (data.exists(\"timestamp\")) {\n        const UniValue& timestamp = data[\"timestamp\"];\n        if (timestamp.isNum()) {\n            return timestamp.getInt<int64_t>();\n        } else if (timestamp.isStr() && timestamp.get_str() == \"now\") {\n            return now;\n        } else if (timestamp.isStr() && timestamp.get_str() == \"never\") {\n            return ???\n        }\n        throw JSONRPCError(RPC_TYPE_ERROR, strprintf(\"Expected number or \\\"now\\\" timestamp value for key. got type %s\", uvTypeName(timestamp.type())));\n    }\n    throw JSONRPCError(RPC_TYPE_ERROR, \"Missing required timestamp field for key\");\n}\n```"
  },
  {
   "t": "2025-03-03T10:10:07Z",
   "kind": "review_comment",
   "who": "mprenditore",
   "assoc": "NONE",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 1923524934,
   "text": "@davidrobinsonau I think both could be good, but `-1` seems the best option here"
  },
  {
   "t": "2025-03-03T12:14:23Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 1923524934,
   "text": "Updated the code"
  },
  {
   "t": "2025-03-03T13:56:13Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "c3538839bdeba49bb816304ebf696496c62c8777"
  },
  {
   "t": "2025-03-04T16:40:54Z",
   "kind": "comment",
   "who": "mprenditore",
   "assoc": "NONE",
   "text": "[quoted text omitted]\n\n@fanquake code has been updated as per the discussions and all checks are now passing.\nHope now it's good to be merged."
  },
  {
   "t": "2025-03-05T00:04:42Z",
   "kind": "review_comment",
   "who": "davidrobinsonau",
   "assoc": "NONE",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": null,
   "text": "Need to update:\nExpected a number or \\\"now\\\" or \\\"never\\\" timestamp value for key. got type %s"
  },
  {
   "t": "2025-03-05T13:29:20Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "e77515ac382601a0d2d2bf46c8a296576417b57d"
  },
  {
   "t": "2025-03-06T10:41:37Z",
   "kind": "comment",
   "who": "davidrobinsonau",
   "assoc": "NONE",
   "text": "Cloned fresh bitcoin src, then \"gh pr checkout 31668\" and built on Ubuntu WSL2.\nConfirmed importdescriptors with \"timestamp\":\"now\" causes \"RescanFromTime: Rescanning last 16 blocks\".\nConfirmed importdescriptors with \"timestamp\":\"never\" returns in less then a second and no messages about rescanning blocks on bitcoind console.\nThank you!"
  },
  {
   "t": "2025-03-12T14:22:13Z",
   "kind": "comment",
   "who": "mprenditore",
   "assoc": "NONE",
   "text": "Hello @maflcko @furszy @fanquake\nCan this be merged now?"
  },
  {
   "t": "2025-03-12T18:13:08Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": null,
   "text": "Seems a bit odd to skip rescan when all timestamps are negative. Previously, this would rescan the full chain."
  },
  {
   "t": "2025-03-13T05:05:58Z",
   "kind": "review_comment",
   "who": "davidrobinsonau",
   "assoc": "NONE",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 1992051054,
   "text": "Is there a use case for someone to pass a timestamp prior to  January 1, 1970? Which would be a negative number, causing bitcoind not to rescan when it was expected to.\nAlternatively, the code could be updated to only look for \"-1\", meaning anything below that could still be a full rescan."
  },
  {
   "t": "2025-03-13T08:18:16Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 1992051054,
   "text": "It has been permitted previously and this commit is silently breaking it. If you want to use -1, it seems better  to properly sanitize the user input first, or use a different approach."
  },
  {
   "t": "2025-03-13T10:15:52Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "630210e20546d04c5f008e5b3290c878ec8e97e6"
  },
  {
   "t": "2025-03-13T10:18:18Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 1992051054,
   "text": "I've updated code block. Could you please check @maflcko and @davidrobinsonau"
  },
  {
   "t": "2025-03-14T08:49:09Z",
   "kind": "review_comment",
   "who": "davidrobinsonau",
   "assoc": "NONE",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 1992051054,
   "text": "This code is getting complex for a simple change. @maflcko, you stated above that instead of having another field, \"rescan\", we should simply use a value for the timestamp field to advise if a rescan is needed. This has been done, but sadly, the function \"static int64_t GetImportTimestamp(const UniValue& data, int64_t now)\"  only returns an int64_t, and we need to work with that returned value, AFAIK, we can't use null as its not a pointer. So that leaves a number, which is currently -1.\n\nThe code revision checks for anything negative, which we now know will silently break what was assumed to be ok, the following code is far too complex for a simple return value check.\n\nCan we go back to -1 and update the help to state that to stop a rescan use either \"-1\" or \"never\".  Anything lower than -1 will cause a rescan as previously supported. The chances of someone passing -1 as an actual datetime (January 1, 1970) number is very very low. And if they do, the help docs will explain why it didn't work.\n\nI propose we change 1713 from:\n`all_rescan_value += (requestTimestamp < 0 ? 0 : 1);`\nto\n`if (requestTimestamp != -1) all_rescan_value++;\n`"
  },
  {
   "t": "2025-03-14T09:08:05Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 1992051054,
   "text": "[quoted text omitted]\n\nIn C++, it is possible to use `std::optional`. An alternative would be to sanitize user-input and reject negative integer values. There may be other alternatives to write clean code, but it is somewhat the burden of the pull request author to write clean and easily revieable code. If reviewers write the code for the pull request author, they could have created the pull themselves.\n\nI don't have a strong opinion on this, but personally I don't feel comfortable to ack the current code, or an added footgun/break for users, albeit small."
  },
  {
   "t": "2025-03-14T13:48:01Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 1992051054,
   "text": "May I know what is the issue with current fix: It will handle negative and positive, \"never\" cases.\n\n`            auto requestTimestamp = GetImportTimestamp(request, now);\n            // if any one entity has valid timestamp we can skp this check\n            if (!all_rescan_value) {\n                if (requestTimestamp < 0) {\n                    const UniValue& timestamp = request[\"timestamp\"];\n                    // set all_rescan_value true if requested timestamp is negative otherwise it all_rescan_value value never\n                    if (timestamp.isNum() && timestamp.getInt<int64_t>() == requestTimestamp) {\n                        all_rescan_value += 1;\n                    }\n                } else {\n                    all_rescan_value += 1;\n                }\n            }`\n\nIt will check only if any one entity has valid timestamp (positive or negative) then rescan will be enable.\n\n@maflcko in your comment you have mentioned **sanitize user-input and reject negative integer values** . If i reject negative values it won't do full rescan right."
  },
  {
   "t": "2025-03-19T15:56:03Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "1ac35590f0d7e44a19bbac628ceedf50a6bbc2fc"
  },
  {
   "t": "2025-04-01T18:07:44Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 1992051054,
   "text": "[quoted text omitted]\n\nYes, if you return early before the rescan happens, then the rescan won't happen."
  },
  {
   "t": "2025-04-02T21:58:21Z",
   "kind": "review_comment",
   "who": "w0xlt",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": null,
   "text": "```suggestion\n        rescan = all_rescan_value > 0 ;\n```"
  },
  {
   "t": "2025-04-02T21:59:43Z",
   "kind": "review",
   "who": "w0xlt",
   "assoc": "CONTRIBUTOR",
   "state": "COMMENTED",
   "commit": "1ac35590f0d7e44a19bbac628ceedf50a6bbc2fc",
   "text": "It would be good to add test cases for the \"never\" option."
  },
  {
   "t": "2025-04-08T08:02:27Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "8ebba0a87495743c2f33c88cd9310a0c6ce8f792"
  },
  {
   "t": "2025-04-08T11:02:38Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "7f3bb5c95aa4cd73083ff73a7bc8dd895eb81307"
  },
  {
   "t": "2025-04-08T11:10:56Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "36cf993e2ac2cd948483147b56a8c786ba9c01ac"
  },
  {
   "t": "2025-04-10T19:33:45Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": null,
   "text": "nit: These 2 lines can be condensed into one `if`.\n\n```suggestion\n            if (!all_rescan_value && requestTimestamp >= 0) {\n```"
  },
  {
   "t": "2025-04-10T19:34:20Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": null,
   "text": "nit:\n\n```suggestion\n                    all_rescan_value ++;\n```"
  },
  {
   "t": "2025-04-10T19:35:16Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": null,
   "text": "The prior behavior would skip rescanning on failed imports. This seems to no longer be the case."
  },
  {
   "t": "2025-04-10T19:35:32Z",
   "kind": "review",
   "who": "achow101",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "36cf993e2ac2cd948483147b56a8c786ba9c01ac",
   "text": "I also would like to see a functional test for the new behavior."
  },
  {
   "t": "2025-04-11T07:04:32Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "c11a3c71426b1112511ed18199e4d896af1f8cf7"
  },
  {
   "t": "2025-04-11T07:06:58Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 2038172963,
   "text": "Hi @achow101 I've improved the logic and taken care your point as well. And also updated functional test case."
  },
  {
   "t": "2025-04-23T13:03:57Z",
   "kind": "comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "text": "Hi All @achow101 @furszy @mprenditore @maflcko @w0xlt @davidrobinsonau request to re-review this PR and provide ACK."
  },
  {
   "t": "2025-04-23T20:03:15Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": null,
   "text": "While this verifies that the address was imported, what we care about here is whether a rescan occurred. It would be better to send to the address for the descriptor being imported, then check to see that after importing, the transaction is not detected."
  },
  {
   "t": "2025-04-23T20:05:47Z",
   "kind": "review",
   "who": "achow101",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "c11a3c71426b1112511ed18199e4d896af1f8cf7",
   "text": "There should also be a test where multiple things are imported, one with a timestamp, and one with `never`. There should be a rescan in this case."
  },
  {
   "t": "2025-05-01T09:46:08Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "367a329c3f71f3cb917c01c2845f516cb3bd1f80"
  },
  {
   "t": "2025-05-01T12:15:51Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 2056798497,
   "text": "Could you please check updated test cases."
  },
  {
   "t": "2025-05-12T14:24:24Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 2056798497,
   "text": "Hi @achow101 could you please check this. Merge it if everything is okay."
  },
  {
   "t": "2025-05-13T05:51:44Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "81d603dcf12de7d38ce35e31b752781b6b926dd8"
  },
  {
   "t": "2025-05-19T07:56:45Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "0341e021fe6edfa21252f4bd93b9e1a209383891"
  },
  {
   "t": "2025-05-28T06:26:21Z",
   "kind": "comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "text": "Hi @achow101 @maflcko @davidrobinsonau can you please check this once and merge it everything is fine."
  },
  {
   "t": "2025-05-28T07:51:43Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": null,
   "text": "nit: new code should put the `}` before the `else if`"
  },
  {
   "t": "2025-05-28T21:53:18Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": null,
   "text": "In 0341e021fe6edfa21252f4bd93b9e1a209383891 \"Implement rescan stop with timestamp as never for import descriptors\"\n\nPlease use `snake_case` for new variables. Additionally, when the type is not annoying to type out, please give the full type rather than use `auto`.\n\nSame for `requestTimestamp` below."
  },
  {
   "t": "2025-05-28T21:54:19Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": null,
   "text": "In 0341e021fe6edfa21252f4bd93b9e1a209383891 \"Implement rescan stop with timestamp as never for import descriptors\"\n\nnit: space between `now` and `:`\n\n```suggestion\n            const int64_t timestamp = requestTimestamp < 0 ? now : requestTimestamp;\n```"
  },
  {
   "t": "2025-06-02T07:33:26Z",
   "kind": "review_comment",
   "who": "maflcko",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_transactiontime_rescan.py",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 2095091122,
   "text": "not sure why this was marked resolved?"
  },
  {
   "t": "2025-06-02T13:49:44Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "ec8e5df4c148991481e6273f4df81da760e878e8"
  },
  {
   "t": "2025-06-03T06:32:33Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "5c213595fe91108d191c1550f8ba24206ea341ba"
  },
  {
   "t": "2025-06-03T08:01:22Z",
   "kind": "comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "text": "Hi @achow101 and @maflcko I've fixed your review comments."
  },
  {
   "t": "2025-06-03T21:55:01Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_transactiontime_rescan.py",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": null,
   "text": "This test with `now` is basically the same as `never`. Since the distinction is that `now` does actually rescan a little bit, it would be good to add in the setup for these tests a transaction that would be scanned by `now` but not `never`."
  },
  {
   "t": "2025-06-04T08:43:50Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "2fd0fd51237d236ac98330426224180346e69538"
  },
  {
   "t": "2025-06-04T08:45:07Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_transactiontime_rescan.py",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 2124994068,
   "text": "hi @achow101 I've added more test cases."
  },
  {
   "t": "2025-06-09T10:39:30Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_transactiontime_rescan.py",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 2124994068,
   "text": "Hi @achow101 could you please share your thoughts with the latest changes."
  },
  {
   "t": "2025-06-11T23:20:43Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_transactiontime_rescan.py",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 2124994068,
   "text": "Sorry, but your latest test changes do not really implement what I was suggesting.\n\nMy point was that you need to distinguish between `now` and `never`, and currently the tests do not do that. The outcome of rescanning due to `\"timestamp\": \"now\"` should be different from the outcome of not rescanning due to `\"timestamp\": \"never\"`. As it is now, both tests have the same outcome due to the setup, so we don't know whether there is a bug in the handling of `now` or `never`.\n\nMy suggestion is not to make yet another copy of the same import and balance check as you have done. Rather, my suggestion is that you should change the setup such that rescanning with `now` produces a different result (i.e. balance) than with `never`.\n\nOne way you might do this is to change the above `set_node_times` so that the time used for `now` overlaps with some of the transactions that are made earlier in the test. An alternative could be to create a transaction after `set_node_times` but before any imports as such a transaction would definitely fall within the `now` rescan range. However, it may require other changes to the test as balances may change.\n\nYou may have a different idea on how to do that test, it's up to you to decide how to approach writing that. Either way, the difference in behavior between `now` and `never` should be tested here that demonstrates how `now` and `never` can have different outcomes."
  },
  {
   "t": "2025-06-12T12:51:33Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "e7ee990a83bf1e6c782c55206ecbba4a256ebe60"
  },
  {
   "t": "2025-06-12T14:43:06Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "8a6786847c95d9454d5fcc931bc8249e6ff4af28"
  },
  {
   "t": "2025-06-13T05:35:26Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_transactiontime_rescan.py",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 2124994068,
   "text": "Hi @achow101 Thanks for your suggestion, I hope i understand it correctly and I updated the test cases. Kindly review it again."
  },
  {
   "t": "2025-06-19T10:27:29Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_transactiontime_rescan.py",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 2124994068,
   "text": "Hi @achow101 any update on the fix I provided."
  },
  {
   "t": "2025-07-03T08:05:36Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_transactiontime_rescan.py",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 2124994068,
   "text": "hi @achow101 can you please review it again."
  },
  {
   "t": "2025-07-16T08:12:17Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_transactiontime_rescan.py",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 2124994068,
   "text": "Hi @achow101 kindly give some update on this."
  },
  {
   "t": "2025-07-18T09:03:07Z",
   "kind": "comment",
   "who": "mprenditore",
   "assoc": "NONE",
   "text": "Hello, is possible to review it again? It should be all good now.\nThanks a lot for the support :)"
  },
  {
   "t": "2025-07-28T14:10:57Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "8a6786847c95d9454d5fcc931bc8249e6ff4af28"
  },
  {
   "t": "2025-07-28T14:26:01Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "8d625b8b2cb6bcb41e058d182d88cf23e4993df7"
  },
  {
   "t": "2025-07-30T11:38:03Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_transactiontime_rescan.py",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 2124994068,
   "text": "HI @achow101 can you please approve this PR"
  },
  {
   "t": "2025-07-30T11:53:15Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "43ec16989ef1959c20be135b8d6a2547757dfc45"
  },
  {
   "t": "2025-07-30T11:56:08Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7"
  },
  {
   "t": "2025-08-08T09:18:08Z",
   "kind": "comment",
   "who": "mprenditore",
   "assoc": "NONE",
   "text": "Hello, anything still pending or can now be merged?"
  },
  {
   "t": "2025-08-08T18:32:22Z",
   "kind": "comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "text": "[quoted text omitted]\n\nAll PRs must be reviewed prior to being merged. This PR does not have sufficient review, so it cannot be merged."
  },
  {
   "t": "2025-08-12T06:55:57Z",
   "kind": "comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "text": "Hi all, could you please complete the review I've resolved all the comments of the previous review comments."
  },
  {
   "t": "2025-09-02T07:13:22Z",
   "kind": "comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "text": "Hi @furszy kindly acknowledge this review its been waiting for very long time."
  },
  {
   "t": "2025-11-17T21:47:03Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_transactiontime_rescan.py",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6",
   "in_reply_to": null,
   "text": "It's unnecessary to log this kind of information. This would be more appropriate as a comment, but it's really not necessary at all (yes this test does that elsewhere, but it shouldn't)."
  },
  {
   "t": "2025-11-17T21:48:29Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_transactiontime_rescan.py",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6",
   "in_reply_to": null,
   "text": "It's not necessary to generate `COINBASE_MATURITY` blocks since we're not spending those coins. This also makes the previously existing comment incorrect as that states only 10 blocks are being mined."
  },
  {
   "t": "2025-11-17T21:48:38Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_transactiontime_rescan.py",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6",
   "in_reply_to": null,
   "text": "This log is unnecessary."
  },
  {
   "t": "2025-11-17T21:49:10Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_transactiontime_rescan.py",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6",
   "in_reply_to": null,
   "text": "I don't think this test case is necessary, it doesn't seem to me to be testing anything that isn't already being tested."
  },
  {
   "t": "2025-11-25T14:34:49Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": null,
   "text": "I think the test cases can be greatly simplified with the following diff:\n\n```diff\ndiff --git a/test/functional/wallet_importdescriptors.py b/test/functional/wallet_importdescriptors.py\nindex 49c41b0a1f..588d7725dc 100755\n--- a/test/functional/wallet_importdescriptors.py\n+++ b/test/functional/wallet_importdescriptors.py\n@@ -25,6 +25,7 @@ from test_framework.descriptors import descsum_create\n from test_framework.util import (\n     assert_equal,\n     assert_raises_rpc_error,\n+    assert_greater_than,\n )\n from test_framework.wallet_util import (\n     get_generate_key,\n@@ -63,6 +64,43 @@ class ImportDescriptorsTest(BitcoinTestFramework):\n             assert_equal(result[0]['error']['code'], error_code)\n             assert_equal(result[0]['error']['message'], error_message)\n\n+    def test_importdescriptor_never_timestamp(self, node, funding_wallet):\n+        self.log.info(\"Test importing descriptors with timestamp as never\")\n+        assert_greater_than(funding_wallet.getbalance(), 0)\n+\n+        key = get_generate_key()\n+        funding_amount = 1 # BTC\n+        txid = funding_wallet.send(outputs=[{key.p2wpkh_addr: funding_amount}])[\"txid\"]\n+        self.generate(node, 1, sync_fun=self.no_op)\n+\n+        wpkh_desc = descsum_create(\"wpkh(\" + key.pubkey + \")\")\n+        spare_pkh_desc = descsum_create(\"pkh(\" + key.pubkey + \")\")\n+\n+        node.createwallet(wallet_name='never_wallet', disable_private_keys=True, blank=True)\n+        never_wallet = node.get_wallet_rpc('never_wallet')\n+        assert_equal(never_wallet.getbalance(), 0)\n+        with node.assert_debug_log(expected_msgs=[], unexpected_msgs=[\"Rescanning last\"]):\n+            self.test_importdesc({\"desc\": wpkh_desc, \"timestamp\": \"never\"}, success=True, wallet=never_wallet)\n+        assert_equal(never_wallet.getbalance(), 0)\n+        assert_equal(never_wallet.listtransactions(), [])\n+\n+        node.createwallet(wallet_name='now_wallet', disable_private_keys=True, blank=True)\n+        now_wallet = node.get_wallet_rpc('now_wallet')\n+        assert_equal(now_wallet.getbalance(), 0)\n+        with node.assert_debug_log(expected_msgs=[\"Rescanning last\"]):\n+            self.test_importdesc({\"desc\": wpkh_desc, \"timestamp\": \"now\"}, success=True, wallet=now_wallet)\n+        assert_equal(now_wallet.getbalance(), funding_amount)\n+        assert_equal(now_wallet.listtransactions()[0][\"txid\"], txid)\n+\n+        node.createwallet(wallet_name='never_now_wallet', disable_private_keys=True, blank=True)\n+        never_now_wallet = node.get_wallet_rpc('never_now_wallet')\n+        assert_equal(never_now_wallet.getbalance(), 0)\n+        # passing \"now\" timestamp for the spare_pkh_desc import causes the rescan that finds the transaction of the wpkh_desc\n+        with node.assert_debug_log(expected_msgs=[\"Rescanning last\"]):\n+            never_now_wallet.importdescriptors([{\"desc\": wpkh_desc, \"timestamp\": \"never\"}, {\"desc\": spare_pkh_desc, \"timestamp\": \"now\"}])\n+        assert_equal(never_now_wallet.getbalance(), funding_amount)\n+        assert_equal(never_now_wallet.listtransactions()[0][\"txid\"], txid)\n+\n     def run_test(self):\n         self.log.info('Setting up wallets')\n         self.nodes[0].createwallet(wallet_name='w0', disable_private_keys=False)\n@@ -102,20 +140,6 @@ class ImportDescriptorsTest(BitcoinTestFramework):\n                      labels=[\"Descriptor import test\"])\n         assert_equal(w1.getwalletinfo()['keypoolsize'], 0)\n\n-        # Test importing of a P2PKH descriptor with timestamp as never\n-        key = get_generate_key()\n-        self.log.info(\"Should import a p2pkh descriptor with timestamp as never\")\n-        import_request = {\"desc\": descsum_create(\"pkh(\" + key.pubkey + \")\"),\n-                 \"timestamp\": \"never\",\n-                 \"label\": \"Descriptor import test with never as timestamp\"}\n-        self.test_importdesc(import_request, success=True)\n-        test_address(w1,\n-                     key.p2pkh_addr,\n-                     solvable=True,\n-                     ismine=True,\n-                     labels=[\"Descriptor import test with never as timestamp\"])\n-        assert_equal(w1.getwalletinfo()['keypoolsize'], 0)\n-\n         self.log.info(\"Test can import same descriptor with public key twice\")\n         self.test_importdesc(import_request, success=True)\n\n@@ -784,5 +808,7 @@ class ImportDescriptorsTest(BitcoinTestFramework):\n             assert_equal(w_multipath.getrawchangeaddress(address_type=\"bech32\"), w_multisplit.getrawchangeaddress(address_type=\"bech32\"))\n         assert_equal(sorted(w_multipath.listdescriptors()[\"descriptors\"], key=lambda x: x[\"desc\"]), sorted(w_multisplit.listdescriptors()[\"descriptors\"], key=lambda x: x[\"desc\"]))\n\n+        self.test_importdescriptor_never_timestamp(self.nodes[0], w0)\n+\n if __name__ == '__main__':\n     ImportDescriptorsTest(__file__).main()\n```\n\nThe changes in `test/functional/wallet_transactiontime_rescan.py` can be removed IMHO."
  },
  {
   "t": "2025-11-25T14:35:27Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "1960799bf5bf353fe17741f725e3e173ac131642",
   "in_reply_to": null,
   "text": "Would be good to add a small test case for this newly added condition as well."
  },
  {
   "t": "2025-11-25T14:54:07Z",
   "kind": "review",
   "who": "rkrux",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "text": "Concept ACK 6e523bda47854333d267f53cfa5292fd2eb40ec7\n\nAgree with the intent to avoid rescanning if the user specifies so."
  },
  {
   "t": "2025-12-05T13:01:51Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "98444fe014db8d15bd48f20e4bf50af1c54bf914"
  },
  {
   "t": "2025-12-05T13:03:21Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "0d36bcb0658dc81da803f4bdfa8e5134c7d050fb"
  },
  {
   "t": "2025-12-05T13:05:17Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 2560222785,
   "text": "its done thanks for updated test cases."
  },
  {
   "t": "2025-12-05T13:05:52Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 2560222785,
   "text": "Hi @achow101 regrading this what do you think \"The changes in test/functional/wallet_transactiontime_rescan.py can be removed IMHO.\""
  },
  {
   "t": "2025-12-05T13:14:44Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "1960799bf5bf353fe17741f725e3e173ac131642",
   "in_reply_to": 2560225153,
   "text": "I tried add the function test cases but the python was giving an exception  `raise JSONRPCException(response['error'], status)` Then I debug the issue in `throw JSONRPCError(RPC_TYPE_ERROR, \"timestamp should be greater than zero\");` it setting         if (jsonrpc_version == JSONRPCVersion::V1_LEGACY) reply.pushKV(\"error\", NullUniValue); so in authproxy.py `            if 'error' in response:\n                raise JSONRPCException(response['error'], status)` checking if error is there or not then its throwing exception so I think we must address JSONRPCException issues in a separate ticket instead of fixing here."
  },
  {
   "t": "2025-12-08T07:41:17Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "cda5cb3ec27ac9bf15b947eff0c5cc87cc835c48"
  },
  {
   "t": "2025-12-08T15:38:33Z",
   "kind": "review_comment",
   "who": "furszy",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "1960799bf5bf353fe17741f725e3e173ac131642",
   "in_reply_to": null,
   "text": "In cda5cb3ec27ac9bf15b947eff0c5cc87cc835c48:\n\nThis change should be in a different commit."
  },
  {
   "t": "2025-12-08T15:41:27Z",
   "kind": "review_comment",
   "who": "furszy",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "1960799bf5bf353fe17741f725e3e173ac131642",
   "in_reply_to": null,
   "text": "In cda5cb3ec27ac9bf15b947eff0c5cc87cc835c48:\n\nInstead of returning -1, could change the return value to optional, and here return `std::nullopt`."
  },
  {
   "t": "2025-12-08T15:49:54Z",
   "kind": "review_comment",
   "who": "furszy",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "cda5cb3ec27ac9bf15b947eff0c5cc87cc835c48",
   "in_reply_to": null,
   "text": "In https://github.com/bitcoin/bitcoin/commit/cda5cb3ec27ac9bf15b947eff0c5cc87cc835c48:\n\nNeed to unload the wallets after using them; otherwise they stay loaded for other tests in this file as well.\nAlso, you can do this in fewer lines of code with a loop. As far as I can see, the only per-round variants are the timestamp, the balance, and the tx list."
  },
  {
   "t": "2025-12-08T15:51:27Z",
   "kind": "review",
   "who": "furszy",
   "assoc": "MEMBER",
   "state": "COMMENTED",
   "commit": "cda5cb3ec27ac9bf15b947eff0c5cc87cc835c48",
   "text": "Instead of using `timestamp=never`, which is not really descriptive. What about using `new`?"
  },
  {
   "t": "2025-12-09T07:24:34Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "2a2fbec23bafd29bd52ff58b448196eb21c9ada7"
  },
  {
   "t": "2025-12-09T07:25:32Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "1960799bf5bf353fe17741f725e3e173ac131642"
  },
  {
   "t": "2025-12-09T14:37:14Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "cda5cb3ec27ac9bf15b947eff0c5cc87cc835c48",
   "in_reply_to": 2599145016,
   "text": "Updated."
  },
  {
   "t": "2025-12-09T14:39:22Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "1960799bf5bf353fe17741f725e3e173ac131642",
   "in_reply_to": 2599106467,
   "text": "I didn't see the usage of std::optional here and I prefer minimal change so that it won't effect in other places."
  },
  {
   "t": "2025-12-09T14:39:57Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "1960799bf5bf353fe17741f725e3e173ac131642",
   "in_reply_to": 2599095627,
   "text": "I didn't get your comment."
  },
  {
   "t": "2025-12-09T14:53:34Z",
   "kind": "review_comment",
   "who": "furszy",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "1960799bf5bf353fe17741f725e3e173ac131642",
   "in_reply_to": 2599095627,
   "text": "The new exception you are throwing here is not related to the \"never\" timestamp change. It should be on its own commit."
  },
  {
   "t": "2025-12-09T14:56:03Z",
   "kind": "review_comment",
   "who": "furszy",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "1960799bf5bf353fe17741f725e3e173ac131642",
   "in_reply_to": 2599106467,
   "text": "[quoted text omitted]\n\nif this affects other places that were not modified by this PR, we should take care of them. I would try using `std::optional`, it might clean some code for you."
  },
  {
   "t": "2025-12-09T14:58:37Z",
   "kind": "review_comment",
   "who": "furszy",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "6916d40866f343480ef61094f6354bfe15cb1c04",
   "in_reply_to": null,
   "text": "this two args don't change for all wallets. Can hardcode them below."
  },
  {
   "t": "2025-12-09T15:00:06Z",
   "kind": "review_comment",
   "who": "furszy",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "1960799bf5bf353fe17741f725e3e173ac131642",
   "in_reply_to": null,
   "text": "LLM output? Remove the emoji please."
  },
  {
   "t": "2025-12-10T07:44:11Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "ee388473c78bca7d99e55a303173ce54a4ad5aa4"
  },
  {
   "t": "2025-12-10T07:46:39Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "625bbd496433986d4e8500a69163f1be3342ab5c"
  },
  {
   "t": "2025-12-10T07:49:21Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "1960799bf5bf353fe17741f725e3e173ac131642",
   "in_reply_to": 2603037993,
   "text": "done"
  },
  {
   "t": "2025-12-10T07:50:01Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "6916d40866f343480ef61094f6354bfe15cb1c04",
   "in_reply_to": 2603032047,
   "text": "Please check once its different."
  },
  {
   "t": "2025-12-10T07:50:22Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "1960799bf5bf353fe17741f725e3e173ac131642",
   "in_reply_to": 2599106467,
   "text": "Updated can you check once."
  },
  {
   "t": "2025-12-10T07:50:54Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "1960799bf5bf353fe17741f725e3e173ac131642",
   "in_reply_to": 2599095627,
   "text": "done."
  },
  {
   "t": "2025-12-23T23:56:18Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6",
   "in_reply_to": null,
   "text": "In 72e22c3e9bb034591222aee8247c15f1eeeb199a \"Implement rescan stop with timestamp as never for import descriptors\"\n\nThe purpose of using an optional for `GetImportTimestamp` is to actually use the optional and check whether it has a value, not to immediately go back to essentially the original code with `-1` being a magic number."
  },
  {
   "t": "2025-12-24T00:03:49Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "6e523bda47854333d267f53cfa5292fd2eb40ec7",
   "in_reply_to": 2560222785,
   "text": "Yes the changes to wallet_transactiontime_rescan.py can be removed as the changes to wallet_importdescriptor.py sufficiently cover those cases."
  },
  {
   "t": "2025-12-24T00:13:02Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6",
   "in_reply_to": null,
   "text": "In 72e22c3e9bb034591222aee8247c15f1eeeb199a \"Implement rescan stop with timestamp as never for import descriptors\"\n\nThis field is never used."
  },
  {
   "t": "2025-12-24T00:14:16Z",
   "kind": "review_comment",
   "who": "achow101",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6",
   "in_reply_to": null,
   "text": "In 72e22c3e9bb034591222aee8247c15f1eeeb199a \"Implement rescan stop with timestamp as never for import descriptors\"\n\nInstead of special casing for a specific wallet, `test_importdesc` can be changed to be also accept lists:\n\n```diff\n--- a/test/functional/wallet_importdescriptors.py\n+++ b/test/functional/wallet_importdescriptors.py\n@@ -54,7 +54,9 @@ class ImportDescriptorsTest(BitcoinTestFramework):\n         if wallet is not None:\n             wrpc = wallet\n\n-        result = wrpc.importdescriptors([req])\n+        if not isinstance(req, list):\n+            req = [req]\n+        result = wrpc.importdescriptors(req)\n         observed_warnings = []\n         if 'warnings' in result[0]:\n             observed_warnings = result[0]['warnings']\n```"
  },
  {
   "t": "2025-12-26T09:25:49Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "5fbef2178a999d7235229525e132cf5b3fe80c2f"
  },
  {
   "t": "2025-12-29T12:26:20Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6",
   "in_reply_to": 2644485961,
   "text": "Using this^ suggestion:\n\n```diff\n@@ -117,16 +119,14 @@ class ImportDescriptorsTest(BitcoinTestFramework):\n             # Debug log validation and descriptor import\n             with node.assert_debug_log(expected_msgs=config[\"expected_msgs\"],\n                                     unexpected_msgs=config[\"unexpected_msgs\"]):\n-                if config[\"name\"] == \"never_now_wallet\":\n-                    wallet.importdescriptors(config[\"import_data\"])\n-                else:\n-                    self.test_importdesc(config[\"import_data\"][0], success=True, wallet=wallet)\n+                self.test_importdesc(config[\"request\"], success=True, wallet=wallet)\n```"
  },
  {
   "t": "2025-12-29T12:31:15Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "c6a5f1d12ce5e40696f877b1427daf99373f54b7",
   "in_reply_to": null,
   "text": "This can be tested with the following diff:\n\n```diff\n@@ -761,6 +761,12 @@ class ImportDescriptorsTest(BitcoinTestFramework):\n                               success=True,\n                               warnings=[\"Unknown output type, cannot set descriptor to active.\"])\n\n+        self.log.info(\"Test importing a descriptor with negative timestamp\")\n+        assert_raises_rpc_error(-3, \"timestamp should be greater than zero\", w1.importdescriptors, [{\"desc\": descsum_create(\"pk(tpubDCJtdt5dgJpdhW4MtaVYDhG4T4tF6jcLR1PxL43q9pq1mxvXgMS9Mzw1HnXG15vxUGQJMMSqCQHMTy3F1eW5VkgVroWzchsPD5BUojrcWs8/*)\"),\n+                              \"active\": True,\n+                              \"range\": 1,\n+                              \"timestamp\": -2}])\n+\n```\n\n[quoted text omitted]\nAlthough, another way could be to directly parse timestamp as an unsigned integer along the lines of the changes done in #34135 so that this check is not needed at all, but I believe that would increase the diff of this PR a bit. Thus, we can just add a test for this `if` condition for the time being."
  },
  {
   "t": "2025-12-29T12:33:05Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6",
   "in_reply_to": 2644484868,
   "text": "Yes, it's never used. Please remove it."
  },
  {
   "t": "2025-12-29T12:34:31Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6",
   "in_reply_to": null,
   "text": "Few nits in this function:\n\n```diff\ndiff --git a/test/functional/wallet_importdescriptors.py b/test/functional/wallet_importdescriptors.py\nindex a19157ced4..ba051afee2 100755\n--- a/test/functional/wallet_importdescriptors.py\n+++ b/test/functional/wallet_importdescriptors.py\n@@ -64,13 +66,13 @@ class ImportDescriptorsTest(BitcoinTestFramework):\n             assert_equal(result[0]['error']['code'], error_code)\n             assert_equal(result[0]['error']['message'], error_message)\n\n-    def test_importdescriptor_never_timestamp(self, node, funding_wallet):\n+    def test_importdescriptor_never_timestamp(self, *, node, funding_wallet):\n         self.log.info(\"Test importing descriptors with timestamp as never\")\n         assert_greater_than(funding_wallet.getbalance(), 0)\n\n         key = get_generate_key()\n         funding_amount = 1 # BTC\n-        txid = funding_wallet.send(outputs=[{key.p2wpkh_addr: funding_amount}])[\"txid\"]\n+        funding_tx_id = funding_wallet.send(outputs=[{key.p2wpkh_addr: funding_amount}])[\"txid\"]\n         self.generate(node, 1, sync_fun=self.no_op)\n\n         wpkh_desc = descsum_create(\"wpkh(\" + key.pubkey + \")\")\n@@ -79,30 +81,30 @@ class ImportDescriptorsTest(BitcoinTestFramework):\n         wallet_configs = [\n             {\n                 \"name\": \"never_wallet\",\n-                \"timestamp\": \"never\",\n+                \"request\": [{\"desc\": wpkh_desc, \"timestamp\": \"never\"}],\n                 \"expected_balance\": 0,\n                 \"expected_msgs\": [],\n                 \"unexpected_msgs\": [\"Rescanning last\"],\n-                \"import_data\": [{\"desc\": wpkh_desc, \"timestamp\": \"never\"}]\n+                \"expected_txid\": None\n             },\n             {\n                 \"name\": \"now_wallet\",\n-                \"timestamp\": \"now\",\n+                \"request\": [{\"desc\": wpkh_desc, \"timestamp\": \"now\"}],\n                 \"expected_balance\": funding_amount,\n                 \"expected_msgs\": [\"Rescanning last\"],\n                 \"unexpected_msgs\": [],\n-                \"import_data\": [{\"desc\": wpkh_desc, \"timestamp\": \"now\"}]\n+                \"expected_txid\": funding_tx_id\n             },\n             {\n                 \"name\": \"never_now_wallet\",\n-                \"timestamp\": None,   # custom case\n+                \"request\": [\n+                    {\"desc\": wpkh_desc, \"timestamp\": \"never\"},\n+                    {\"desc\": spare_pkh_desc, \"timestamp\": \"now\"},\n+                ],\n                 \"expected_balance\": funding_amount,\n                 \"expected_msgs\": [\"Rescanning last\"],\n                 \"unexpected_msgs\": [],\n-                \"import_data\": [\n-                    {\"desc\": wpkh_desc, \"timestamp\": \"never\"},\n-                    {\"desc\": spare_pkh_desc, \"timestamp\": \"now\"},\n-                ]\n+                \"expected_txid\": funding_tx_id\n             }\n         ]\n\n@@ -117,16 +119,14 @@ class ImportDescriptorsTest(BitcoinTestFramework):\n-            # Validate resulting balance + transactions\n+            # Validate resulting balance\n             assert_equal(wallet.getbalance(), config[\"expected_balance\"])\n\n-            if config[\"expected_balance\"] > 0:\n-                assert_equal(wallet.listtransactions()[0][\"txid\"], txid)\n+            if config[\"expected_txid\"]:\n+                for tx in wallet.listtransactions():\n+                    assert_equal(tx[\"txid\"], config[\"expected_txid\"])\n             else:\n                 assert_equal(wallet.listtransactions(), [])\n\n@@ -854,7 +860,7 @@ class ImportDescriptorsTest(BitcoinTestFramework):\n             assert_equal(w_multipath.getrawchangeaddress(address_type=\"bech32\"), w_multisplit.getrawchangeaddress(address_type=\"bech32\"))\n         assert_equal(sorted(w_multipath.listdescriptors()[\"descriptors\"], key=lambda x: x[\"desc\"]), sorted(w_multisplit.listdescriptors()[\"descriptors\"], key=lambda x: x[\"desc\"]))\n\n-        self.test_importdescriptor_never_timestamp(self.nodes[0], w0)\n+        self.test_importdescriptor_never_timestamp(node=self.nodes[0], funding_wallet=w0)\n\n if __name__ == '__main__':\n     ImportDescriptorsTest(__file__).main()\n\n```"
  },
  {
   "t": "2025-12-29T12:35:36Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_transactiontime_rescan.py",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6",
   "in_reply_to": null,
   "text": "As suggested in this comment as well, please remove all the changes in this file: https://github.com/bitcoin/bitcoin/pull/31668#discussion_r2644476061\n\n[quoted text omitted]\nThis should help in reducing the diff, making the review easier."
  },
  {
   "t": "2025-12-29T12:45:54Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6",
   "in_reply_to": 2644467615,
   "text": "Yes, agree with this comment.\n\n```diff\ndiff --git a/src/wallet/rpc/backup.cpp b/src/wallet/rpc/backup.cpp\nindex 617e0e8879..4cbc6cc8d6 100644\n--- a/src/wallet/rpc/backup.cpp\n+++ b/src/wallet/rpc/backup.cpp\n@@ -389,9 +389,9 @@ RPCHelpMan importdescriptors()\n         // Get all timestamps and extract the lowest timestamp\n         for (const UniValue& request : requests.getValues()) {\n             // This throws an error if \"timestamp\" doesn't exist\n-            auto request_timestamp = GetImportTimestamp(request, now).value_or(-1);\n+            auto request_timestamp = GetImportTimestamp(request, now);\n             // If request_timestamp is never then timestamp will be now\n-            const int64_t timestamp = request_timestamp < 0 ? now : request_timestamp;\n+            const int64_t timestamp = request_timestamp ? *request_timestamp : now;\n             const UniValue result = ProcessDescriptorImport(*pwallet, request, timestamp);\n             response.push_back(result);\n```"
  },
  {
   "t": "2025-12-29T12:55:45Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6",
   "in_reply_to": null,
   "text": "[quoted text omitted]\n\nThis seems problematic because an internal default value is being used here for user facing messages.\n\nAlso, I believe since we are adding the ability to allow skipping rescanning for descriptors, such descriptors need not be considered in the rescan specific errors/checks. This will also avoid using default value of `-1` here, which is not intuitive for the reader.\n\nMaybe the following diff? I haven't spent enough time verifying many scenarios but the `wallet_importdescriptors` tests do pass.\n\n```diff\n@@ -426,18 +426,26 @@ RPCHelpMan importdescriptors()\n             for (unsigned int i = 0; i < requests.size(); ++i) {\n                 const UniValue& request = requests.getValues().at(i);\n\n+                auto request_timestamp = GetImportTimestamp(request, now);\n+                // Pass through the response of \"never\" timestamp descriptors\n+                // that dont' need any scanning.\n+                if (!request_timestamp) {\n+                    response.push_back(results.at(i));\n+                    continue;\n+                }\n+\n                 // If the descriptor timestamp is within the successfully scanned\n                 // range, or if the import result already has an error set, let\n                 // the result stand unmodified. Otherwise replace the result\n                 // with an error message.\n-                if (scanned_time <= GetImportTimestamp(request, now).value_or(-1) || results.at(i).exists(\"error\")) {\n+                if (scanned_time <= *request_timestamp || results.at(i).exists(\"error\")) {\n                     response.push_back(results.at(i));\n                 } else {\n                     std::string error_msg{strprintf(\"Rescan failed for descriptor with timestamp %d. There \"\n                             \"was an error reading a block from time %d, which is after or within %d seconds \"\n                             \"of key creation, and could contain transactions pertaining to the desc. As a \"\n                             \"result, transactions and coins using this desc may not appear in the wallet.\",\n-                            GetImportTimestamp(request, now).value_or(-1), scanned_time - TIMESTAMP_WINDOW - 1, TIMESTAMP_WINDOW)};\n+                            *request_timestamp, scanned_time - TIMESTAMP_WINDOW - 1, TIMESTAMP_WINDOW)};\n                     if (pwallet->chain().havePruned()) {\n                         error_msg += strprintf(\" This error could be caused by pruning or data corruption \"\n                                 \"(see bitcoind log for details) and could be dealt with by downloading and \"\n```"
  },
  {
   "t": "2025-12-29T13:05:56Z",
   "kind": "review",
   "who": "rkrux",
   "assoc": "MEMBER",
   "state": "CHANGES_REQUESTED",
   "commit": "5fbef2178a999d7235229525e132cf5b3fe80c2f",
   "text": "Code review [5fbef21](https://github.com/bitcoin/bitcoin/pull/31668/commits/5fbef2178a999d7235229525e132cf5b3fe80c2f)\n\nSuggested few changes."
  },
  {
   "t": "2025-12-30T10:14:08Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6"
  },
  {
   "t": "2025-12-30T10:16:30Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "c6a5f1d12ce5e40696f877b1427daf99373f54b7",
   "in_reply_to": 2650872659,
   "text": "done"
  },
  {
   "t": "2025-12-30T10:25:53Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "0b407dda05f90d2e12d39bfc9ec977ff28757139"
  },
  {
   "t": "2025-12-30T10:28:49Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6",
   "in_reply_to": 2650878323,
   "text": "done"
  },
  {
   "t": "2025-12-30T10:29:10Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6",
   "in_reply_to": 2650914704,
   "text": "done and thanks for the suggestion"
  },
  {
   "t": "2025-12-30T10:39:18Z",
   "kind": "comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "text": "Please squash the third commit as it's a lint fix, ref: https://github.com/bitcoin/bitcoin/blob/2bcb3f64648ad27d4df10013b5bf0441124f1372/CONTRIBUTING.md?plain=1#L202-L230\n\nAlso, please resolve the comments in the PR that have been addressed already to make it easier for others to go through the PR."
  },
  {
   "t": "2025-12-30T11:19:45Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "9bd280c121acd8e18395a33189d5b48070a542fc"
  },
  {
   "t": "2026-01-03T05:07:40Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "1733ddfa1f140da0d6e246159bb9258d6c1b562e"
  },
  {
   "t": "2026-01-03T17:21:26Z",
   "kind": "review_comment",
   "who": "furszy",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6",
   "in_reply_to": 2644467615,
   "text": "this is still using the -1 as magic number."
  },
  {
   "t": "2026-01-04T04:52:36Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6",
   "in_reply_to": 2644467615,
   "text": "hi @furszy i'm not using -1 anymore can you please check latest commits."
  },
  {
   "t": "2026-01-12T09:10:24Z",
   "kind": "comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "text": "hi @achow101 I've fixed all the review comments. Can you please approve this pr and merge it if everything is okay."
  },
  {
   "t": "2026-01-22T13:19:27Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "f2fa67f5e1989ec93cf93e4d850f40548f3e58a0",
   "in_reply_to": null,
   "text": "Addition of this blank line is unnecessary."
  },
  {
   "t": "2026-01-22T13:30:02Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_transactiontime_rescan.py",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6",
   "in_reply_to": 2650880342,
   "text": "In 1733ddfa1f140da0d6e246159bb9258d6c1b562e \"added timestamp check\"\n\nThe changes removed in this file in this commit have been added in the previous commit (f2fa67f5e1989ec93cf93e4d850f40548f3e58a0 \"Implement rescan stop with timestamp as never for import descriptors\"). This is unnecessary, distorts the git logs, and makes it much harder for others to review.\n\nPlease clean up both the commits, each commit should only include changes related to it. In this particular commit for timestamp, only timestamp related changes should be present."
  },
  {
   "t": "2026-01-22T13:34:26Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "3458d90fad97ecaa2d34fcff0d842aed2db525a6",
   "in_reply_to": 2644467615,
   "text": "In https://github.com/bitcoin/bitcoin/commit/f2fa67f5e1989ec93cf93e4d850f40548f3e58a0 \"Implement rescan stop with timestamp as never for import descriptors\"\n\nThe `-1` magic number is added in this commit only to be removed in the next commit. This is a roundabout way to raise this PR and is very confusing for reviewers who, more often than not, review the PR commit by commit - please clean up the commits."
  },
  {
   "t": "2026-01-22T13:34:48Z",
   "kind": "review",
   "who": "rkrux",
   "assoc": "MEMBER",
   "state": "CHANGES_REQUESTED",
   "commit": "1733ddfa1f140da0d6e246159bb9258d6c1b562e",
   "text": "Commits need to be cleaned up, please check the inline comments."
  },
  {
   "t": "2026-01-22T13:36:17Z",
   "kind": "comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "text": "Also, please un-resolve the conversations that are still ongoing for other reviewers to see."
  },
  {
   "t": "2026-01-22T13:47:30Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "02d374cc243dd08365b5ccbc0620b2048082a4c6"
  },
  {
   "t": "2026-01-22T13:48:37Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "34b09c44f4cce80236485fb62c6a05e7fb9a1cd5"
  },
  {
   "t": "2026-01-22T14:04:33Z",
   "kind": "comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "text": "HI @rkrux the reason I've made a separate commit is https://github.com/bitcoin/bitcoin/pull/31668/changes#r2599095627 again I've made single commit for a clean review. Mostly I've fixed all the review comments and that's why I've resolved those. I hope the reviewers can easily understand the fix and if they still feel some improvement in their I'm happy to fix those issue. Thanks again for active reviewing."
  },
  {
   "t": "2026-01-23T08:04:36Z",
   "kind": "review",
   "who": "rkrux",
   "assoc": "MEMBER",
   "state": "CHANGES_REQUESTED",
   "commit": "34b09c44f4cce80236485fb62c6a05e7fb9a1cd5",
   "text": "[quoted text omitted]\n\nMy suggestions have been misunderstood.\n\nTo reiterate, the issue in the previous approach in this PR was that code changes were added in the first commit only for them to be removed in the second commit, which is confusing for the reviewers and misleading in the git logs. In https://github.com/bitcoin/bitcoin/pull/31668#discussion_r2716927453 and https://github.com/bitcoin/bitcoin/pull/31668#discussion_r2716944740, I suggested to clean up the commits and not merge them.\n\n[This comment from furszy](https://github.com/bitcoin/bitcoin/pull/31668/changes#r2599095627) that's mentioned in the quoted text looks fine to me and should be implemented. Once this is done, I believe then all the existing suggestions would have been implemented, and the PR would be ready for review again.\n\nAlso, the error in the failing job in the CI seem unrelated and it will most likely not occur again on the next run.\n```\nRun git clone --depth=1 https://github.com/bitcoin-core/qa-assets \"${RUNNER_TEMP}/qa-assets\"\nCloning into 'D:\\a\\_temp/qa-assets'...\nremote: Internal Server Error\nfatal: unable to access 'https://github.com/bitcoin-core/qa-assets/': The requested URL returned error: 500\nError: Process completed with exit code 128.\n```"
  },
  {
   "t": "2026-02-03T14:47:35Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "5164b6421d05922282048affa8d4778d4cd72ce6"
  },
  {
   "t": "2026-02-03T15:13:08Z",
   "kind": "comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "text": "[quoted text omitted]\n\nHI @rkrux I'm really confused now, Can you help what should I do. Current changes are latest and in one single commit."
  },
  {
   "t": "2026-05-14T11:44:13Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "76daf4bb0dd1349cf82f7c0c83b259da5111980c"
  },
  {
   "t": "2026-05-15T17:50:42Z",
   "kind": "comment",
   "who": "darosior",
   "assoc": "MEMBER",
   "text": "What is the status of this? This is draft and CI is failing."
  },
  {
   "t": "2026-05-16T08:54:12Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "7af4ee35b58246edb287647ab954b84d1a95c712"
  },
  {
   "t": "2026-05-16T11:01:57Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "c6a5f1d12ce5e40696f877b1427daf99373f54b7"
  },
  {
   "t": "2026-05-16T14:23:07Z",
   "kind": "review_comment",
   "who": "furszy",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "c6a5f1d12ce5e40696f877b1427daf99373f54b7",
   "in_reply_to": null,
   "text": "isn't this going to access a `std::nullopt`? should be `request_timestamp.has_value()` because `GetImportTimestamp` returns nullopt only when \"never\" is provided?"
  },
  {
   "t": "2026-05-16T15:52:15Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "197e90d3e366227db66f25a3c39171e2f5a54b2b"
  },
  {
   "t": "2026-05-16T16:05:37Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "28294c0e71bccc687dbc039d98fe1e45911059b0"
  },
  {
   "t": "2026-05-17T05:29:21Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "c6a5f1d12ce5e40696f877b1427daf99373f54b7",
   "in_reply_to": 3252928709,
   "text": "Hi @furszy I've refactored the code, could you please review that again."
  },
  {
   "t": "2026-05-25T13:55:15Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "9788e25d3c19cd120c7ff0f87dfc4c9827d27d72",
   "in_reply_to": null,
   "text": "In 28294c0e71bccc687dbc039d98fe1e45911059b0 \"Implement rescan stop with timestamp as never for import descriptors\"\n\nLet's avoid doing bitwise or on boolean operands.\n\n```diff\n- rescan |= (success && request_timestamp.has_value());\n+ rescan = rescan || (success && request_timestamp.has_value());\n```"
  },
  {
   "t": "2026-05-25T13:56:07Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "9788e25d3c19cd120c7ff0f87dfc4c9827d27d72",
   "in_reply_to": null,
   "text": "In 28294c0 \"Implement rescan stop with timestamp as never for import descriptors\"\n\nTo highlight the intent clearly.\n```diff\n- const int64_t timestamp = request_timestamp.value_or(now);\n+ const int64_t import_timestamp = request_timestamp.value_or(now);\n```"
  },
  {
   "t": "2026-05-25T13:59:38Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6916d40866f343480ef61094f6354bfe15cb1c04",
   "in_reply_to": null,
   "text": "In 28294c0 \"Implement rescan stop with timestamp as never for import descriptors\"\n\nNit: This statement can come after the following line, it breaks the reading flow."
  },
  {
   "t": "2026-05-25T14:04:07Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "9788e25d3c19cd120c7ff0f87dfc4c9827d27d72",
   "in_reply_to": null,
   "text": "[quoted text omitted]\n\n[quoted text omitted]\nI don't think key_never_funded is ever funded."
  },
  {
   "t": "2026-05-25T14:07:39Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "9788e25d3c19cd120c7ff0f87dfc4c9827d27d72",
   "in_reply_to": null,
   "text": "[quoted text omitted]\n\nYes, that's the intent.\n\n[quoted text omitted]\nI don't think any funds exist on-chain for this descriptor because as seen above it was never funded. Also, it's name is confusing - wpkh_desc_never_funded reads like it is never funded but actually it needs to be funded and the never portion corresponds to the \"never\" timestamp in the import request.\nIt's name and the corresponding key_never_funded name should be updated imo."
  },
  {
   "t": "2026-05-25T14:12:27Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "9788e25d3c19cd120c7ff0f87dfc4c9827d27d72",
   "in_reply_to": null,
   "text": "[quoted text omitted]\n\nWhy is this portion added here? key_never and key_never_now are also \"new\"."
  },
  {
   "t": "2026-05-25T14:15:36Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "9788e25d3c19cd120c7ff0f87dfc4c9827d27d72",
   "in_reply_to": 3298585966,
   "text": "If I use the following patch, the test passes but the expected balance should not be 0 because there's supposed to be a pre-existing history as per the code comment above.\n\n```diff\n             {\n                 \"name\": \"never_funded_wallet\",\n-                \"request\": [{\"desc\": wpkh_desc_never_funded, \"timestamp\": \"never\"}],\n+                \"request\": [{\"desc\": wpkh_desc_never_funded, \"timestamp\": \"now\"}],\n                 \"expected_balance\": 0,\n-                \"expected_msgs\": [],\n-                \"unexpected_msgs\": [\"Rescanning last\"],\n+                \"expected_msgs\": [\"Rescanning last\"],\n+                \"unexpected_msgs\": [],\n                 \"expected_txid\": None\n             },\n```"
  },
  {
   "t": "2026-05-25T14:19:44Z",
   "kind": "review_comment",
   "who": "rkrux",
   "assoc": "MEMBER",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "1960799bf5bf353fe17741f725e3e173ac131642",
   "in_reply_to": 2599095627,
   "text": "[quoted text omitted]\n\nThis is still not addressed, please address it."
  },
  {
   "t": "2026-05-25T14:20:34Z",
   "kind": "review",
   "who": "rkrux",
   "assoc": "MEMBER",
   "state": "CHANGES_REQUESTED",
   "commit": "28294c0e71bccc687dbc039d98fe1e45911059b0",
   "text": "Code review 28294c0e71bccc687dbc039d98fe1e45911059b0\nI don't think the test does what it's supposed to do.\n\nAlso, there is still one unaddressed discussion that has been marked as resolved: https://github.com/bitcoin/bitcoin/pull/31668#discussion_r2599095627."
  },
  {
   "t": "2026-05-27T02:58:46Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "9788e25d3c19cd120c7ff0f87dfc4c9827d27d72"
  },
  {
   "t": "2026-05-27T04:03:18Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "d141e0bb78dabddbf4729172d991908a2f2a595d"
  },
  {
   "t": "2026-05-27T04:04:56Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "9788e25d3c19cd120c7ff0f87dfc4c9827d27d72",
   "in_reply_to": 3298529753,
   "text": "done"
  },
  {
   "t": "2026-05-27T04:05:08Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "9788e25d3c19cd120c7ff0f87dfc4c9827d27d72",
   "in_reply_to": 3298533636,
   "text": "done"
  },
  {
   "t": "2026-05-27T04:05:28Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "src/wallet/rpc/backup.cpp",
   "commit": "6916d40866f343480ef61094f6354bfe15cb1c04",
   "in_reply_to": 3298550220,
   "text": "done."
  },
  {
   "t": "2026-05-27T04:06:06Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "9788e25d3c19cd120c7ff0f87dfc4c9827d27d72",
   "in_reply_to": 3298585966,
   "text": "updated please check once"
  },
  {
   "t": "2026-05-27T04:07:23Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "9788e25d3c19cd120c7ff0f87dfc4c9827d27d72",
   "in_reply_to": 3298607031,
   "text": "your were right, remove the comment"
  },
  {
   "t": "2026-05-27T04:11:44Z",
   "kind": "review_comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "path": "test/functional/wallet_importdescriptors.py",
   "commit": "9788e25d3c19cd120c7ff0f87dfc4c9827d27d72",
   "in_reply_to": 3298570854,
   "text": "`\n        # Fund key_now, key_never_now, and key_funded_never on-chain.\n        # key_never stays unfunded so never_wallet truly sees no transactions.\n        funding_tx_id_now = funding_wallet.send(outputs=[{key_now.p2wpkh_addr: funding_amount}])[\"txid\"]\n        funding_tx_id_never_now = funding_wallet.send(outputs=[{key_never_now.p2wpkh_addr: funding_amount}])[\"txid\"]\n        funding_tx_id_funded_never = funding_wallet.send(outputs=[{key_funded_never.p2wpkh_addr: funding_amount}])[\"txid\"]\n        self.generate(node, 1, sync_fun=self.no_op)\n`"
  },
  {
   "t": "2026-08-10T19:44:15Z",
   "kind": "comment",
   "who": "sedited",
   "assoc": "MEMBER",
   "text": "This has a conflict since two months now. Can you get around to rebasing this?"
  },
  {
   "t": "2026-08-11T10:12:28Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "09211e2f14752d67a6ca83191c96028827627af7"
  },
  {
   "t": "2026-08-27T15:08:03Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "49fb71420ef76b00ff1a926b924d6ccb57b17c28"
  },
  {
   "t": "2026-08-28T10:52:30Z",
   "kind": "force_push",
   "who": "saikiran57",
   "commit": "6916d40866f343480ef61094f6354bfe15cb1c04"
  },
  {
   "t": "2026-08-31T09:36:22Z",
   "kind": "comment",
   "who": "saikiran57",
   "assoc": "CONTRIBUTOR",
   "text": "Hi All, can you please complete the final review and merge this PR."
  },
  {
   "t": "2026-09-04T10:02:36Z",
   "kind": "comment",
   "who": "mprenditore",
   "assoc": "NONE",
   "text": "@fanquake @maflcko @davidrobinsonau @w0xlt\n all checks seems to pass now, what's still needed to get this merged?\nThanks for the support."
  }
 ],
 "labels_log": [
  {
   "t": "2025-01-16T09:00:09Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-01-21T13:23:12Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-03T11:15:13Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-03T12:10:13Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-05T07:24:02Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-03-05T09:45:28Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-04-08T09:00:53Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-04-08T12:15:36Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-04-25T13:07:33Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-04-30T13:58:10Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-05-17T09:40:26Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-05-19T09:42:35Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-06-12T14:43:16Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-06-12T17:00:25Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-07-28T11:09:10Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-07-28T13:33:52Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-07-28T13:34:37Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2025-07-28T18:20:55Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-05T13:03:56Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-08T09:00:54Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-09T07:26:10Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-09T08:40:58Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-10T07:46:28Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-10T09:02:23Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-30T10:16:10Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2025-12-30T12:36:30Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-03T00:28:23Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-03T07:08:42Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-22T15:13:08Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-01-30T16:06:47Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-14T11:05:02Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-14T12:45:53Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-14T13:28:42Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-16T12:25:50Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-16T16:06:06Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-16T17:31:22Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-26T10:40:10Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-27T03:55:57Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-27T04:14:49Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-27T04:59:41Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-06-12T00:20:19Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-11T11:37:08Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-11T12:01:21Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-27T16:43:35Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-09-17T02:33:50Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  }
 ],
 "state_log": [
  {
   "t": "2025-02-20T20:47:15Z",
   "kind": "convert_to_draft",
   "who": "fanquake"
  },
  {
   "t": "2025-03-03T12:13:36Z",
   "kind": "ready_for_review",
   "who": "saikiran57"
  },
  {
   "t": "2026-05-15T08:29:16Z",
   "kind": "convert_to_draft",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-16T08:54:35Z",
   "kind": "ready_for_review",
   "who": "saikiran57"
  },
  {
   "t": "2026-05-16T10:26:01Z",
   "kind": "convert_to_draft",
   "who": "DrahtBot"
  },
  {
   "t": "2026-05-16T12:26:35Z",
   "kind": "ready_for_review",
   "who": "saikiran57"
  },
  {
   "t": "2026-08-17T08:48:36Z",
   "kind": "convert_to_draft",
   "who": "DrahtBot"
  },
  {
   "t": "2026-08-27T18:27:26Z",
   "kind": "ready_for_review",
   "who": "saikiran57"
  }
 ],
 "text_chars": 38111,
 "text_tokens_estimate": 9527,
 "changed_paths": [
  "src/wallet/rpc/backup.cpp",
  "test/functional/wallet_importdescriptors.py"
 ],
 "files": [
  {
   "path": "src/wallet/rpc/backup.cpp",
   "add": 43,
   "del": 25
  },
  {
   "path": "test/functional/wallet_importdescriptors.py",
   "add": 157,
   "del": 4
  }
 ],
 "test_lines": 161,
 "git": {
  "head": "6916d40866f343480ef61094f6354bfe15cb1c04",
  "head_matches_backup": true,
  "base": "ea7d459ac08b05521021e3d273625424e1b9b19e",
  "commits": [
   {
    "sha": "6916d40866",
    "subject": "Implement rescan stop with timestamp as never for import descriptors",
    "files": 2,
    "add": 200,
    "del": 29
   }
  ],
  "patch_truncated": false
 },
 "input_hash": "2fe268608a058081",
 "extracted_at": "2026-09-17T16:15:31+00:00"
}