From 92ebcfad7d176cc4b61c4dead292b0b07c2e07f1 Mon Sep 17 00:00:00 2001 From: highlander Date: Mon, 3 Aug 2026 20:48:01 -0300 Subject: [PATCH 1/3] fix(taproot): send the witness and tx footer to the host signing_sign_segwit_input()'s taproot branch signs with bip340_sign() directly instead of signing_sign_hash(), which is where every other input type sets resp.serialized.has_serialized_tx. signing_txack() memsets resp on every message, so the flag never carried over and nanopb omitted serialized_tx from the wire entirely. The host therefore lost the 66-byte witness (01 40 <64-byte schnorr sig>) and the 4-byte locktime footer appended after it -- 70 bytes -- leaving a transaction that declares the segwit marker/flag but carries no witness stack and no locktime. Reproduced on hardware: a P2TR spend returned a valid signature alongside an 83-byte unparseable serialized tx, which the host would have broadcast verbatim. The signature field was unaffected, which is why the existing taproot tests passed: they assert signatures and discard the serialized tx. --- lib/firmware/signing.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/firmware/signing.c b/lib/firmware/signing.c index ec8dfdd67..bc66580ed 100644 --- a/lib/firmware/signing.c +++ b/lib/firmware/signing.c @@ -1437,6 +1437,11 @@ static bool signing_sign_segwit_input(TxInputType* txinput) { resp.serialized.has_signature_index = true; resp.serialized.signature_index = idx1; resp.serialized.has_signature = true; + /* signing_txack() memsets resp, and this branch bypasses + signing_sign_hash(), which is where every other input type sets this. + Without it nanopb omits serialized_tx and the host loses the witness + and the tx footer. */ + resp.serialized.has_serialized_tx = true; resp.serialized.signature.size = 64; memcpy(resp.serialized.signature.bytes, sig, 64); From 01b87a5029710eb9317a56d55e1f5c8c127f3121 Mon Sep 17 00:00:00 2001 From: highlander Date: Mon, 3 Aug 2026 21:31:49 -0300 Subject: [PATCH 2/3] chore(deps): re-pin python-keepkey for the taproot serialized-tx gate Picks up the BIP-144 completeness assertions that catch this bug and the MUST_RUN_MODULES report gate, so CI exercises both. --- deps/python-keepkey | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps/python-keepkey b/deps/python-keepkey index 84b4a2503..1f2eecd22 160000 --- a/deps/python-keepkey +++ b/deps/python-keepkey @@ -1 +1 @@ -Subproject commit 84b4a25030763bbe8f84175b12e7a8a245bbb6d2 +Subproject commit 1f2eecd227f73996b1d60af3af1b2972430527ad From 0d949af5fd9f7c3af52911ad6687570d63f659d5 Mon Sep 17 00:00:00 2001 From: highlander Date: Mon, 3 Aug 2026 21:50:57 -0300 Subject: [PATCH 3/3] docs(evidence): Gate-3 OLED frames for the taproot witness and address fixes Eight emulator captures on the abandon test seed covering both defects rc25 shipped: the BIP-86 and P2WSH address screens now rendering complete rather than cut at 42 characters, and the confirm screens for the three taproot signing flows, showing the amount/destination/fee are unaffected by the serialization fix. Emulator captures do not satisfy Gate-3 on their own -- the README records what is still owed on device. --- .../01-p2tr-address-full-62-chars.png | Bin 0 -> 996 bytes .../02-p2wsh-address-full.png | Bin 0 -> 1057 bytes .../03-p2tr-spend-recipient.png | Bin 0 -> 574 bytes .../04-p2tr-spend-fee.png | Bin 0 -> 793 bytes .../05-p2tr-change-recipient.png | Bin 0 -> 579 bytes .../06-p2tr-change-fee.png | Bin 0 -> 790 bytes .../07-mixed-p2tr-legacy-recipient.png | Bin 0 -> 587 bytes .../08-mixed-p2tr-legacy-fee.png | Bin 0 -> 796 bytes .../README.md | 69 +++++++++++++ .../manifest.json | 92 ++++++++++++++++++ 10 files changed, 161 insertions(+) create mode 100644 docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/01-p2tr-address-full-62-chars.png create mode 100644 docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/02-p2wsh-address-full.png create mode 100644 docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/03-p2tr-spend-recipient.png create mode 100644 docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/04-p2tr-spend-fee.png create mode 100644 docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/05-p2tr-change-recipient.png create mode 100644 docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/06-p2tr-change-fee.png create mode 100644 docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/07-mixed-p2tr-legacy-recipient.png create mode 100644 docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/08-mixed-p2tr-legacy-fee.png create mode 100644 docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/README.md create mode 100644 docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/manifest.json diff --git a/docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/01-p2tr-address-full-62-chars.png b/docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/01-p2tr-address-full-62-chars.png new file mode 100644 index 0000000000000000000000000000000000000000..e4b9629d54d119efd87e806b9d51a6a1f42e1316 GIT binary patch literal 996 zcmVO;A^;NVw0_4sz0RT_v|Ef`Hxx28^ zV*p+n!|*Ck1E4Gf0AO`({T>FuC<^dS2Tw}d0uSSW0RZ^F|A{?rEQbJa6}_tzoo_2+ z{ms&*w;%#o{a>&43K{C(h^~b|M1$5qnA~1Q`n#o3L^Nm&*n5B@qskoeUb!m$i462_ zp}(a8kqrc1(S0B_a1=C$<)XA!Ec}VU{X`(6F@xnt z#Ej%kt%>b@P|mGu#Yqn+5EQR{K>)A?W7!;LTF$MD1zhKA^HammlRY481OI?)r{&zb zTEO&y3+!BEZ5nnxMFGjRlX7ldF2ycY5CA7cj}>!tD9fi}@91UARG+EPK2-KtpFefpv}Jx0OkUo4(lFU05<|i z{wy{kLwK}U6bR~jcKG~Ea4xHtc&)H{e#v>d-f6Ucbh>0Zo*COREHN!tyO-8U5BhT9 ze530@2{q|Y4a1Q%L6yZ3GK3e@S%cFnzE1$y`miBWjtW)Ec6HR*tPrjsRcY02cHR&)KN#C;ni1j}Ta#Pd zF_{4%RH@x>sxhP101)UA0MEd~jGAWP%VnsWS68o*l^}yMsJ{T<4G+jxjr}SQ;Bo;# zHh!4D0HE{$A0ryn>Prp?m6-{ouy)*e@H{mKL??2|=mC*QXy5z5Jc|UM`(S|{WpgtRlycJ=fN=m$A5$uJ zKAU0+4t#ADezJ1_q%Z=Sv+aKc0R5WjgE5rnIv;@1x`T#rg3<#f1O1N&gh4+B0A3&3 zV~Q0wFmpgk@Mau96%t-g1)z%pfqvq%0B1Hlo*A^%V_d$o7>o2yL!Bn&&z64!FYt2m Sym%1+0000`N>ay@{?IaUCy4#Iifl@0;+Q(pgK1K z+5hPfSOcK;JrFH;(g7gqh@v5B+*ru#4ghdmo40De|DJOuy{BvdU{{NQ<}&r%UD)X{ z0KC`>91jDa`w#%|ZXws71Hh;XV5cvC?fS$VFaW^r^%pg6EUN%ejkF*rJ-3&!|Frl2 zeQ&YvJm47stQ>|kExd=mdP;a_oUav*l9B%?i_V3b@51SDX|*@3NJwb5t`af`C6!Ac zklNu6Qh~PvnLv$4UTC=0hm}`P6W{wni=+xPG}Z+xkG|Tx>Jb1{?rR;_1HfF0$D!t! zQzVU~+5QNcMI1%J19^P%78r@LhpolJz(T*A4a_&y0zg>qyyTaR0JV@dDnM+|9~aF6 zfPh2a7y#sdTXf$I$N{Ela42hs96)(C#{Ah;U?fV%WD0!mdyxn9^8bq7g@g*9M?2Dj zQ2AT4aXr6Y77zfAei36sS6sARg-DL2bldkt4IV5Z^#@{n*~-1I(2)n5UCK{-=blH9N@giAHDd;v(YofbASq!L&D(s0MOmJpPz;%V1nCn_7o2m z`k)nEEv^SN?980u=^r7xFxGcbdHE|%F)>&brR&DXWyXW{@oN|?54bVL+5oN9wex^= z0-FYhgW$h9_i4u=I}q}?ih9UJ!*T{#GkqRJG6{XQt^5k+DNs`kB5YoShb9Yw!`f`M z%-LV7&??VV1fZZmvSE-Wn+|S%s+2IOn^S&4^317`24oZ2Lz}U5u9~|_H1+^U?ZOMo zW@vr^fNCYr!Cu62Gt`3opdAyzoCAX@-U*oy&u;;cP)h*ts(%Ckj3xl^umOO-(rKa@ zjw1l)AK^d?aTYR#$As(frsm^R(PR4S-V<^$mtfKwMc9!5u#Qdjzc0^(yo~5E z;Y&pnH87Y+mBzI&k9`GDOV|QRdw?UL5%g*VuGMns)HrCtFcE?PUeG#d8@#;*v_^ok zsh$a~5s;EX(2D`Z<`0nla)A0n+||}e=QAhUtl@f;Ka$oVIiOU5%oyp~0jFn@u2YJw b-wg5xgAxa7Tu-hO00000NkvXXu0mjfE9mjF literal 0 HcmV?d00001 diff --git a/docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/03-p2tr-spend-recipient.png b/docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/03-p2tr-spend-recipient.png new file mode 100644 index 0000000000000000000000000000000000000000..a5e653075a21628c698d3be0ae5308651d41125e GIT binary patch literal 574 zcmV-E0>S->P)Z1NYK!j#Gd$~h!6xptO7NBTa)iVb!`Sz*JeOJ2X31~ko0#*SMus8wBx5E4}H2XO`V#Mx(z&30zwu_hASbW}T z&Mz>wf1sQ<4mRF~?Ip_E8*uXhquv2*ki1C%rXDsb4$EaifNxWL;wsoR8=tB=0s1r< zFOe+WJ8nsbUVY+1K%+VWJOsMqmm?l`*l$&L_jO@jYu4!9x#n9JQL%$DZphpWJD zWr+C8<^Y0N8&=SUDGIx}6xH2o8Ybr<-!x{@CXhUv%Wx?u7GX*O5F*NDB1ajTK#R;Vc=&@iQH)5tedWv{SeAs|-ha|FZ?=#~b#at^w8 z%WXTQQ4WtN3*x~CojQq13TktlgSz~L06&$WhMLmNdTvj0ggF6lHd6@~EHrPo5rQdA#6(kUfyv=G5-p0B({5^Uz4Oi_P7}{wV<{Bb!@1=k8(;=Yu^nf&8DF>7)An<2_#`il`0pd^i0l)Ubgq{%WV=E_0uCSyDZw5VuA3WY-9E`Z|Kn*0X9y%_-R%>XcDV999N zj~}}zQ_HkLtbSNT`@OP@asStfpJpprenkS%o_v`#@C4u-1aOK=g-wC|M5pHlfq-Mr zEM)bV062>T*8M9yKrTQ)GN>;$2lVNdBLmCxHNjlwT&qC(a1+c|fg7L*xH|zI1Habi z`?$OPwH>YlkwRgB7X}5o#PiA=lDE5VyL9VG^*$bCL)IBEXzCMBE9=`HiRICk@wH#M z)o3~Z{j;e7{rATNkHXMr^bF9>sY$j(+eoDZkg&Erv%`sjt~(B9TvvqWgaFQmm%$Ro za?m`${#qH78}4@9fU7Kw-?3x3Y$RamkQo8gQ@xzl?2$lkPELT+Y(~Il`!^Ec@<#-a zDg)`Mph$rC^Uo1L(=la)v8zX7>;e9ejOX`QljVS`17<1@0oI2rh$Eoabq4_{Den>U z6}(^9GX=|M(zQ@16ixtIN&RvRT4v!I$lz%@Kd+sWuF!(ru-7BW&|u6;ecLe|fM?H^z&C5JMw3GSR zAj|~Ndg_wgIj)|l|7<3pP$(1%g&QNTqjrxUetcMW6{Inli>i=Z7lQUQEbMBTIRQrk zdnY(vBu`a8?n7#k7XNEv{WrTqAZ|`FBQ1Q^GBzXqTDRt#-61d|fa{35Izp-LL$=HT z$C(Iu7sW#W;oF)l_8`$-C;V;|NQQu09u9!bLjauzoEvYL1I~?p6^KWQbkA3T!j16< XMtE=KB%c%E00000NkvXXu0mjfIHGSz literal 0 HcmV?d00001 diff --git a/docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/05-p2tr-change-recipient.png b/docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/05-p2tr-change-recipient.png new file mode 100644 index 0000000000000000000000000000000000000000..c3ee4d3d6b57c79e8e8136015b2710579b4cbe85 GIT binary patch literal 579 zcmV-J0=)f+P)ezTTJd5|s59;O=CH&H@I{4+#|2W=?=@F7t(yF#*04a^fm@T9yR2?{@-h zb2(f<*M8z|L(pSRTnOk*Mu3;VB>bUVeux0BaxiOY0~vQ=48t5}z3(=gyr0iR7jIiQ zHNMg}p?p0sc+!kxY-ZWo2-ks!dEnNV*${y>ZYRZn-AF#%~=UfFhdp01O8vAD67#5UV*fgrT%KxhYkW=F*Zc<1LTW zfFKBhAP9mW2!bF8g78D&Cr^)cd;Gxzq5eQ>-?RSN4d5;{au1!fe(8I+@qbAG%CtQ# zw!QoK|8y50;kMmL%Q9fw`I51pz~K_GduG6}uG9m<6ln0z0^`>^P66Rx_yZMF!G#VK Rfjyc!1o1fMihLY!2wtEk_2H=WBww%(Yg5^kEasSAh*s1nf>g$H2Gs z`Frece{F~BK%`I@;Eh3nF7diBhvey9ILZd){;y~ovSz@bs!zNutgSr~@$OaP>-So& zD8@wdv$YQW`eTB}%g|Ny4DDQ#151SafB=%(_GxxXF;IH_goZmIJ|_flKD-Q;FqVVn z0o^AIfzCN~C$2&JO&gL*lw+9ToaL4}+Er{au&Rr?PT;POWVkOl+k zy|Oa`yq|xZfG`ES5zTH%=OC(?)gcKy?i*Ep@^=k{JGBZCrhH>jb2vyjA;4 z_?Xg{43;mcbfHivoDQ^r`c)XTy24eE!P9hFUY)Z;FlhN>0q?B`fdFoQq>Hbfr>6yf zQEpQGu=y5KX-FRSdL$VdgV|dj__@%p4<|Wr3p+bWYBjg>8pU!#(vKf+_>h`yFuRQa zEo8YIdyis#*POAL$`DTX;yPXYe&9V1uze|5Y|<$0#3uyg2L&vQBKI_wpAn!w@)-iG zb7R+M1epFWJV0F8t_zcXbah{NK+-{n35feV9+6oC>Le|fM?H^z&C5K%j)3^sAj|~N za_W-YIj)?j{~RWuP$(1%g^dx{QM<=KetcMW7o;(ni>i=ZH-h#wEbMBTIRR$^dnY(v zBu`a8?n7#k7XNF4KOC&eNeK|YImwK)@LAun8IynOuHXSOCV~R1I{xM z@-B*p0K#8t^0Wtu_B!Ert3WaY-12Y&93BGbJmA{+z#MRG^s7KTQlxvn3KTZR52yx; U%7zWvUH||907*qoM6N<$g0GZlX#fBK literal 0 HcmV?d00001 diff --git a/docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/07-mixed-p2tr-legacy-recipient.png b/docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/07-mixed-p2tr-legacy-recipient.png new file mode 100644 index 0000000000000000000000000000000000000000..07e407309d2cb70e39ea5088d40cedbae6704040 GIT binary patch literal 587 zcmV-R0<`^!P)79HABDEP1sm*{$Z3evk zfdunLfX;slg$h52J>^>cW}h~5Q-K0GhlS>O_*&f3cJ zm$v*2bNeUz8;ygG`|!GRk>O|34MYSZV5liTIs!072A-*0pJt!iLTTb~c+B;X3N`#yrU(UTUjx*m&0QEjEFc zFCTNls2eAGMZj#9dCjoJ#+R|#&eog2t_B-I=ywdusZvrzpl@>3CecqsVJ$ObAix&t zdj!}J$fgFpa1L^H%V|3$Ru7NJE86}7zGoVd6x_}CIf&CQ2pFegwjsLdWWHgKbA&Yk za5hVgp%`d>7XdSGc|icKm@XXV4NI;G5dYK-0?dhKIRK9XozI5s*h7rwkPuvGTjw^e zk|dXwJd8`;i2;Hj2!bF8f*=TjAPC|g!M=Gq#_jln7ee|%s>?+0JpjX`X3Rq)MK3CQ zjQvXjP^WdbIAzbV|1uX};kIt1WFBxzKD60);C2YeGd;kKE9HPt1seRbKwAmP=2qP*QkwT$RcnYBSwkF>J@N5QvXEOi{8CWt} z_UmRBW$HVv5R0D{(SEP&V%+bw;nr*=%kM}4+LM206+8jB1_7Mnx5B2tZqezvLLlJW zGYeTgCIHSNfpz}|50D!WkPPaZ%>jM7<;cMDd`&Qyxz;L>K0E~LtH1+L1U#L9j)8CM z^Z$6d{k0vg1Cc^ufCGa9UE+OV4$0eZ+fR}{(3|PGQ_C%i?UcQP0B!A+SRO$VkX-v! z+^86H&CjL)^xq#7yk3UhqGxDFn;cl8ZKPHRAdzj8W=9kQji-)hTvvqWgaFQmm%$Ro za?m`${sc4-TPk>_Zo^d~#w|?^mq`Mau2>_0`ly%Fsx2KK4Hj4*cfNQ^zeACg5UcD~{#f7gJFhX8A344K=wDxuXwI4t1b z@kx!Z7c5^-<3gcOI4Nii^$Rg*frYCegQwM*dF!+t;z7$F3plnU1OmAIkuJV^o?b1u zqufgMY4a_t(tTOj>ycz=7-nyM;O9cWKAhy(Eo|;2sny)hYZS`~NuNL7@KH6}V0Ie; zTF7!a{O&{Y7?*Nrk5ql(4K~cT`e;w;7nle z1jmcysp`jlNG;Ohe@%pMcGk#A2@tLf4>DRjMo84(WK*j`c8Bte9c&q!6 znK|G*6Cv-ScnBbTRg=XYB--nQ->m}45OB-G2{1hb(0RbM@qszu+UQq-c%(?b`6^I& aFn$2c{(#iYg~Q?i0000 Emulator captures. Per the release SOP these do **not** substitute for +> on-device Gate-3 proof; they establish that the rendering logic is correct +> before anyone picks up a device. + +## What rc25 got wrong + +**1. Addresses longer than one line were silently truncated.** +`draw_string()` stopped at the bottom of the canvas and dropped the rest, so the +user verified a 42-character prefix while the QR code beside it encoded the whole +address — the two disagreed with no indication. This became urgent the moment +rc25 shipped Taproot, because every `bc1p` address is 62 characters. + +`01` shows `m/86'/0'/0'/0/0` rendering the complete +`bc1p5cyxnuxmeuwuvkwfem96lqzszd02n6xdcjrs20cac6yqjjwudpxqkedrcr` +across two lines, matching the QR. `02` shows the same fix for P2WSH multisig, +which had the identical defect before Taproot existed. + +**2. The witness and locktime never reached the host.** +The Taproot signing branch set `has_signature` but not `has_serialized_tx`, so +nanopb omitted `serialized_tx` entirely and 70 bytes — the 66-byte witness plus +the 4-byte locktime footer — were dropped on the wire. The signature itself was +always correct, which is why every test passed. + +`03`–`08` are the confirm screens for the three signing flows that now also +assert the full BIP-144 serialization. They prove the amount, destination and +fee shown to the user are unchanged by that fix. + +## Frames + +| File | Screen | +|---|---| +| `01-p2tr-address-full-62-chars.png` | BIP-86 receive address, complete, with QR | +| `02-p2wsh-address-full.png` | P2WSH multisig address, complete | +| `03-p2tr-spend-recipient.png` | `Send 0.0009 BTC to 1BitcoinEater…` | +| `04-p2tr-spend-fee.png` | Total `0.001 BTC`, fee `0.0001 BTC` | +| `05-p2tr-change-recipient.png` | Recipient, device-derived P2TR change omitted | +| `06-p2tr-change-fee.png` | Fee confirmation, change flow | +| `07-mixed-p2tr-legacy-recipient.png` | Recipient, mixed Taproot + legacy inputs | +| `08-mixed-p2tr-legacy-fee.png` | Fee confirmation, mixed inputs | + +## Reproducing + +```sh +cd scripts/emulator +docker compose build kkemu && docker compose up -d kkemu +docker compose run --rm -v "$PWD/out:/out" --entrypoint /bin/sh python-keepkey -c ' + cd /kkemu/deps/python-keepkey/tests && export PYTHONPATH=".." + KEEPKEY_SCREENSHOT=1 SCREENSHOT_DIR=/out \ + KK_TRANSPORT_MAIN=kkemu:11044 KK_TRANSPORT_DEBUG=kkemu:11045 \ + python3 -m pytest test_msg_signtx_taproot.py test_msg_getaddress_taproot.py \ + test_taproot_screens.py -q' +``` + +Frames land in `$SCREENSHOT_DIR///btnNNNNN.png`. + +## Still owed + +On-device Gate-3 for both flows: display a `bc1p` receive address and compare it +character-for-character against the QR, then spend a P2TR input and confirm the +amount, destination and fee screens appear and require a press. diff --git a/docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/manifest.json b/docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/manifest.json new file mode 100644 index 000000000..a7e0d082f --- /dev/null +++ b/docs/security/evidence/7.15.0-rc26-taproot-witness-and-address/manifest.json @@ -0,0 +1,92 @@ +{ + "candidate": "7.15.0-rc26", + "seed": "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", + "capture": { + "source": "emulator", + "method": "python-keepkey with KEEPKEY_SCREENSHOT=1", + "note": "Emulator captures. Per the release SOP these do not substitute for on-device Gate-3 proof." + }, + "defects_covered": [ + { + "pr": 331, + "title": "addresses longer than one line were silently truncated", + "detail": "draw_string() stopped at the bottom of the canvas and dropped the remainder, so the rendered text and the QR code disagreed with no indication.", + "frames": [ + "01-p2tr-address-full-62-chars.png", + "02-p2wsh-address-full.png" + ] + }, + { + "pr": 337, + "title": "taproot witness and locktime footer never reached the host", + "detail": "The taproot signing branch set has_signature but not has_serialized_tx, so nanopb omitted serialized_tx and 70 bytes (66-byte witness + 4-byte locktime) were dropped on the wire.", + "frames": [ + "03-p2tr-spend-recipient.png", + "04-p2tr-spend-fee.png", + "05-p2tr-change-recipient.png", + "06-p2tr-change-fee.png", + "07-mixed-p2tr-legacy-recipient.png", + "08-mixed-p2tr-legacy-fee.png" + ] + } + ], + "verified_values": { + "bip86_receive_address_m_86h_0h_0h_0_0": "bc1p5cyxnuxmeuwuvkwfem96lqzszd02n6xdcjrs20cac6yqjjwudpxqkedrcr", + "bip86_address_characters": 62, + "serialized_tx_bytes": { + "p2tr": 153, + "p2tr_with_change": 196, + "mixed_p2tr_and_legacy": 301 + } + }, + "tests": { + "files": [ + "test_msg_signtx_taproot.py", + "test_msg_getaddress_taproot.py", + "test_taproot_screens.py" + ], + "result": "9 passed" + }, + "frames": [ + { + "file": "01-p2tr-address-full-62-chars.png", + "sha256": "b1a4174f8e4c88b30a41ce337d0e45ded840c104f6637dcc98a7dfc89d27e073", + "bytes": 996 + }, + { + "file": "02-p2wsh-address-full.png", + "sha256": "7cf807b25d8a2a6a67bc83f887184b89221a0bfd9d8a2a24872d3bc954669b17", + "bytes": 1057 + }, + { + "file": "03-p2tr-spend-recipient.png", + "sha256": "91390aec2d647e5dcd5c9cfc767e72fcc62a41e710aae9d8d42abe4af9451fd5", + "bytes": 574 + }, + { + "file": "04-p2tr-spend-fee.png", + "sha256": "c635bd2cb4c52b4553e4ad0ccbf53ae0e6fa3c61f9dbe60bfbf43d18692228fb", + "bytes": 793 + }, + { + "file": "05-p2tr-change-recipient.png", + "sha256": "fb1e137d2463b5ba44decd151f5380f649b3e884323c7c54f6f66e87cc3288a0", + "bytes": 579 + }, + { + "file": "06-p2tr-change-fee.png", + "sha256": "7260c9c0ee5cc85c61356b41b91aa4d30a091bf1be60b7516bff0e4b25b225aa", + "bytes": 790 + }, + { + "file": "07-mixed-p2tr-legacy-recipient.png", + "sha256": "6964d237e5208ec5cf2ca03ca35a3515cbd522eb4d0799e372285b5262cf1f6c", + "bytes": 587 + }, + { + "file": "08-mixed-p2tr-legacy-fee.png", + "sha256": "8ff0582a2bb578485b1c4973f042f8f7e1454473b7995174afdfb4e72cb56f1e", + "bytes": 796 + } + ] +}