bolt12: import draft payer proof spec.
What changed, and why it matters
This commit adds a new data structure definition for 'payer proofs' in the BOLT12 (Bitcoin Lightning) wire protocol. It is purely a schema/import change: it adds a new TLV (Type-Length-Value) record type called payer_proof and lists its fields, plus includes a header file needed to compile it. There is no executable code, no parsing logic, no behavior change, and no indication of a bug or vulnerability.
No security action required. Treat as normal feature/spec import. Review the generated code in follow-up commits that actually implement payer proof creation/validation.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The change imports the draft payer proof specification into the BOLT12 wire CSV. It defines a new tlvtype ‘payer_proof’ with fields copied from offer/invoice_request/invoice records, plus proof-specific fields (proof_signature, proof_preimage, proof_omitted_tlvs, proof_missing_hashes, proof_leaf_hashes, proof_note). The Makefile is updated to include bitcoin/preimage.h for generated bolt12 wire code. No runtime code is modified; this is a code-generation input/schema update only.
Changed components
wire/bolt12_wire.csvwire/Makefilewire/extracted_bolt12_02_payer_proofs.patchInspect captured patch +155 / −1
diff --git a/wire/Makefile b/wire/Makefile
index 71c217a5..30186441 100644
--- a/wire/Makefile
+++ b/wire/Makefile
@@ -89,7 +89,7 @@ wire/onion_exp_wiregen.h_args := $(wire/onion_wiregen.h_args)
wire/onion_exp_wiregen.c_args := $(wire/onion_wiregen.c_args)
wire/bolt12_wiregen.c_args := -s --expose-tlv-type=tlv_blinded_path --expose-tlv-type=tlv_invoice_request --expose-tlv-type=tlv_invoice --include='wire/onion_wiregen.h'
-wire/bolt12_wiregen.h_args := --include='bitcoin/short_channel_id.h' --include='bitcoin/signature.h' --include='bitcoin/privkey.h' --include='common/bigsize.h' --include='common/amount.h' --include='common/node_id.h' --include='bitcoin/block.h' $(wire/bolt12_wiregen.c_args)
+wire/bolt12_wiregen.h_args := --include='bitcoin/short_channel_id.h' --include='bitcoin/signature.h' --include='bitcoin/privkey.h' --include='common/bigsize.h' --include='common/amount.h' --include='common/node_id.h' --include='bitcoin/block.h' $(wire/bolt12_wiregen.c_args) --include='bitcoin/preimage.h'
wire/bolt12_printgen.c_args := --expose-tlv-type=tlv_blinded_path --expose-tlv-type=tlv_invoice_request --include='wire/onion_wiregen.h' --include='wire/onion_printgen.h'
wire/bolt12_printgen.h_args := --include='wire/bolt12_wiregen.h' --expose-tlv-type=tlv_blinded_path --expose-tlv-type=tlv_invoice_request
diff --git a/wire/bolt12_wire.csv b/wire/bolt12_wire.csv
index c67960a9..3810f972 100644
--- a/wire/bolt12_wire.csv
+++ b/wire/bolt12_wire.csv
@@ -195,3 +195,76 @@ tlvtype,invoice_error,suggested_value,3
tlvdata,invoice_error,suggested_value,value,byte,...
tlvtype,invoice_error,error,5
tlvdata,invoice_error,error,msg,utf8,...
+tlvtype,payer_proof,offer_chains,2
+tlvdata,payer_proof,offer_chains,chains,chain_hash,...
+tlvtype,payer_proof,offer_metadata,4
+tlvdata,payer_proof,offer_metadata,data,byte,...
+tlvtype,payer_proof,offer_currency,6
+tlvdata,payer_proof,offer_currency,iso4217,utf8,...
+tlvtype,payer_proof,offer_amount,8
+tlvdata,payer_proof,offer_amount,amount,tu64,
+tlvtype,payer_proof,offer_description,10
+tlvdata,payer_proof,offer_description,description,utf8,...
+tlvtype,payer_proof,offer_features,12
+tlvdata,payer_proof,offer_features,features,byte,...
+tlvtype,payer_proof,offer_absolute_expiry,14
+tlvdata,payer_proof,offer_absolute_expiry,seconds_from_epoch,tu64,
+tlvtype,payer_proof,offer_paths,16
+tlvdata,payer_proof,offer_paths,paths,blinded_path,...
+tlvtype,payer_proof,offer_issuer,18
+tlvdata,payer_proof,offer_issuer,issuer,utf8,...
+tlvtype,payer_proof,offer_quantity_max,20
+tlvdata,payer_proof,offer_quantity_max,max,tu64,
+tlvtype,payer_proof,offer_issuer_id,22
+tlvdata,payer_proof,offer_issuer_id,id,point,
+tlvtype,payer_proof,invreq_chain,80
+tlvdata,payer_proof,invreq_chain,chain,chain_hash,
+tlvtype,payer_proof,invreq_amount,82
+tlvdata,payer_proof,invreq_amount,msat,tu64,
+tlvtype,payer_proof,invreq_features,84
+tlvdata,payer_proof,invreq_features,features,byte,...
+tlvtype,payer_proof,invreq_quantity,86
+tlvdata,payer_proof,invreq_quantity,quantity,tu64,
+tlvtype,payer_proof,invreq_payer_id,88
+tlvdata,payer_proof,invreq_payer_id,key,point,
+tlvtype,payer_proof,invreq_payer_note,89
+tlvdata,payer_proof,invreq_payer_note,note,utf8,...
+tlvtype,payer_proof,invreq_paths,90
+tlvdata,payer_proof,invreq_paths,paths,blinded_path,...
+tlvtype,payer_proof,invreq_bip_353_name,91
+tlvdata,payer_proof,invreq_bip_353_name,name_len,u8,
+tlvdata,payer_proof,invreq_bip_353_name,name,byte,name_len
+tlvdata,payer_proof,invreq_bip_353_name,domain_len,u8,
+tlvdata,payer_proof,invreq_bip_353_name,domain,byte,domain_len
+tlvtype,payer_proof,invoice_paths,160
+tlvdata,payer_proof,invoice_paths,paths,blinded_path,...
+tlvtype,payer_proof,invoice_blindedpay,162
+tlvdata,payer_proof,invoice_blindedpay,payinfo,blinded_payinfo,...
+tlvtype,payer_proof,invoice_created_at,164
+tlvdata,payer_proof,invoice_created_at,timestamp,tu64,
+tlvtype,payer_proof,invoice_relative_expiry,166
+tlvdata,payer_proof,invoice_relative_expiry,seconds_from_creation,tu32,
+tlvtype,payer_proof,invoice_payment_hash,168
+tlvdata,payer_proof,invoice_payment_hash,payment_hash,sha256,
+tlvtype,payer_proof,invoice_amount,170
+tlvdata,payer_proof,invoice_amount,msat,tu64,
+tlvtype,payer_proof,invoice_fallbacks,172
+tlvdata,payer_proof,invoice_fallbacks,fallbacks,fallback_address,...
+tlvtype,payer_proof,invoice_features,174
+tlvdata,payer_proof,invoice_features,features,byte,...
+tlvtype,payer_proof,invoice_node_id,176
+tlvdata,payer_proof,invoice_node_id,node_id,point,
+tlvtype,payer_proof,signature,240
+tlvdata,payer_proof,signature,sig,bip340sig,
+tlvtype,payer_proof,proof_signature,241
+tlvdata,payer_proof,proof_signature,sig,bip340sig,
+tlvtype,payer_proof,proof_preimage,1001
+tlvdata,payer_proof,proof_preimage,preimage,byte,32
+tlvtype,payer_proof,proof_omitted_tlvs,1002
+tlvdata,payer_proof,proof_omitted_tlvs,missing,bigsize,...
+tlvtype,payer_proof,proof_missing_hashes,1003
+tlvdata,payer_proof,proof_missing_hashes,hashes,sha256,...
+tlvtype,payer_proof,proof_leaf_hashes,1004
+tlvdata,payer_proof,proof_leaf_hashes,hashes,sha256,...
+tlvtype,payer_proof,proof_note,1005
+tlvdata,payer_proof,proof_note,note,utf8,...
diff --git a/wire/extracted_bolt12_02_payer_proofs.patch b/wire/extracted_bolt12_02_payer_proofs.patch
new file mode 100644
index 00000000..e92d6c53
--- /dev/null
+++ b/wire/extracted_bolt12_02_payer_proofs.patch
@@ -0,0 +1,81 @@
+diff --git a/wire/bolt12_wire.csv b/wire/bolt12_wire.csv
+index c67960a9c7..3810f9727d 100644
+--- a/wire/bolt12_wire.csv
++++ b/wire/bolt12_wire.csv
+@@ -195,3 +195,76 @@ tlvtype,invoice_error,suggested_value,3
+ tlvdata,invoice_error,suggested_value,value,byte,...
+ tlvtype,invoice_error,error,5
+ tlvdata,invoice_error,error,msg,utf8,...
++tlvtype,payer_proof,offer_chains,2
++tlvdata,payer_proof,offer_chains,chains,chain_hash,...
++tlvtype,payer_proof,offer_metadata,4
++tlvdata,payer_proof,offer_metadata,data,byte,...
++tlvtype,payer_proof,offer_currency,6
++tlvdata,payer_proof,offer_currency,iso4217,utf8,...
++tlvtype,payer_proof,offer_amount,8
++tlvdata,payer_proof,offer_amount,amount,tu64,
++tlvtype,payer_proof,offer_description,10
++tlvdata,payer_proof,offer_description,description,utf8,...
++tlvtype,payer_proof,offer_features,12
++tlvdata,payer_proof,offer_features,features,byte,...
++tlvtype,payer_proof,offer_absolute_expiry,14
++tlvdata,payer_proof,offer_absolute_expiry,seconds_from_epoch,tu64,
++tlvtype,payer_proof,offer_paths,16
++tlvdata,payer_proof,offer_paths,paths,blinded_path,...
++tlvtype,payer_proof,offer_issuer,18
++tlvdata,payer_proof,offer_issuer,issuer,utf8,...
++tlvtype,payer_proof,offer_quantity_max,20
++tlvdata,payer_proof,offer_quantity_max,max,tu64,
++tlvtype,payer_proof,offer_issuer_id,22
++tlvdata,payer_proof,offer_issuer_id,id,point,
++tlvtype,payer_proof,invreq_chain,80
++tlvdata,payer_proof,invreq_chain,chain,chain_hash,
++tlvtype,payer_proof,invreq_amount,82
++tlvdata,payer_proof,invreq_amount,msat,tu64,
++tlvtype,payer_proof,invreq_features,84
++tlvdata,payer_proof,invreq_features,features,byte,...
++tlvtype,payer_proof,invreq_quantity,86
++tlvdata,payer_proof,invreq_quantity,quantity,tu64,
++tlvtype,payer_proof,invreq_payer_id,88
++tlvdata,payer_proof,invreq_payer_id,key,point,
++tlvtype,payer_proof,invreq_payer_note,89
++tlvdata,payer_proof,invreq_payer_note,note,utf8,...
++tlvtype,payer_proof,invreq_paths,90
++tlvdata,payer_proof,invreq_paths,paths,blinded_path,...
++tlvtype,payer_proof,invreq_bip_353_name,91
++tlvdata,payer_proof,invreq_bip_353_name,name_len,u8,
++tlvdata,payer_proof,invreq_bip_353_name,name,byte,name_len
++tlvdata,payer_proof,invreq_bip_353_name,domain_len,u8,
++tlvdata,payer_proof,invreq_bip_353_name,domain,byte,domain_len
++tlvtype,payer_proof,invoice_paths,160
++tlvdata,payer_proof,invoice_paths,paths,blinded_path,...
++tlvtype,payer_proof,invoice_blindedpay,162
++tlvdata,payer_proof,invoice_blindedpay,payinfo,blinded_payinfo,...
++tlvtype,payer_proof,invoice_created_at,164
++tlvdata,payer_proof,invoice_created_at,timestamp,tu64,
++tlvtype,payer_proof,invoice_relative_expiry,166
++tlvdata,payer_proof,invoice_relative_expiry,seconds_from_creation,tu32,
++tlvtype,payer_proof,invoice_payment_hash,168
++tlvdata,payer_proof,invoice_payment_hash,payment_hash,sha256,
++tlvtype,payer_proof,invoice_amount,170
++tlvdata,payer_proof,invoice_amount,msat,tu64,
++tlvtype,payer_proof,invoice_fallbacks,172
++tlvdata,payer_proof,invoice_fallbacks,fallbacks,fallback_address,...
++tlvtype,payer_proof,invoice_features,174
++tlvdata,payer_proof,invoice_features,features,byte,...
++tlvtype,payer_proof,invoice_node_id,176
++tlvdata,payer_proof,invoice_node_id,node_id,point,
++tlvtype,payer_proof,signature,240
++tlvdata,payer_proof,signature,sig,bip340sig,
++tlvtype,payer_proof,proof_signature,241
++tlvdata,payer_proof,proof_signature,sig,bip340sig,
++tlvtype,payer_proof,proof_preimage,1001
++tlvdata,payer_proof,proof_preimage,preimage,byte,32
++tlvtype,payer_proof,proof_omitted_tlvs,1002
++tlvdata,payer_proof,proof_omitted_tlvs,missing,bigsize,...
++tlvtype,payer_proof,proof_missing_hashes,1003
++tlvdata,payer_proof,proof_missing_hashes,hashes,sha256,...
++tlvtype,payer_proof,proof_leaf_hashes,1004
++tlvdata,payer_proof,proof_leaf_hashes,hashes,sha256,...
++tlvtype,payer_proof,proof_note,1005
++tlvdata,payer_proof,proof_note,note,utf8,...
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.