{
 "number": 36122,
 "repo": "bitcoin/bitcoin",
 "url": "https://github.com/bitcoin/bitcoin/pull/36122",
 "title": "BIP460: CISA for Taproot key path spends",
 "author": "fjahr",
 "author_association": "MEMBER",
 "created_at": "2026-08-29T19:51:40Z",
 "updated_at": "2026-09-15T11:55:53Z",
 "age_days": 18,
 "draft": true,
 "labels": [
  "Needs rebase"
 ],
 "milestone": null,
 "base": "master",
 "head_sha": "224e15fd891334f0a2fb924d2ac60bc08ed9e4f3",
 "head_ref": "bip460",
 "head_repo": "fjahr/bitcoin",
 "head_history": [
  {
   "t": "2026-09-07T18:42:09Z",
   "sha": "0963f63d174ca3606d542f87231cb6af1234e1ee"
  },
  {
   "t": "2026-09-07T19:53:28Z",
   "sha": "dc9160dbbb8241b402976e02d6faba8eb7431571"
  },
  {
   "t": "2026-09-07T21:29:50Z",
   "sha": "0b16b7aedf6c2e90e87f73296640ffbd32f2c8e2"
  },
  {
   "t": "2026-09-08T14:27:54Z",
   "sha": "3b51552c47c6c0064c5b98048e955e161ba6988e"
  },
  {
   "t": "2026-09-08T15:17:44Z",
   "sha": "224e15fd891334f0a2fb924d2ac60bc08ed9e4f3"
  }
 ],
 "additions": 11288,
 "deletions": 488,
 "changed_files": 133,
 "commit_count": 22,
 "size_bucket": "XL",
 "mergeable_state": "dirty",
 "bot": {
  "drahtbot": {
   "present": true,
   "reviews": {},
   "conflicts": [
    {
     "number": 36188,
     "title": "crypto: plug hardware optimized SHA256 into libsecp256k1's context",
     "author": "furszy"
    },
    {
     "number": 36167,
     "title": "[RFC] Enable `-Wunused`",
     "author": "fanquake"
    },
    {
     "number": 36154,
     "title": "wallet: fill PSBT_GLOBAL_XPUB for descriptors with more than one key",
     "author": "jeanpablojp"
    },
    {
     "number": 36133,
     "title": "wallet: store multipath descriptor",
     "author": "Sjors"
    },
    {
     "number": 36114,
     "title": "wallet: harden external signer psbt processing, revamp mock",
     "author": "Sjors"
    },
    {
     "number": 36091,
     "title": "test: Add debug output to common tested types",
     "author": "rustaceanrob"
    },
    {
     "number": 36076,
     "title": "psbt: preserve sighash type when merging inputs",
     "author": "thomasbuilds"
    },
    {
     "number": 36039,
     "title": "psbt: classify missing Taproot script-path signatures as signer",
     "author": "btcpavao"
    },
    {
     "number": 35793,
     "title": "Implement BIP 54 (Consensus Cleanup) without mainnet activation",
     "author": "darosior"
    },
    {
     "number": 35742,
     "title": "descriptors: check duplicate keys in all multipath Miniscript branches",
     "author": "yashbhutwala"
    },
    {
     "number": 35713,
     "title": "Remove boost as a unit test runner",
     "author": "rustaceanrob"
    },
    {
     "number": 35662,
     "title": "script: prevent stale sighash caches across transactions",
     "author": "l0rinc"
    },
    {
     "number": 35569,
     "title": "Encapsulation for CTransaction",
     "author": "purpleKarrot"
    },
    {
     "number": 35370,
     "title": "rpc: add key-origin modes to PSBT processing RPCs",
     "author": "junbyjun1238"
    },
    {
     "number": 35301,
     "title": "Silent Payments: Implement bip352 (take 2)",
     "author": "Eunovo"
    },
    {
     "number": 34520,
     "title": "refactor: Add [[nodiscard]] to functions returning bool+mutable ref",
     "author": "maflcko"
    },
    {
     "number": 32857,
     "title": "wallet: allow skipping script paths",
     "author": "Sjors"
    },
    {
     "number": 32575,
     "title": "consensus: Remove special treatment for single threaded script checking",
     "author": "fjahr"
    },
    {
     "number": 30342,
     "title": "kernel, logging: Pass Logger instances to kernel objects",
     "author": "ryanofsky"
    },
    {
     "number": 29843,
     "title": "policy: Allow non-standard scripts with -acceptnonstdtxn=1 (test nets only)",
     "author": "ajtowns"
    },
    {
     "number": 29491,
     "title": "[EXPERIMENTAL] Schnorr batch verification for blocks",
     "author": "fjahr"
    },
    {
     "number": 29247,
     "title": "CAT in Tapscript (BIP-347)",
     "author": "arminsabouri"
    },
    {
     "number": 28690,
     "title": "build: Introduce internal kernel library",
     "author": "sedited"
    }
   ]
  }
 },
 "acks_parsed": {},
 "acks_tally": {
  "ack": 0,
  "stale_ack": 0,
  "concept_ack": 0,
  "approach_ack": 0,
  "nack": 0,
  "concept_nack": 0,
  "approach_nack": 0
 },
 "reviews": {
  "approved": 0,
  "changes_requested": 0,
  "distinct_reviewers": [
   "BarneyChambers"
  ]
 },
 "signals": {
  "needs_rebase": true,
  "ci_failed": false,
  "mergeable_state": "dirty",
  "last_author_activity": "2026-09-08T15:17:44Z",
  "last_reviewer_activity": "2026-09-15T11:50:28Z",
  "last_reviewer": "BarneyChambers",
  "author_silent_days": 9,
  "waiting_on_author_days": 2,
  "days_since_update": 2
 },
 "refs": {
  "mentioned": [],
  "depends_on": [],
  "fixes": [],
  "linked_issues": [],
  "references": [],
  "conflicts": [
   36188,
   36167,
   36154,
   36133,
   36114,
   36091,
   36076,
   36039,
   35793,
   35742,
   35713,
   35662,
   35569,
   35370,
   35301,
   34520,
   32857,
   32575,
   30342,
   29843,
   29491,
   29247,
   28690
  ]
 },
 "stack": {
  "shares_commits_with": [],
  "based_on": [],
  "base_for": []
 },
 "review_paths": [
  "src/psbt.cpp",
  "src/script/sign.cpp"
 ],
 "body": "Reference implementation of BIP460 Cross-Input Signature Aggregation for Taproot key path spends. Implements witness v2 outputs whose key path spends can be aggregated with BIP458 half-aggregation or BIP459 full-aggregation, or opt out with a plain BIP341 signature.\n\nDraft to accompany the BIPs, not intended for merge:\n- BIP458: bitcoin/bips#2205\n- BIP459: bitcoin/bips#2210\n- BIP460: bitcoin/bips#2212\n\nFurther notes:\n- Depends on the unmerged secp256k1 modules from bitcoin-core/secp256k1#1566 (halfagg) and bitcoin-core/secp256k1#1754 (fullagg). The updated subtree here adds both.\n- Activation is regtest-only and there are no parameters set for other chains\n- BIP460 test vectors are vendored in `src/test/data/` and run in `src/test/cisa_tests.cpp`. Additional functional tests cover relay and block validation.",
 "commits": [
  {
   "sha": "b45f40c03b0effe0ad53e49053b7a81923352afe",
   "date": "2026-08-28T22:49:13Z",
   "message": "Squashed 'src/secp256k1/' changes from 687155df6b7..a4aca78581b\n\na4aca78581b Merge bitcoin-core/secp256k1#1566: BIP458: Schnorr (Incremental) Half Aggregation\na548265ddce halfagg: Add docs\nd959734fd5e halfagg: Add example\nfa2a660f771 halfagg: Add benchmarks\n3e67c93ea5e Experimental: Add BIP 458 half-aggregation for Schnorr signatures\n65e57481c4c TBD: Sharing common code between fullagg and musig\ncfbb70d3880 fullagg: Add ctime tests\nf1f6604d3ce fullagg: Add benchmarks\n3af59d5bac2 fullagg: Add docs\n07776ea7f0a fullagg: Add to build system\n22099f77de3 fullagg: Add to CI\n5060640320d fullagg: Add example\na43d452401b fullagg: Add include file\n8722f9ea4fa fullagg: Add module\nbae6b89a203 Merge bitcoin-core/secp256k1#1908: refactor: replace `_get_hash_context` with direct `->hash_ctx` access\nc8745f6b3ad refactor: replace `_get_hash_context` with direct `->hash_ctx` access\n3397f3cb281 Merge bitcoin-core/secp256k1#1878: field: correct `_fe_half` docs (output is not normalized, input requires magnitude <= 31)\n86c7cbaf5af Merge bitcoin-core/secp256k1#1915: refactor: Move (de)ser helpers from musig and eckey to group\nbfd40bd0ce0 refactor: Rename privkey to seckey in eckey helpers\nd8ee6e6cf67 refactor: Move parsing helpers from musig to group\na37d7cc064a Merge bitcoin-core/secp256k1#1916: ecdh/ellswift: simplify seckey loading with `_scalar_set_b32_seckey`\n3d69f4ce1c7 Merge bitcoin-core/secp256k1#1911: refactor: rename `ctx` param to `ecmult_gen_ctx` where applicable\nc00dc818105 ecdh/ellswift: simplify seckey loading with `_scalar_set_b32_seckey`\n81a5a7567d1 refactor: rename `ctx` param to `ecmult_gen_ctx` where applicable\n2577fb1888c refactor: Move pubkey parsing and serialization from eckey to group\n439278a649d Merge bitcoin-core/secp256k1#1910: scratch: reject sizes that overflow when added to header\n3d4340d1732 scratch: reject sizes that overflow when added to header\n56e031a1482 field: correct `_fe_half` docs (output is not normalized, input requires magnitude <= 31)\n\ngit-subtree-dir: src/secp256k1\ngit-subtree-split: a4aca78581b69f7bc277fdf856b41d1c9377207d"
  },
  {
   "sha": "239dba9b8494ff69ad07d954a61f119bc2f3fb22",
   "date": "2026-09-08T10:45:48Z",
   "message": "Merge commit 'b45f40c03b0effe0ad53e49053b7a81923352afe' into bip460"
  },
  {
   "sha": "067f8511dc1fee226440cf36b81cca7e086c7446",
   "date": "2026-09-08T10:45:49Z",
   "message": "build: Enable secp halfagg and fullagg modules"
  },
  {
   "sha": "7b9d10e289ed73523d390a041d427a2f76dffff4",
   "date": "2026-09-08T10:45:49Z",
   "message": "consensus: Add CISA deployment and script flag"
  },
  {
   "sha": "e99d6e105a31b5aa4b6f40eb8ee4f3c14da5ec13",
   "date": "2026-09-08T10:45:49Z",
   "message": "script: Add witness v2 keypath signature message"
  },
  {
   "sha": "7f9f8627b99d5434484610c01fc1689ab5dc20cc",
   "date": "2026-09-08T10:45:50Z",
   "message": "script: Add per-input witness v2 validation"
  },
  {
   "sha": "d74b4bec9cac92c1c637135625c19e1c24e7d02e",
   "date": "2026-09-08T10:45:50Z",
   "message": "script: Add transaction-level CISA verification"
  },
  {
   "sha": "002355961cc18ed2711b85c00ac2eedbbe3c60ae",
   "date": "2026-09-08T10:45:50Z",
   "message": "validation: Add CISA check to the check queue"
  },
  {
   "sha": "639a2a7e6d6fd17af30ebee88a83325593e07380",
   "date": "2026-09-08T10:45:50Z",
   "message": "policy: Make witness v2 transactions standard"
  },
  {
   "sha": "1b531fff1e770cd53e4d13b215a732e3de6f9902",
   "date": "2026-09-08T10:45:50Z",
   "message": "test: Add CISA unit tests with BIP460 test vectors"
  },
  {
   "sha": "4761d18cd5a4d4139541199f84f42c0051d3d668",
   "date": "2026-09-08T10:45:50Z",
   "message": "test: Add CISA functional test"
  },
  {
   "sha": "d25e2daba2e4eb54a9407d2469d9d59e8c77cead",
   "date": "2026-09-08T10:45:50Z",
   "message": "draft-bip: descriptor: Add cisa() output script descriptor"
  },
  {
   "sha": "01b437ae5c9d9edeb675046e8e52578a5d1fda15",
   "date": "2026-09-08T10:45:51Z",
   "message": "draft-bip: test: Add cisa() descriptor tests"
  },
  {
   "sha": "40d69a788bf49e4a8c309413eb27581b2891ba25",
   "date": "2026-09-08T10:45:51Z",
   "message": "draft-bip: cisa: Add half and full aggregation signing helpers"
  },
  {
   "sha": "650c4df0adfbbc3f33de3ef611442ea7f9e33134",
   "date": "2026-09-08T10:52:17Z",
   "message": "draft-bip: psbt: Add CISA input fields"
  },
  {
   "sha": "2c437f4967ef561307f28fbbc2a73da64d07b169",
   "date": "2026-09-08T15:03:26Z",
   "message": "draft-bip: sign: Sign witness v2 inputs by aggregation mode"
  },
  {
   "sha": "695c09cdeac9d4a476a148bef0967e57f9f52a2c",
   "date": "2026-09-08T15:03:26Z",
   "message": "draft-bip: psbt: Finalize CISA aggregation groups"
  },
  {
   "sha": "1cfa826a7bfe0f58dceda728133c107149b91c66",
   "date": "2026-09-08T15:03:26Z",
   "message": "draft-bip: rpc: Add cisa_mode option to PSBT signing RPCs"
  },
  {
   "sha": "34eace4d374bf08be5ba70dcc895335198d8ac68",
   "date": "2026-09-08T15:03:26Z",
   "message": "draft-bip: test: Add CISA PSBT tests"
  },
  {
   "sha": "421657c01bbe7897123a288bcab08843f1f3aa5f",
   "date": "2026-09-08T15:03:26Z",
   "message": "draft-bip: cisa: Decouple full aggregation nonces from the signed message"
  },
  {
   "sha": "41ea27e7ffd97be9a6648f8451801c8eb8c6fe87",
   "date": "2026-09-08T15:03:27Z",
   "message": "draft-bip: wallet: Add reservecisanonce for pre-shared full aggregation nonces"
  },
  {
   "sha": "224e15fd891334f0a2fb924d2ac60bc08ed9e4f3",
   "date": "2026-09-08T15:03:27Z",
   "message": "draft-bip: test: Test full aggregation with reserved nonces"
  }
 ],
 "timeline": [
  {
   "t": "2026-09-07T18:42:09Z",
   "kind": "force_push",
   "who": "fjahr",
   "commit": "0963f63d174ca3606d542f87231cb6af1234e1ee"
  },
  {
   "t": "2026-09-07T19:53:28Z",
   "kind": "force_push",
   "who": "fjahr",
   "commit": "dc9160dbbb8241b402976e02d6faba8eb7431571"
  },
  {
   "t": "2026-09-07T19:54:46Z",
   "kind": "comment",
   "who": "fjahr",
   "assoc": "MEMBER",
   "text": "The latest commits, prefixed with `draft-bip:` go further than BIP460 itself. They implement two companion BIPs necessary for adoption that have not been reviewed and I don't think they are worth sharing on the mailing list yet either:\n\n- output script descriptors `cisa()` and `rawcisa()`: https://github.com/fjahr/cisa-playground/blob/main/bip_cisa_descriptor.mediawiki\n- PSBT fields and roles for aggregated inputs: https://github.com/fjahr/cisa-playground/blob/main/bip_cisa_psbt.mediawiki\n\nThey are included so that wallets and protocols, like payjoin or coinjoin for example, can build proofs of concept on top of this branch and exercise CISA end-to-end through the their already common descriptor, wallet and PSBT RPCs flows. Expect these commits to change as these drafts evolve. Review of the consensus and policy commits does not depend on them and I would prefer if review is focused on those unless you are building a PoC and depend on these later changes."
  },
  {
   "t": "2026-09-07T21:29:50Z",
   "kind": "force_push",
   "who": "fjahr",
   "commit": "0b16b7aedf6c2e90e87f73296640ffbd32f2c8e2"
  },
  {
   "t": "2026-09-08T14:27:54Z",
   "kind": "force_push",
   "who": "fjahr",
   "commit": "3b51552c47c6c0064c5b98048e955e161ba6988e"
  },
  {
   "t": "2026-09-08T15:17:44Z",
   "kind": "force_push",
   "who": "fjahr",
   "commit": "224e15fd891334f0a2fb924d2ac60bc08ed9e4f3"
  },
  {
   "t": "2026-09-15T11:39:57Z",
   "kind": "comment",
   "who": "BarneyChambers",
   "assoc": "NONE",
   "text": "Hey Fabian, Hope you don't mind if I add a review here. I built this locally and ran `feature_cisa.py` and `wallet_cisa.py` from commit 224e15f. Both passed, and the consensus/policy test coverage looks great. I did hit three wallet/PSBT issues while reviewing the changes."
  },
  {
   "t": "2026-09-15T11:42:21Z",
   "kind": "review_comment",
   "who": "BarneyChambers",
   "assoc": "NONE",
   "path": "src/script/sign.cpp",
   "commit": "224e15fd891334f0a2fb924d2ac60bc08ed9e4f3",
   "in_reply_to": null,
   "text": "For a marked v2 keypath, `VerifyScript` returning success after `ParseCISAWitness` seems correct for a per-input structure check. `ProduceSignature` and `DataFromTransaction` then treat that success as complete, so a dummy member looks fully signed.\n\nI made a 2-input v2 spend and put 32 zero bytes on both witnesses (half-agg members, no final). `signrawtransactionwithwallet` came back `complete=true` with no errors. `testmempoolaccept` then failed with `mempool-script-verify-flag-failed` (Invalid CISA aggregation group structure). So CISACheck is doing its job. Anyone who only looks at `VerifyScript / complete` will think the input is done.\n\nWould it be reasonable to run `VerifyCISATransaction` on the full tx before setting complete when the parse yields a marker?"
  },
  {
   "t": "2026-09-15T11:46:15Z",
   "kind": "review_comment",
   "who": "BarneyChambers",
   "assoc": "NONE",
   "path": "src/psbt.cpp",
   "commit": "224e15fd891334f0a2fb924d2ac60bc08ed9e4f3",
   "in_reply_to": null,
   "text": "You already reject conflicting full-agg nonces and partial sigs. `wallet_cisa.py` covers that (`PSBTs not compatible`). Half-agg signatures do not get checked the same way. Merge keeps the first `m_cisa_halfagg_sig` it sees.\n\nI took two otherwise identical half-agg PSBTs and flipped one bit in input 0\u2019s sig. `combinepsbt([A, B])` succeeded and kept A. Swapping the order kept B.\n\nWe can fix this issue if you treat `m_cisa_halfagg_sig` like the full-agg partial sig (both present and unequal means incompatible). I only mention it because the full-agg side already works"
  },
  {
   "t": "2026-09-15T11:50:28Z",
   "kind": "review_comment",
   "who": "BarneyChambers",
   "assoc": "NONE",
   "path": "src/psbt.cpp",
   "commit": "224e15fd891334f0a2fb924d2ac60bc08ed9e4f3",
   "in_reply_to": null,
   "text": "`FinalizeCISAInputs` skips any input that is already signed. This skip on already-signed inputs can leave you with two separate groups of the same mode. Consensus then fails the tx with `SCRIPT_ERR_CISA_GROUP_INVALID`, because once it has seen a group\u2019s final it will not accept another member.\n\nThe problem is basically when input 0 already has a final, and you then put input 1 into the same mode with a signature. The loop walks past input 0 and builds a brand new 1-input group on input 1.\n\nWorking example:\nI signed a 2-input half-agg PSBT without finalizing, cleared input 1\u2019s mode and sig, and ran `finalizepsbt`. That put a 65-byte final on input 0 and reported `complete=false`. I put input 1\u2019s mode and sig back and finalized again. That time it reported `complete=true`, both witnesses were 65 bytes, and `testmempoolaccept` failed with a `Invalid CISA aggregation group structure` error."
  }
 ],
 "labels_log": [
  {
   "t": "2026-08-29T21:25:56Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-09-07T22:31:14Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-09-07T23:24:22Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-09-08T15:19:09Z",
   "action": "labeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-09-08T15:49:20Z",
   "action": "unlabeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  },
  {
   "t": "2026-09-08T16:54:52Z",
   "action": "unlabeled",
   "label": "CI failed",
   "who": "DrahtBot"
  },
  {
   "t": "2026-09-09T02:35:39Z",
   "action": "labeled",
   "label": "Needs rebase",
   "who": "DrahtBot"
  }
 ],
 "state_log": [],
 "text_chars": 7540,
 "text_tokens_estimate": 1885,
 "changed_paths": [
  "cmake/secp256k1.cmake",
  "doc/descriptors.md",
  "doc/psbt.md",
  "src/CMakeLists.txt",
  "src/addresstype.cpp",
  "src/addresstype.h",
  "src/cisa.cpp",
  "src/cisa.h",
  "src/common/types.h",
  "src/consensus/params.h",
  "src/core_io.cpp",
  "src/core_io.h",
  "src/deploymentinfo.cpp",
  "src/kernel/chainparams.cpp",
  "src/key.cpp",
  "src/key.h",
  "src/key_io.cpp",
  "src/node/psbt.cpp",
  "src/outputtype.cpp",
  "src/policy/policy.cpp",
  "src/policy/policy.h",
  "src/psbt.cpp",
  "src/psbt.h",
  "src/pubkey.cpp",
  "src/pubkey.h",
  "src/rpc/blockchain.cpp",
  "src/rpc/client.cpp",
  "src/rpc/rawtransaction.cpp",
  "src/rpc/util.cpp",
  "src/rpc/util.h",
  "src/script/descriptor.cpp",
  "src/script/interpreter.cpp",
  "src/script/interpreter.h",
  "src/script/script.cpp",
  "src/script/script.h",
  "src/script/script_error.cpp",
  "src/script/script_error.h",
  "src/script/sign.cpp",
  "src/script/sign.h",
  "src/script/signingprovider.cpp",
  "src/script/signingprovider.h",
  "src/script/solver.cpp",
  "src/script/solver.h",
  "src/secp256k1/.github/workflows/ci.yml",
  "src/secp256k1/.gitignore",
  "src/secp256k1/CMakeLists.txt",
  "src/secp256k1/Makefile.am",
  "src/secp256k1/README.md",
  "src/secp256k1/ci/ci.sh",
  "src/secp256k1/configure.ac",
  "src/secp256k1/doc/fullagg.md",
  "src/secp256k1/doc/halfagg.md",
  "src/secp256k1/examples/CMakeLists.txt",
  "src/secp256k1/examples/fullagg.c",
  "src/secp256k1/examples/halfagg.c",
  "src/secp256k1/include/secp256k1_fullagg.h",
  "src/secp256k1/include/secp256k1_schnorrsig_halfagg.h",
  "src/secp256k1/src/CMakeLists.txt",
  "src/secp256k1/src/bench.c",
  "src/secp256k1/src/bench_ecmult.c",
  "src/secp256k1/src/bench_internal.c",
  "src/secp256k1/src/ctime_tests.c",
  "src/secp256k1/src/ecdsa.h",
  "src/secp256k1/src/ecdsa_impl.h",
  "src/secp256k1/src/eckey.h",
  "src/secp256k1/src/eckey_impl.h",
  "src/secp256k1/src/ecmult_gen.h",
  "src/secp256k1/src/ecmult_gen_impl.h",
  "src/secp256k1/src/field.h",
  "src/secp256k1/src/group.h",
  "src/secp256k1/src/group_impl.h",
  "src/secp256k1/src/modules/ecdh/main_impl.h",
  "src/secp256k1/src/modules/ecdh/tests_impl.h",
  "src/secp256k1/src/modules/ellswift/main_impl.h",
  "src/secp256k1/src/modules/ellswift/tests_impl.h",
  "src/secp256k1/src/modules/fullagg/Makefile.am.include",
  "src/secp256k1/src/modules/fullagg/bench_impl.h",
  "src/secp256k1/src/modules/fullagg/main_impl.h",
  "src/secp256k1/src/modules/fullagg/tests_impl.h",
  "src/secp256k1/src/modules/fullagg/vectors.h",
  "src/secp256k1/src/modules/musig/keyagg_impl.h",
  "src/secp256k1/src/modules/musig/session_impl.h",
  "src/secp256k1/src/modules/musig/tests_impl.h",
  "src/secp256k1/src/modules/nonce_common.h",
  "src/secp256k1/src/modules/nonce_common_impl.h",
  "src/secp256k1/src/modules/schnorrsig/main_impl.h",
  "src/secp256k1/src/modules/schnorrsig/tests_exhaustive_impl.h",
  "src/secp256k1/src/modules/schnorrsig/tests_impl.h",
  "src/secp256k1/src/modules/schnorrsig_halfagg/Makefile.am.include",
  "src/secp256k1/src/modules/schnorrsig_halfagg/bench_impl.h",
  "src/secp256k1/src/modules/schnorrsig_halfagg/main_impl.h",
  "src/secp256k1/src/modules/schnorrsig_halfagg/tests_impl.h",
  "src/secp256k1/src/modules/schnorrsig_halfagg/vectors.h",
  "src/secp256k1/src/modules/silentpayments/main_impl.h",
  "src/secp256k1/src/scratch_impl.h",
  "src/secp256k1/src/secp256k1.c",
  "src/secp256k1/src/testrand_impl.h",
  "src/secp256k1/src/tests.c",
  "src/secp256k1/tools/test_vectors_fullagg_generate.py",
  "src/secp256k1/tools/test_vectors_halfagg_generate.py",
  "src/test/CMakeLists.txt",
  "src/test/cisa_tests.cpp",
  "src/test/data/cisa_consensus_vectors.json",
  "src/test/data/cisa_descriptor_vectors.json",
  "src/test/data/cisa_psbt_vectors.json",
  "src/test/data/cisa_wallet_vectors.json",
  "src/test/descriptor_tests.cpp",
  "src/test/fuzz/util.cpp",
  "src/test/psbt_tests.cpp",
  "src/test/script_standard_tests.cpp",
  "src/test/transaction_tests.cpp",
  "src/test/txvalidationcache_tests.cpp",
  "src/test/versionbits_tests.cpp",
  "src/validation.cpp",
  "src/validation.h",
  "src/wallet/feebumper.h",
  "src/wallet/rpc/addresses.cpp",
  "src/wallet/rpc/spend.cpp",
  "src/wallet/rpc/wallet.cpp",
  "src/wallet/scriptpubkeyman.cpp",
  "src/wallet/scriptpubkeyman.h",
  "src/wallet/wallet.cpp",
  "src/wallet/wallet.h",
  "test/functional/feature_cisa.py",
  "test/functional/feature_taproot.py",
  "test/functional/mining_basic.py",
  "test/functional/p2p_segwit.py",
  "test/functional/rpc_blockchain.py",
  "test/functional/rpc_deriveaddresses.py",
  "test/functional/test_framework/cisa.py",
  "test/functional/test_framework/psbt.py",
  "test/functional/test_runner.py",
  "test/functional/wallet_cisa.py"
 ],
 "files": [
  {
   "path": "cmake/secp256k1.cmake",
   "add": 3,
   "del": 0
  },
  {
   "path": "doc/descriptors.md",
   "add": 3,
   "del": 1
  },
  {
   "path": "doc/psbt.md",
   "add": 27,
   "del": 0
  },
  {
   "path": "src/CMakeLists.txt",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/addresstype.cpp",
   "add": 11,
   "del": 0
  },
  {
   "path": "src/addresstype.h",
   "add": 8,
   "del": 1
  },
  {
   "path": "src/cisa.cpp",
   "add": 177,
   "del": 0
  },
  {
   "path": "src/cisa.h",
   "add": 66,
   "del": 0
  },
  {
   "path": "src/common/types.h",
   "add": 6,
   "del": 0
  },
  {
   "path": "src/consensus/params.h",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/core_io.cpp",
   "add": 19,
   "del": 0
  },
  {
   "path": "src/core_io.h",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/deploymentinfo.cpp",
   "add": 4,
   "del": 0
  },
  {
   "path": "src/kernel/chainparams.cpp",
   "add": 7,
   "del": 0
  },
  {
   "path": "src/key.cpp",
   "add": 6,
   "del": 0
  },
  {
   "path": "src/key.h",
   "add": 4,
   "del": 0
  },
  {
   "path": "src/key_io.cpp",
   "add": 14,
   "del": 0
  },
  {
   "path": "src/node/psbt.cpp",
   "add": 2,
   "del": 1
  },
  {
   "path": "src/outputtype.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/policy/policy.cpp",
   "add": 3,
   "del": 2
  },
  {
   "path": "src/policy/policy.h",
   "add": 4,
   "del": 2
  },
  {
   "path": "src/psbt.cpp",
   "add": 129,
   "del": 5
  },
  {
   "path": "src/psbt.h",
   "add": 70,
   "del": 0
  },
  {
   "path": "src/pubkey.cpp",
   "add": 51,
   "del": 0
  },
  {
   "path": "src/pubkey.h",
   "add": 6,
   "del": 0
  },
  {
   "path": "src/rpc/blockchain.cpp",
   "add": 3,
   "del": 0
  },
  {
   "path": "src/rpc/client.cpp",
   "add": 3,
   "del": 0
  },
  {
   "path": "src/rpc/rawtransaction.cpp",
   "add": 21,
   "del": 4
  },
  {
   "path": "src/rpc/util.cpp",
   "add": 21,
   "del": 0
  },
  {
   "path": "src/rpc/util.h",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/script/descriptor.cpp",
   "add": 44,
   "del": 35
  },
  {
   "path": "src/script/interpreter.cpp",
   "add": 173,
   "del": 12
  },
  {
   "path": "src/script/interpreter.h",
   "add": 43,
   "del": 4
  },
  {
   "path": "src/script/script.cpp",
   "add": 7,
   "del": 0
  },
  {
   "path": "src/script/script.h",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/script/script_error.cpp",
   "add": 8,
   "del": 0
  },
  {
   "path": "src/script/script_error.h",
   "add": 6,
   "del": 0
  },
  {
   "path": "src/script/sign.cpp",
   "add": 131,
   "del": 21
  },
  {
   "path": "src/script/sign.h",
   "add": 25,
   "del": 0
  },
  {
   "path": "src/script/signingprovider.cpp",
   "add": 38,
   "del": 0
  },
  {
   "path": "src/script/signingprovider.h",
   "add": 11,
   "del": 0
  },
  {
   "path": "src/script/solver.cpp",
   "add": 5,
   "del": 0
  },
  {
   "path": "src/script/solver.h",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/secp256k1/.github/workflows/ci.yml",
   "add": 54,
   "del": 15
  },
  {
   "path": "src/secp256k1/.gitignore",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/secp256k1/CMakeLists.txt",
   "add": 7,
   "del": 0
  },
  {
   "path": "src/secp256k1/Makefile.am",
   "add": 35,
   "del": 1
  },
  {
   "path": "src/secp256k1/README.md",
   "add": 4,
   "del": 0
  },
  {
   "path": "src/secp256k1/ci/ci.sh",
   "add": 3,
   "del": 1
  },
  {
   "path": "src/secp256k1/configure.ac",
   "add": 59,
   "del": 25
  },
  {
   "path": "src/secp256k1/doc/fullagg.md",
   "add": 54,
   "del": 0
  },
  {
   "path": "src/secp256k1/doc/halfagg.md",
   "add": 22,
   "del": 0
  },
  {
   "path": "src/secp256k1/examples/CMakeLists.txt",
   "add": 8,
   "del": 0
  },
  {
   "path": "src/secp256k1/examples/fullagg.c",
   "add": 208,
   "del": 0
  },
  {
   "path": "src/secp256k1/examples/halfagg.c",
   "add": 115,
   "del": 0
  },
  {
   "path": "src/secp256k1/include/secp256k1_fullagg.h",
   "add": 448,
   "del": 0
  },
  {
   "path": "src/secp256k1/include/secp256k1_schnorrsig_halfagg.h",
   "add": 112,
   "del": 0
  },
  {
   "path": "src/secp256k1/src/CMakeLists.txt",
   "add": 21,
   "del": 0
  },
  {
   "path": "src/secp256k1/src/bench.c",
   "add": 52,
   "del": 2
  },
  {
   "path": "src/secp256k1/src/bench_ecmult.c",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/secp256k1/src/bench_internal.c",
   "add": 3,
   "del": 3
  },
  {
   "path": "src/secp256k1/src/ctime_tests.c",
   "add": 55,
   "del": 0
  },
  {
   "path": "src/secp256k1/src/ecdsa.h",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/secp256k1/src/ecdsa_impl.h",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/secp256k1/src/eckey.h",
   "add": 2,
   "del": 8
  },
  {
   "path": "src/secp256k1/src/eckey_impl.h",
   "add": 2,
   "del": 41
  },
  {
   "path": "src/secp256k1/src/ecmult_gen.h",
   "add": 5,
   "del": 5
  },
  {
   "path": "src/secp256k1/src/ecmult_gen_impl.h",
   "add": 33,
   "del": 33
  },
  {
   "path": "src/secp256k1/src/field.h",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/secp256k1/src/group.h",
   "add": 17,
   "del": 0
  },
  {
   "path": "src/secp256k1/src/group_impl.h",
   "add": 61,
   "del": 0
  },
  {
   "path": "src/secp256k1/src/modules/ecdh/main_impl.h",
   "add": 6,
   "del": 8
  },
  {
   "path": "src/secp256k1/src/modules/ecdh/tests_impl.h",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/secp256k1/src/modules/ellswift/main_impl.h",
   "add": 16,
   "del": 17
  },
  {
   "path": "src/secp256k1/src/modules/ellswift/tests_impl.h",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/secp256k1/src/modules/fullagg/Makefile.am.include",
   "add": 5,
   "del": 0
  },
  {
   "path": "src/secp256k1/src/modules/fullagg/bench_impl.h",
   "add": 106,
   "del": 0
  },
  {
   "path": "src/secp256k1/src/modules/fullagg/main_impl.h",
   "add": 1043,
   "del": 0
  },
  {
   "path": "src/secp256k1/src/modules/fullagg/tests_impl.h",
   "add": 586,
   "del": 0
  },
  {
   "path": "src/secp256k1/src/modules/fullagg/vectors.h",
   "add": 702,
   "del": 0
  },
  {
   "path": "src/secp256k1/src/modules/musig/keyagg_impl.h",
   "add": 4,
   "del": 4
  },
  {
   "path": "src/secp256k1/src/modules/musig/session_impl.h",
   "add": 26,
   "del": 118
  },
  {
   "path": "src/secp256k1/src/modules/musig/tests_impl.h",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/secp256k1/src/modules/nonce_common.h",
   "add": 52,
   "del": 0
  },
  {
   "path": "src/secp256k1/src/modules/nonce_common_impl.h",
   "add": 121,
   "del": 0
  },
  {
   "path": "src/secp256k1/src/modules/schnorrsig/main_impl.h",
   "add": 4,
   "del": 4
  },
  {
   "path": "src/secp256k1/src/modules/schnorrsig/tests_exhaustive_impl.h",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/secp256k1/src/modules/schnorrsig/tests_impl.h",
   "add": 2,
   "del": 2
  },
  {
   "path": "src/secp256k1/src/modules/schnorrsig_halfagg/Makefile.am.include",
   "add": 5,
   "del": 0
  },
  {
   "path": "src/secp256k1/src/modules/schnorrsig_halfagg/bench_impl.h",
   "add": 74,
   "del": 0
  },
  {
   "path": "src/secp256k1/src/modules/schnorrsig_halfagg/main_impl.h",
   "add": 219,
   "del": 0
  },
  {
   "path": "src/secp256k1/src/modules/schnorrsig_halfagg/tests_impl.h",
   "add": 329,
   "del": 0
  },
  {
   "path": "src/secp256k1/src/modules/schnorrsig_halfagg/vectors.h",
   "add": 1162,
   "del": 0
  },
  {
   "path": "src/secp256k1/src/modules/silentpayments/main_impl.h",
   "add": 10,
   "del": 10
  },
  {
   "path": "src/secp256k1/src/scratch_impl.h",
   "add": 8,
   "del": 2
  },
  {
   "path": "src/secp256k1/src/secp256k1.c",
   "add": 23,
   "del": 16
  },
  {
   "path": "src/secp256k1/src/testrand_impl.h",
   "add": 1,
   "del": 1
  },
  {
   "path": "src/secp256k1/src/tests.c",
   "add": 51,
   "del": 38
  },
  {
   "path": "src/secp256k1/tools/test_vectors_fullagg_generate.py",
   "add": 214,
   "del": 0
  },
  {
   "path": "src/secp256k1/tools/test_vectors_halfagg_generate.py",
   "add": 237,
   "del": 0
  },
  {
   "path": "src/test/CMakeLists.txt",
   "add": 5,
   "del": 0
  },
  {
   "path": "src/test/cisa_tests.cpp",
   "add": 353,
   "del": 0
  },
  {
   "path": "src/test/data/cisa_consensus_vectors.json",
   "add": 950,
   "del": 0
  },
  {
   "path": "src/test/data/cisa_descriptor_vectors.json",
   "add": 496,
   "del": 0
  },
  {
   "path": "src/test/data/cisa_psbt_vectors.json",
   "add": 310,
   "del": 0
  },
  {
   "path": "src/test/data/cisa_wallet_vectors.json",
   "add": 222,
   "del": 0
  },
  {
   "path": "src/test/descriptor_tests.cpp",
   "add": 75,
   "del": 0
  },
  {
   "path": "src/test/fuzz/util.cpp",
   "add": 4,
   "del": 1
  },
  {
   "path": "src/test/psbt_tests.cpp",
   "add": 169,
   "del": 0
  },
  {
   "path": "src/test/script_standard_tests.cpp",
   "add": 8,
   "del": 3
  },
  {
   "path": "src/test/transaction_tests.cpp",
   "add": 11,
   "del": 4
  },
  {
   "path": "src/test/txvalidationcache_tests.cpp",
   "add": 5,
   "del": 5
  },
  {
   "path": "src/test/versionbits_tests.cpp",
   "add": 4,
   "del": 0
  },
  {
   "path": "src/validation.cpp",
   "add": 56,
   "del": 4
  },
  {
   "path": "src/validation.h",
   "add": 44,
   "del": 3
  },
  {
   "path": "src/wallet/feebumper.h",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/wallet/rpc/addresses.cpp",
   "add": 1,
   "del": 0
  },
  {
   "path": "src/wallet/rpc/spend.cpp",
   "add": 70,
   "del": 4
  },
  {
   "path": "src/wallet/rpc/wallet.cpp",
   "add": 2,
   "del": 0
  },
  {
   "path": "src/wallet/scriptpubkeyman.cpp",
   "add": 16,
   "del": 2
  },
  {
   "path": "src/wallet/scriptpubkeyman.h",
   "add": 6,
   "del": 0
  },
  {
   "path": "src/wallet/wallet.cpp",
   "add": 12,
   "del": 0
  },
  {
   "path": "src/wallet/wallet.h",
   "add": 7,
   "del": 0
  },
  {
   "path": "test/functional/feature_cisa.py",
   "add": 484,
   "del": 0
  },
  {
   "path": "test/functional/feature_taproot.py",
   "add": 4,
   "del": 0
  },
  {
   "path": "test/functional/mining_basic.py",
   "add": 1,
   "del": 1
  },
  {
   "path": "test/functional/p2p_segwit.py",
   "add": 5,
   "del": 4
  },
  {
   "path": "test/functional/rpc_blockchain.py",
   "add": 14,
   "del": 1
  },
  {
   "path": "test/functional/rpc_deriveaddresses.py",
   "add": 15,
   "del": 0
  },
  {
   "path": "test/functional/test_framework/cisa.py",
   "add": 106,
   "del": 0
  },
  {
   "path": "test/functional/test_framework/psbt.py",
   "add": 4,
   "del": 0
  },
  {
   "path": "test/functional/test_runner.py",
   "add": 2,
   "del": 0
  },
  {
   "path": "test/functional/wallet_cisa.py",
   "add": 257,
   "del": 0
  }
 ],
 "test_lines": 3523,
 "git": {
  "head": "224e15fd891334f0a2fb924d2ac60bc08ed9e4f3",
  "head_matches_backup": true,
  "base": "33a363ea250839ca31ea043b7500789d2e5d844b",
  "commits": [
   {
    "sha": "b45f40c03b",
    "subject": "Squashed 'src/secp256k1/' changes from 687155df6b7..a4aca78581b",
    "files": 57,
    "add": 6402,
    "del": 368
   },
   {
    "sha": "239dba9b84",
    "subject": "Merge commit 'b45f40c03b0effe0ad53e49053b7a81923352afe' into bip460",
    "files": 57,
    "add": 6402,
    "del": 368
   },
   {
    "sha": "067f8511dc",
    "subject": "build: Enable secp halfagg and fullagg modules",
    "files": 1,
    "add": 3,
    "del": 0
   },
   {
    "sha": "7b9d10e289",
    "subject": "consensus: Add CISA deployment and script flag",
    "files": 10,
    "add": 41,
    "del": 2
   },
   {
    "sha": "e99d6e105a",
    "subject": "script: Add witness v2 keypath signature message",
    "files": 3,
    "add": 22,
    "del": 7
   },
   {
    "sha": "7f9f8627b9",
    "subject": "script: Add per-input witness v2 validation",
    "files": 6,
    "add": 112,
    "del": 13
   },
   {
    "sha": "d74b4bec9c",
    "subject": "script: Add transaction-level CISA verification",
    "files": 6,
    "add": 159,
    "del": 0
   },
   {
    "sha": "002355961c",
    "subject": "validation: Add CISA check to the check queue",
    "files": 3,
    "add": 100,
    "del": 12
   },
   {
    "sha": "639a2a7e6d",
    "subject": "policy: Make witness v2 transactions standard",
    "files": 16,
    "add": 84,
    "del": 13
   },
   {
    "sha": "1b531fff1e",
    "subject": "test: Add CISA unit tests with BIP460 test vectors",
    "files": 4,
    "add": 1528,
    "del": 0
   },
   {
    "sha": "4761d18cd5",
    "subject": "test: Add CISA functional test",
    "files": 3,
    "add": 591,
    "del": 0
   },
   {
    "sha": "d25e2daba2",
    "subject": "draft-bip: descriptor: Add cisa() output script descriptor",
    "files": 3,
    "add": 49,
    "del": 36
   },
   {
    "sha": "01b437ae5c",
    "subject": "draft-bip: test: Add cisa() descriptor tests",
    "files": 6,
    "add": 634,
    "del": 0
   },
   {
    "sha": "40d69a788b",
    "subject": "draft-bip: cisa: Add half and full aggregation signing helpers",
    "files": 9,
    "add": 306,
    "del": 0
   },
   {
    "sha": "650c4df0ad",
    "subject": "draft-bip: psbt: Add CISA input fields",
    "files": 6,
    "add": 116,
    "del": 1
   },
   {
    "sha": "2c437f4967",
    "subject": "draft-bip: sign: Sign witness v2 inputs by aggregation mode",
    "files": 8,
    "add": 180,
    "del": 32
   },
   {
    "sha": "695c09cdea",
    "subject": "draft-bip: psbt: Finalize CISA aggregation groups",
    "files": 4,
    "add": 83,
    "del": 0
   },
   {
    "sha": "1cfa826a7b",
    "subject": "draft-bip: rpc: Add cisa_mode option to PSBT signing RPCs",
    "files": 10,
    "add": 65,
    "del": 8
   },
   {
    "sha": "34eace4d37",
    "subject": "draft-bip: test: Add CISA PSBT tests",
    "files": 5,
    "add": 629,
    "del": 14
   },
   {
    "sha": "421657c01b",
    "subject": "draft-bip: cisa: Decouple full aggregation nonces from the signed message",
    "files": 4,
    "add": 48,
    "del": 38
   },
   {
    "sha": "41ea27e7ff",
    "subject": "draft-bip: wallet: Add reservecisanonce for pre-shared full aggregation nonces",
    "files": 8,
    "add": 111,
    "del": 0
   },
   {
    "sha": "224e15fd89",
    "subject": "draft-bip: test: Test full aggregation with reserved nonces",
    "files": 1,
    "add": 83,
    "del": 2
   }
  ],
  "patch_truncated": true
 },
 "input_hash": "65504dee64d85c37",
 "extracted_at": "2026-09-17T16:15:31+00:00"
}