From f9eec5c2b0597a29f804080bd1a50498067c18a7 Mon Sep 17 00:00:00 2001 From: Sarah Gliner <105934250+sgliner-ledger@users.noreply.github.com> Date: Tue, 27 Feb 2024 17:35:31 +0100 Subject: [PATCH 01/38] [auto] Update screenshot --- .github/PULL_REQUEST_TEMPLATE.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..f2fb620f5 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,8 @@ +# Checklist + +- [ ] App update process has been followed +- [ ] Target branch is `develop` +- [ ] Application version has been bumped + + From 45457c7fb84dcc79197f1a0efdd010434604cba1 Mon Sep 17 00:00:00 2001 From: Sarah Gliner <105934250+sgliner-ledger@users.noreply.github.com> Date: Tue, 27 Feb 2024 17:35:32 +0100 Subject: [PATCH 02/38] [auto] Update screenshot From a4e5775e59a2b32a0b7e3c483e46ada7f4addf0b Mon Sep 17 00:00:00 2001 From: Ajinkya Rajandekar Date: Wed, 24 Jan 2024 14:45:16 +0000 Subject: [PATCH 03/38] Change "Expert Mode Enabled" screen to match "TRANSACTION SIGNED" format --- README.md | 9 +++++++++ app/Makefile | 2 +- app/src/ui_stream_nbgl.c | 9 ++------- scripts/run_app.sh | 15 ++++++++++---- tests/integration/app_vars.sh | 2 +- .../nano/snapshots/nanos/version.png | Bin 330 -> 321 bytes .../nano/snapshots/nanosp/version.png | Bin 354 -> 342 bytes .../nano/snapshots/nanox/version.png | Bin 354 -> 342 bytes tests/integration/nano/utils/app.py | 2 +- .../stax/snapshots/test_basic/info.png | Bin 9890 -> 9777 bytes .../blindsign_enabled.png | Bin 8234 -> 5208 bytes .../test_blindsign_too_deep/info.png | Bin 9890 -> 9777 bytes .../blindsign_enabled.png | Bin 8234 -> 5208 bytes .../info.png | Bin 9890 -> 9777 bytes .../blindsign_enabled.png | Bin 8234 -> 5208 bytes .../test_blindsign_too_large/info.png | Bin 9890 -> 9777 bytes .../enabled_expert_mode.png | Bin 8077 -> 5065 bytes .../snapshots/test_blindsign_valid/info.png | Bin 9890 -> 9777 bytes .../enabled_expert_mode.png | Bin 8077 -> 5065 bytes .../test_expert_mode_rejections/info.png | Bin 9890 -> 0 bytes .../settings_expert_blindsiging_off.png | Bin 12528 -> 0 bytes .../settings_expert_on_blindsigning_off.png | Bin 12381 -> 0 bytes .../enabled_expert_mode.png | Bin 8077 -> 5065 bytes .../enabled_expert_mode.png | Bin 8077 -> 5065 bytes .../enabled_expert_mode.png | Bin 8077 -> 5065 bytes .../enabled_expert_mode.png | Bin 8077 -> 5065 bytes .../test_blindsign_too_deep_rejections.py | 12 ----------- .../stax/test_expert_mode_rejections.py | 19 +----------------- 28 files changed, 26 insertions(+), 44 deletions(-) delete mode 100644 tests/integration/stax/snapshots/test_expert_mode_rejections/info.png delete mode 100644 tests/integration/stax/snapshots/test_expert_mode_rejections/settings_expert_blindsiging_off.png delete mode 100644 tests/integration/stax/snapshots/test_expert_mode_rejections/settings_expert_on_blindsigning_off.png diff --git a/README.md b/README.md index 20797de45..1964b32aa 100644 --- a/README.md +++ b/README.md @@ -263,3 +263,12 @@ You can run : ./scripts/test_swap.sh update $DEVICE ``` to perform all snapshot update steps based on your current Tezos repository. + +## Contributing + +The version of the app must be updated after every change. Following files need to be updated +with a new version +1. app/Makefile +2. tests/integration/app_vars.sh +3. tests/integration/nano/utils/app.py +4. the snapshots (nano and stax) diff --git a/app/Makefile b/app/Makefile index 7171c30df..a842c50e0 100644 --- a/app/Makefile +++ b/app/Makefile @@ -43,7 +43,7 @@ APPNAME = "Tezos Wallet" # Application version APPVERSION_M=3 APPVERSION_N=0 -APPVERSION_P=2 +APPVERSION_P=3 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) # COMMIT diff --git a/app/src/ui_stream_nbgl.c b/app/src/ui_stream_nbgl.c index 57b49dd1f..fc3f65c9a 100644 --- a/app/src/ui_stream_nbgl.c +++ b/app/src/ui_stream_nbgl.c @@ -109,10 +109,7 @@ handle_blindsigning(bool confirm) if (confirm) { if (!N_settings.blindsigning) toggle_blindsigning(); - nbgl_useCaseReviewStart(&C_round_check_64px, "Blind signing enabled", - NULL, "Reject transaction", blindsign_splash, - tz_reject_ui); - + nbgl_useCaseStatus("BLIND SIGNING\nENABLED", true, blindsign_splash); } else { tz_reject_ui(); } @@ -163,9 +160,7 @@ handle_expert_mode(bool confirm) if (!N_settings.expert_mode) toggle_expert_mode(); - nbgl_useCaseReviewStart(&C_round_check_64px, "Expert mode enabled", - NULL, "Reject transaction", - tz_ui_stream_start, tz_reject_ui); + nbgl_useCaseStatus("EXPERT MODE\nENABLED", true, tz_ui_stream_start); } else { tz_reject_ui(); diff --git a/scripts/run_app.sh b/scripts/run_app.sh index eeee3708c..7f0c67521 100755 --- a/scripts/run_app.sh +++ b/scripts/run_app.sh @@ -17,7 +17,14 @@ seed="zebra`for i in $(seq 1 23) ; do echo -n ' zebra' ; done`" -docker run --rm -it -v $(pwd)/app/bin:/speculos/apps \ - -v $(pwd)/tests/integration:/tests --network host \ - ledger-app-tezos-integration-tests --display=headless --vnc-port 41000 \ - --seed "$seed" -m $TARGET apps/app.elf + +set -e + + +docker run --rm -it -v "$(realpath .):/app" \ + --entrypoint=/bin/sh ledger-app-tezos-integration-tests \ + -c " apk add gmp-dev curl jq libsodium-dev git xxd procps libvncserver; \ + python3 -m venv tezos_test_env --system-site-package; \ + source ./tezos_test_env/bin/activate; \ + python3 -m pip install -r tests/requirements.txt -q; + python3 -m speculos --display=headless --seed \"$seed\" -m $TARGET app/bin/app.elf" diff --git a/tests/integration/app_vars.sh b/tests/integration/app_vars.sh index f67aa334b..f79bd1c84 100644 --- a/tests/integration/app_vars.sh +++ b/tests/integration/app_vars.sh @@ -19,6 +19,6 @@ export COMMIT_BYTES=$(printf '%s' "$COMMIT" | xxd -p -c 256) export VERSION_WALLET_TAG="00" export APPVERSION_M=3 export APPVERSION_N=0 -export APPVERSION_P=2 +export APPVERSION_P=3 export APPVERSION=$APPVERSION_M.$APPVERSION_N.$APPVERSION_P export VERSION_BYTES=$(printf "%02x%02x%02x%02x" "$VERSION_WALLET_TAG" "$APPVERSION_M" "$APPVERSION_N" "$APPVERSION_P") diff --git a/tests/integration/nano/snapshots/nanos/version.png b/tests/integration/nano/snapshots/nanos/version.png index 42b4538d79d4327e6c8c1b43e74768a110774f99..88f5d44943711d7a568bcf9c1b968e2c73c99d27 100644 GIT binary patch delta 294 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 G)c*ot6)%?n diff --git a/tests/integration/stax/snapshots/test_blindsign_too_deep/blindsign_enabled.png b/tests/integration/stax/snapshots/test_blindsign_too_deep/blindsign_enabled.png index ab97a1942d319e7b5725da1d0e33e0a3dcd46f16..279acd54db7568993145eaa08b3ba55c1c567e5f 100644 GIT binary patch literal 5208 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 literal 8234 zcmeHNd03KpyDnR-Y0{=KY%I0K7LBwTSKOv4bSKKrAEq4Kt%*rNHD-&zn8rKAO zRC2|M+@fSq0TuUU5D-WaQ4~3^^PThm`R6;=cU@=r3*PtlKELI8p8L6<`{mbLHWmlJ zQTk@bjvWUrf4OeIW5>?tJ9fyt-6sQFf!MZTckEDIvb=uPAt8@D&V?0ymg;$nOse;` z-SD;)K99PM87@r@o>q*TMy8+qBH}|t<779ezl!kgmrwSG^o zRFxB!6$6n;NRaX;_Uu@&^4{sQ4}9X=@33+wKZ0$w&^XCHr;X!6Lw>|3;23cY~jdgyOXwaH;B1z zQQcrsaDWTO{4Y}rFYIe$t`tceDDKV?BC9Pv%&OS=P>M_y)(}{XCCGX(>V8; zYRO&F_g7o}hpmFV)oK^wmYi%qy}gibG2ipO%b1OEc|*a`pS&Yar|v(4)6eOgk-BSL z9W7Y?LH9K3VzL?5N_aj$+o`2);Y97xYFk0TJ;pb3`@wtJ9h1(5Wmln>Uw7VlVj|io zIih&3R^P2~13Bp-a>V&m?a`vsxRN9E)3rz6Ne^U{9?3aX8yFik^r2bW zLpO8!G>>dNV~JypA==}T+=A-QYMasRA_8KvDI53%Sx_50v^P*!IV z!&IcXBXgcyXqs}HD24Vm2KhvO_yRTl%{fo4Hn4?+@{Z1tVp8w@jeavvj_K8F*DP3i zM~;2DVg;oXZl5C=tjx_b^QK_9OMj)6++;)nBTm#V41iQ8KZB(&G>H4aHVeI#JL{;I za~fvUPLCT@`K}=(0={-n$r0o}Fx)cv%9OO1)qHn>c;;ll*M<|K(nnn|v38?aOST`_ z@Qh*I8O+g}-k05t;Vnd~Un0MgNh2My9J_B5|DTD@OM@~Ygh{?=1CcYctb*~BcRaeK zAstJ~-jH;FNlg(wvyo^&Wn7Nmn+!Bj-OI~sa&pq5m~y8s0fA_}1+zW>^pxa<-$;T{ zN4EygzUI)QU#pYAbFd^@o3iW&$8qmeem%5mYmC;@)6-{fT|UT-L&U7IVxZQyrHOb3 zHK&%r4Y$uVrADl-uEwR$PhveYyX$(`wwRe;T{sn)>eVvNT@ESxq%v-eTA3mfiZGuSHWD`4C5Vl z!BW{@i9)z!dHLm50huY;6>{ZGD4vmagy-`=qg0k&-h<@RYPeV%lPRruCderlFjq(( zob+>DZA-2n2^}!b0h7*VSxN-2;IM*n^58jY>L6=n4vGHafBT{-Suhg1DpAP;R^uVV zgaNCW)`_xcR~oFObLzo3uoazBk-#ES0=3`VWambH)ooriH^G9Ci=qwS5rwWKf@)?@ zg<2S4yfoNO!A!F1)uSYD)#|Q^r8;&UU94p51xGF^Z^`fwIkmp^O^4&gjt6aE#C?Ov z^kT$MJyq!K6IQjhIu=GSVlh0%?wql)F_nLDDBEv+L&VRB43?ycmX`-`3C!@U zG_9|v8Uu&6sg7nIb_&2R zX56!HtG9IG)~w*2AX+#c`!fdhBW4!MHhR;4%oW|<-i}P#{^&v>sa3h+3V%pG@GBh8 z2<{f+jcxUXxgmqB2Iy>XBL*XjahA6u!N7Uy@~=(*-w4S%4WlmhpWLlpo=Csr8~h_Fe^ z#AOr`>4*rBBm`oeE&8OJ{F5>Ie@ul%Ev0YfLmMjizJ-N_=@FcG15*BJr1mx4v5D{s}S#FQWkm|=T1{JoV6CZt2F<=rOG{NYUABh(iD0*1+_ z8zaBr6$mj;;}ZhU2nT~Kyz?8atMM;nhl;F^s9GR0*rd?S`jn6*Cb@7t91pF^SUu?2 zoaN^#5s2&lq#bdjmQs4z`iJ&9OO*^a{fq-uo$M6&e14eoR7xqrHnq^%^qyqEc-+Mj zg+KVRvhamC=cFXE;TX2+VJf>TgyY8j@gcV|Y@laqdt*af(FUf6IVVr2>1li8p7qRT z=}kd&{oQo18bcha&plyH1JR3?pQ>}5MgWsy)D+Dw7m@+LQ2r<-HuzmFV5TnF@n42= z)>Q9Z^VZEReKBKZx4FS5WcA&JzI9&Y&_T7{WiU1*nP1cIz6* zEHVba^;fGN4vd8_eX37{!7L4tu4o_<#+CDg$avhyaqiBFiKW%rYP+=Vch!7_nsRn> z0VQx{byc@A0AdV@UV}+)RFUm2y%*~ZPZRi8wf0-IBlN1vw^AB~IM1&p{%Ai2w+X}Q z+qf!3)>S1C;a?(HN{xX=R}3n>11j)U8D)-zDQ#81F-?S*0V5OBsW4!Lgm%8B=J&pzHtliMi3sh9-(6o~5ztU^GS)N0$@j6!?^z2#9-VY_rhd>#Y zsJD@Bq?BMHeWY6(5%AVuT+tP|i9oILQj4;OC*OolaX1`!do{>K!Hg;wfgpdL9sn?| z(E@;f-Trqh?%Vjuz7~&S5G(e4g+Z-n4N4-`$^Bw4IGJwruB@#WahqdG8yp-A)wTN4 zT@N0#CYq#Joz3clx7%D3EF0DE<%5o-%T;9T0@8Ck;wF4ee#-(X{aV8HS?SfIRF&`a z*N1*#49bVu+Ngyombe0ysC8$A39I9SaU$`i$hSHSmj5YwS$G8~1sB5Rd>R+xqShv+ zqvKLSD3PX`XQG5;u{*Wyl1gTLs|VxABt_N_BKPnQs;%aBd=otmXKW#+UEz17_s-eK z@73c4x;GlJUMzO^zuNLD^oid!pkG<+h(I6!+=gKPcXax;M8kTa7!Mj*cBYlhKhSo=XPeQ*m-yYrz@$ z#9u!w{y|L%d>9iTVp<9{GgrDPd@bDX@K)LsgPS>(+xUy|9TuJ=ZTRaF%dVp#K<>at zwofNqYpu@}64wia(VCnTS+^@K3*-6WPtz6hyFHVlCpiyS9MJQLCQ{KPieYX?kGMV| zsiW$e7K6rmxrXD-uf!J%`tI8EF_YXlp$Wao+1mI)q1}OS;u)XNbWsLfb~n{D@gZ+O zZu^P*Rv(5jiiPLqQ5f5SajdLqKg#^#`<)jn3r|P_;)L`|ey-@fvb)(U>pwJ3VYV5v z)zAN#g!CW%;{S<=^9;rFxUcHh?g=y>Sy@19u#}LPvb@>&w8%v>r@qNX9_DEp zwYq_{Q*cG=$d&iqjS>{4KP^f?p~&@%TrPJtgz&QI#utCw(1({!rq4QCO3Yh>+C2e| zp_J~A8_B=1lB1N_lh!peQ91?Ky9N+eKi4?-nr+g;xL|Dr!L9$vgz8u~P4aQzV>A+4 zMm)DT9%AVn&B98O3b$Y}q!4R;M|df)8+p!!#6ypD z#s-0!#8&CA2a^RxWT2WryhqDy^X~-BPy!tk%orcDmlE9h?p6X_@u;Vl*X{3X#7$t5 zNF)-%k@X^i9m4 zA6jzj!B~}QxZY->iS0SAIoUZ_0U#n6!W*%rt6hqDK}exctGlCc*WV_K_xS6|7bk0_>@ z1@lYtlxxxEdrMJHNZS;Tdvz7|sgZB0Wknkjf84r_oq<{{Pu;`fxP-m16g~V5Q%!)c zR;b>PrBc!=h87k)qk0x2A|ilt!oo(=qgJ-AQN1SY3c_OV6rIb!x= zR6V;mtI-2snrO}7#|H}*-n*hr7EN9b;?G&2k!_UKu?p|por8uF^CCBQiS1G03hcq-^9rz*X>#RvovPJHG7Lj+n;^!vBN17ge z`GgY1J=@^=G-_`?FFr0IFMef6MNSbDK5$T_?Db1t;Hwg9tX8w{DxFSWPxK@Y{t?n# zim|Qw&Ndal3DI!WDQpG<(>O9pwx<1YtbLW;_@LdicauLt!ou>jX_pV)uS876wsm4+LJ3!H zvByGs?AoL|sX1Gm!HQ{d*93eD*xGA+^K4eP@=J_;s_9Ii_9wxnX3hNCNJA~}Y`fhF z<%poW*IdzAeI>qHw#2c)L+h`cU#S{JJGK`ITOEdQ@B!+3Ad20T1iQu|mMn zMk=CA2ZPvMn){RgCG9_*t_=BptzyMz&vVb~(R}+(Ns!OK^98^&lzA})-rf;^d56tL zfVL6<)(FL2Q`$KX|F31`mdtu^TG9J>b$vz>K|~y<0GeRu>?mIZNC{sBO9^>Q7}_r- zr_EgxkP`y6f3qpaQiBt|Yp(j@FWB5P`WxT@DXKk9pm*4%>QnvAx+sSNCNRb&G)y;l zrKgch{ag5=1it!P)SCKe>c%L0XX8!P>a7A^x|klvjfdNYw{znRL;KWO0P<*hF1B>t zdGV>)1*~bfM5Z;V1AIGNK%|%-;4}c(WNJD%S#e-iA~DWS_VV-uZuWb47ch7IHN&e1 z3y9-6o$S&iRt|Ih?v-`PhA2>5gH#VD6)QgWbLELPd~%#6Ol!q#i}EqPC{-Hj<}Lb| zjw;Lk3zqc$IZjjKwhn;hqU>05Uq5tXic4$%!4QOSAY+zL?uVNyH234chMP^JM5SZ* z@C?9fVvtR{hcF1UH3|qnytc60{;p00n;_2N32t1f6{q06IIhkmF)7I@^^WiU^i3d1 zfNo|13N(>)x^wYn`mb5+fyyiSHuBg%1GtJK;mW3C0C2l3PF?&dr8AhS>_Yv{e)7ID z{eW=ddGQ9443iGEbjmp%XfyW)W``4h{|%{|+nBu>2s++o{-0#;J5T1_Edjfc7Zd^%n9-Wt@-b-zbk$3vg|MRsl2~ z$WR?W@zwa&aV9e$R<6*d9N_q2%&)v(kM(?wfp~yHj*n>()`^LUi*c#ZEgJtfSku zwxi+B_GKjn8SohQ}f@pw2PsF4qd3)*L^XUe$fJ5t!--EJm9JFLCiNP zIkqW4_>PwA7 z@?2t~!@;705W+wl2j`L;dsT+h5R(Rxco^^1FC-s}|Du7VVz}a&IZ9O21m=Y!dcK){ zhkmJ$eA^Qci&!zgNtrAbE00Fmp$ad zw9L^6Qbi(>Rq;7x{bfK}S9|qCL!~h6>5}tLyI%ofipHF4h%`gP0>a~=EZTE|+da#z z{t9mMlQwzwQ=9({d9 zM}h(Md~ullz)77KP5uF}G4b;9G9ZJB-wVV#3F0>CXidZTD99~V`I&h!(eTK(0WQ~a zGa_B6%?(On&mG(vm8^v8>#nNa*=G$QPkv{%p~UIuf-3{Hl`ewPcouPtv*E|0D8mZE z7p}sl?&;14#CeDBoeLeV-byE8mwbYe1{D^(9GYbEpw z+LQ{%b-i22+h&Jt*t^`bicgQXp5w_?7GEO{ULYzln3cp>JR{cKQdyZnZC_0b#apGv zD7vIHs~sjY0kqU_V6^T158TN#v2sy0`DC^Ut#S&(GuJaRWS49^A{(UF zHjTaHZwZAfKd8WHAJbpD&vxxXHgz|L5W3?y1ed+hIbWfWjJzy9b`kYi)TRuhE&aIY z-8ykJ&BV>OGi<~pE5B7;#pi7w`LCB>Y3yCfCI-LT t9;(=1D$k+KDSTV@=->Lze9QE>G} diff --git a/tests/integration/stax/snapshots/test_blindsign_too_deep/info.png b/tests/integration/stax/snapshots/test_blindsign_too_deep/info.png index 8b571da7e1d27d7ef4ac01871b389c44e2258784..9be5755ffb991fa29c3112414c984433657b0959 100644 GIT binary patch literal 9777 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 G)c*ot6)%?n diff --git a/tests/integration/stax/snapshots/test_blindsign_too_deep_rejections/blindsign_enabled.png b/tests/integration/stax/snapshots/test_blindsign_too_deep_rejections/blindsign_enabled.png index ab97a1942d319e7b5725da1d0e33e0a3dcd46f16..279acd54db7568993145eaa08b3ba55c1c567e5f 100644 GIT binary patch literal 5208 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 literal 8234 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 t9;(=1D$k+KDSTV@=->Lze9QE>G} diff --git a/tests/integration/stax/snapshots/test_blindsign_too_deep_rejections/info.png b/tests/integration/stax/snapshots/test_blindsign_too_deep_rejections/info.png index 8b571da7e1d27d7ef4ac01871b389c44e2258784..9be5755ffb991fa29c3112414c984433657b0959 100644 GIT binary patch literal 9777 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 G)c*ot6)%?n diff --git a/tests/integration/stax/snapshots/test_blindsign_too_large/blindsign_enabled.png b/tests/integration/stax/snapshots/test_blindsign_too_large/blindsign_enabled.png index ab97a1942d319e7b5725da1d0e33e0a3dcd46f16..279acd54db7568993145eaa08b3ba55c1c567e5f 100644 GIT binary patch literal 5208 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 literal 8234 zcmeHNd03KpyDnR-Y0{=KY%I0K7LBwTSKOv4bSKKrAEq4Kt%*rNHD-&zn8rKAO zRC2|M+@fSq0TuUU5D-WaQ4~3^^PThm`R6;=cU@=r3*PtlKELI8p8L6<`{mbLHWmlJ zQTk@bjvWUrf4OeIW5>?tJ9fyt-6sQFf!MZTckEDIvb=uPAt8@D&V?0ymg;$nOse;` z-SD;)K99PM87@r@o>q*TMy8+qBH}|t<779ezl!kgmrwSG^o zRFxB!6$6n;NRaX;_Uu@&^4{sQ4}9X=@33+wKZ0$w&^XCHr;X!6Lw>|3;23cY~jdgyOXwaH;B1z zQQcrsaDWTO{4Y}rFYIe$t`tceDDKV?BC9Pv%&OS=P>M_y)(}{XCCGX(>V8; zYRO&F_g7o}hpmFV)oK^wmYi%qy}gibG2ipO%b1OEc|*a`pS&Yar|v(4)6eOgk-BSL z9W7Y?LH9K3VzL?5N_aj$+o`2);Y97xYFk0TJ;pb3`@wtJ9h1(5Wmln>Uw7VlVj|io zIih&3R^P2~13Bp-a>V&m?a`vsxRN9E)3rz6Ne^U{9?3aX8yFik^r2bW zLpO8!G>>dNV~JypA==}T+=A-QYMasRA_8KvDI53%Sx_50v^P*!IV z!&IcXBXgcyXqs}HD24Vm2KhvO_yRTl%{fo4Hn4?+@{Z1tVp8w@jeavvj_K8F*DP3i zM~;2DVg;oXZl5C=tjx_b^QK_9OMj)6++;)nBTm#V41iQ8KZB(&G>H4aHVeI#JL{;I za~fvUPLCT@`K}=(0={-n$r0o}Fx)cv%9OO1)qHn>c;;ll*M<|K(nnn|v38?aOST`_ z@Qh*I8O+g}-k05t;Vnd~Un0MgNh2My9J_B5|DTD@OM@~Ygh{?=1CcYctb*~BcRaeK zAstJ~-jH;FNlg(wvyo^&Wn7Nmn+!Bj-OI~sa&pq5m~y8s0fA_}1+zW>^pxa<-$;T{ zN4EygzUI)QU#pYAbFd^@o3iW&$8qmeem%5mYmC;@)6-{fT|UT-L&U7IVxZQyrHOb3 zHK&%r4Y$uVrADl-uEwR$PhveYyX$(`wwRe;T{sn)>eVvNT@ESxq%v-eTA3mfiZGuSHWD`4C5Vl z!BW{@i9)z!dHLm50huY;6>{ZGD4vmagy-`=qg0k&-h<@RYPeV%lPRruCderlFjq(( zob+>DZA-2n2^}!b0h7*VSxN-2;IM*n^58jY>L6=n4vGHafBT{-Suhg1DpAP;R^uVV zgaNCW)`_xcR~oFObLzo3uoazBk-#ES0=3`VWambH)ooriH^G9Ci=qwS5rwWKf@)?@ zg<2S4yfoNO!A!F1)uSYD)#|Q^r8;&UU94p51xGF^Z^`fwIkmp^O^4&gjt6aE#C?Ov z^kT$MJyq!K6IQjhIu=GSVlh0%?wql)F_nLDDBEv+L&VRB43?ycmX`-`3C!@U zG_9|v8Uu&6sg7nIb_&2R zX56!HtG9IG)~w*2AX+#c`!fdhBW4!MHhR;4%oW|<-i}P#{^&v>sa3h+3V%pG@GBh8 z2<{f+jcxUXxgmqB2Iy>XBL*XjahA6u!N7Uy@~=(*-w4S%4WlmhpWLlpo=Csr8~h_Fe^ z#AOr`>4*rBBm`oeE&8OJ{F5>Ie@ul%Ev0YfLmMjizJ-N_=@FcG15*BJr1mx4v5D{s}S#FQWkm|=T1{JoV6CZt2F<=rOG{NYUABh(iD0*1+_ z8zaBr6$mj;;}ZhU2nT~Kyz?8atMM;nhl;F^s9GR0*rd?S`jn6*Cb@7t91pF^SUu?2 zoaN^#5s2&lq#bdjmQs4z`iJ&9OO*^a{fq-uo$M6&e14eoR7xqrHnq^%^qyqEc-+Mj zg+KVRvhamC=cFXE;TX2+VJf>TgyY8j@gcV|Y@laqdt*af(FUf6IVVr2>1li8p7qRT z=}kd&{oQo18bcha&plyH1JR3?pQ>}5MgWsy)D+Dw7m@+LQ2r<-HuzmFV5TnF@n42= z)>Q9Z^VZEReKBKZx4FS5WcA&JzI9&Y&_T7{WiU1*nP1cIz6* zEHVba^;fGN4vd8_eX37{!7L4tu4o_<#+CDg$avhyaqiBFiKW%rYP+=Vch!7_nsRn> z0VQx{byc@A0AdV@UV}+)RFUm2y%*~ZPZRi8wf0-IBlN1vw^AB~IM1&p{%Ai2w+X}Q z+qf!3)>S1C;a?(HN{xX=R}3n>11j)U8D)-zDQ#81F-?S*0V5OBsW4!Lgm%8B=J&pzHtliMi3sh9-(6o~5ztU^GS)N0$@j6!?^z2#9-VY_rhd>#Y zsJD@Bq?BMHeWY6(5%AVuT+tP|i9oILQj4;OC*OolaX1`!do{>K!Hg;wfgpdL9sn?| z(E@;f-Trqh?%Vjuz7~&S5G(e4g+Z-n4N4-`$^Bw4IGJwruB@#WahqdG8yp-A)wTN4 zT@N0#CYq#Joz3clx7%D3EF0DE<%5o-%T;9T0@8Ck;wF4ee#-(X{aV8HS?SfIRF&`a z*N1*#49bVu+Ngyombe0ysC8$A39I9SaU$`i$hSHSmj5YwS$G8~1sB5Rd>R+xqShv+ zqvKLSD3PX`XQG5;u{*Wyl1gTLs|VxABt_N_BKPnQs;%aBd=otmXKW#+UEz17_s-eK z@73c4x;GlJUMzO^zuNLD^oid!pkG<+h(I6!+=gKPcXax;M8kTa7!Mj*cBYlhKhSo=XPeQ*m-yYrz@$ z#9u!w{y|L%d>9iTVp<9{GgrDPd@bDX@K)LsgPS>(+xUy|9TuJ=ZTRaF%dVp#K<>at zwofNqYpu@}64wia(VCnTS+^@K3*-6WPtz6hyFHVlCpiyS9MJQLCQ{KPieYX?kGMV| zsiW$e7K6rmxrXD-uf!J%`tI8EF_YXlp$Wao+1mI)q1}OS;u)XNbWsLfb~n{D@gZ+O zZu^P*Rv(5jiiPLqQ5f5SajdLqKg#^#`<)jn3r|P_;)L`|ey-@fvb)(U>pwJ3VYV5v z)zAN#g!CW%;{S<=^9;rFxUcHh?g=y>Sy@19u#}LPvb@>&w8%v>r@qNX9_DEp zwYq_{Q*cG=$d&iqjS>{4KP^f?p~&@%TrPJtgz&QI#utCw(1({!rq4QCO3Yh>+C2e| zp_J~A8_B=1lB1N_lh!peQ91?Ky9N+eKi4?-nr+g;xL|Dr!L9$vgz8u~P4aQzV>A+4 zMm)DT9%AVn&B98O3b$Y}q!4R;M|df)8+p!!#6ypD z#s-0!#8&CA2a^RxWT2WryhqDy^X~-BPy!tk%orcDmlE9h?p6X_@u;Vl*X{3X#7$t5 zNF)-%k@X^i9m4 zA6jzj!B~}QxZY->iS0SAIoUZ_0U#n6!W*%rt6hqDK}exctGlCc*WV_K_xS6|7bk0_>@ z1@lYtlxxxEdrMJHNZS;Tdvz7|sgZB0Wknkjf84r_oq<{{Pu;`fxP-m16g~V5Q%!)c zR;b>PrBc!=h87k)qk0x2A|ilt!oo(=qgJ-AQN1SY3c_OV6rIb!x= zR6V;mtI-2snrO}7#|H}*-n*hr7EN9b;?G&2k!_UKu?p|por8uF^CCBQiS1G03hcq-^9rz*X>#RvovPJHG7Lj+n;^!vBN17ge z`GgY1J=@^=G-_`?FFr0IFMef6MNSbDK5$T_?Db1t;Hwg9tX8w{DxFSWPxK@Y{t?n# zim|Qw&Ndal3DI!WDQpG<(>O9pwx<1YtbLW;_@LdicauLt!ou>jX_pV)uS876wsm4+LJ3!H zvByGs?AoL|sX1Gm!HQ{d*93eD*xGA+^K4eP@=J_;s_9Ii_9wxnX3hNCNJA~}Y`fhF z<%poW*IdzAeI>qHw#2c)L+h`cU#S{JJGK`ITOEdQ@B!+3Ad20T1iQu|mMn zMk=CA2ZPvMn){RgCG9_*t_=BptzyMz&vVb~(R}+(Ns!OK^98^&lzA})-rf;^d56tL zfVL6<)(FL2Q`$KX|F31`mdtu^TG9J>b$vz>K|~y<0GeRu>?mIZNC{sBO9^>Q7}_r- zr_EgxkP`y6f3qpaQiBt|Yp(j@FWB5P`WxT@DXKk9pm*4%>QnvAx+sSNCNRb&G)y;l zrKgch{ag5=1it!P)SCKe>c%L0XX8!P>a7A^x|klvjfdNYw{znRL;KWO0P<*hF1B>t zdGV>)1*~bfM5Z;V1AIGNK%|%-;4}c(WNJD%S#e-iA~DWS_VV-uZuWb47ch7IHN&e1 z3y9-6o$S&iRt|Ih?v-`PhA2>5gH#VD6)QgWbLELPd~%#6Ol!q#i}EqPC{-Hj<}Lb| zjw;Lk3zqc$IZjjKwhn;hqU>05Uq5tXic4$%!4QOSAY+zL?uVNyH234chMP^JM5SZ* z@C?9fVvtR{hcF1UH3|qnytc60{;p00n;_2N32t1f6{q06IIhkmF)7I@^^WiU^i3d1 zfNo|13N(>)x^wYn`mb5+fyyiSHuBg%1GtJK;mW3C0C2l3PF?&dr8AhS>_Yv{e)7ID z{eW=ddGQ9443iGEbjmp%XfyW)W``4h{|%{|+nBu>2s++o{-0#;J5T1_Edjfc7Zd^%n9-Wt@-b-zbk$3vg|MRsl2~ z$WR?W@zwa&aV9e$R<6*d9N_q2%&)v(kM(?wfp~yHj*n>()`^LUi*c#ZEgJtfSku zwxi+B_GKjn8SohQ}f@pw2PsF4qd3)*L^XUe$fJ5t!--EJm9JFLCiNP zIkqW4_>PwA7 z@?2t~!@;705W+wl2j`L;dsT+h5R(Rxco^^1FC-s}|Du7VVz}a&IZ9O21m=Y!dcK){ zhkmJ$eA^Qci&!zgNtrAbE00Fmp$ad zw9L^6Qbi(>Rq;7x{bfK}S9|qCL!~h6>5}tLyI%ofipHF4h%`gP0>a~=EZTE|+da#z z{t9mMlQwzwQ=9({d9 zM}h(Md~ullz)77KP5uF}G4b;9G9ZJB-wVV#3F0>CXidZTD99~V`I&h!(eTK(0WQ~a zGa_B6%?(On&mG(vm8^v8>#nNa*=G$QPkv{%p~UIuf-3{Hl`ewPcouPtv*E|0D8mZE z7p}sl?&;14#CeDBoeLeV-byE8mwbYe1{D^(9GYbEpw z+LQ{%b-i22+h&Jt*t^`bicgQXp5w_?7GEO{ULYzln3cp>JR{cKQdyZnZC_0b#apGv zD7vIHs~sjY0kqU_V6^T158TN#v2sy0`DC^Ut#S&(GuJaRWS49^A{(UF zHjTaHZwZAfKd8WHAJbpD&vxxXHgz|L5W3?y1ed+hIbWfWjJzy9b`kYi)TRuhE&aIY z-8ykJ&BV>OGi<~pE5B7;#pi7w`LCB>Y3yCfCI-LT t9;(=1D$k+KDSTV@=->Lze9QE>G} diff --git a/tests/integration/stax/snapshots/test_blindsign_too_large/info.png b/tests/integration/stax/snapshots/test_blindsign_too_large/info.png index 8b571da7e1d27d7ef4ac01871b389c44e2258784..9be5755ffb991fa29c3112414c984433657b0959 100644 GIT binary patch literal 9777 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 G)c*ot6)%?n diff --git a/tests/integration/stax/snapshots/test_blindsign_valid/enabled_expert_mode.png b/tests/integration/stax/snapshots/test_blindsign_valid/enabled_expert_mode.png index 9bb9098130f449907246ec5afd48ec1f3915403f..c9ef229fa7be8fd071a271ce31ba27c48213c36b 100644 GIT binary patch literal 5065 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 Zc|82`(!0{lz=+P|%;}I*jVEFY{tAkTu;%~( literal 8077 zcmeHMSyWTmwzaTD3#eOKsGwjEr4SSWA&{gj1PW<#5d$H#qJT)>Lx4nVK%oEy0cjE} z8i9m_-p~g{IuRp*BqB`IIw2uC20u89I4+DKy;?W$ z;DpU>^G|S13G)S$7~hB%xwSgqD`$EiT${ZC0T|?pu3)*8A?(jSf4m(on?1<~ zqw1z)y8ImayW`6^JU;#2V`7twT4+W`5fX`Uy;S+y^FV@G8GCgfr&`4=?R8O7$JCFG z3*OA2E~hQZ!Zc^-xt%%Fp8B<)k5pd|q1E$Gx_A#>{9f{T^JA@i%pG&(o-N86V-$Cn z?Is%XTGAOsVP1$%X~O-EA}-4r_Ur9HJ+&+Zv11CyH!1~Q?vP6{HnP>s?P}VhEaOGW zGl55p#{FxIpV8sX4(UuM-%`~SHMx|4fhi8d&Js$8?Df#7lCPL{*Oh|-W zN}WOzSA){HHKA+7wmllWcT_Ir3|7|)6Jjiv@-UJ90gVaKmP@hKu+T18$H%#P{k4$; zu8z?tdnRb!>ejYJdQ2|GYJc6E@f}*!4~F?Azt9dvrZrN748=xQH_a z-_pp?Iw&kK^BAlUEPf)FSUVc!IWGT%UY<=(-*vVhU-HUOE@d}X*YAQq@cKB#uPcWC#$&&LtLKP$F(2xY|G5-T<|kc6PyMlr+=X(7LQkNPiz^Vm-_XxW~SEx z02mZ39UW%e3gb~oCkN0dmNuKx-x)P^6@$Je0K_6um~O6h*${`rv8YnqxSp<5IpWVo zJcl{AuF%}75ODa3OiQ~xa=XMZc(ntWRqXh~z2~mKANsS0R-L%MvGFo;BJyf9lf$<*a~Hq}%%r*ze}jC5rY|N36blOrM}=R54Z%5Uwa6rX zvtwxM+w}Bw02^<3fJDk;@MbTb=0;lXEBNDp_6ajjDZBTQJ~l8t6^o2wH_+PVA_cmOiX6tX(cu9N(yt)Pcf}N@NnW$(^YM zjN&`b9cIP2xwxecnsa!^jTfJ(;c|jkU0TK=3>G%?NTDql0Kw4UdDg5-rGW}9BvN~O zJ2o3$$Z$SY?bjVwjzTqz3i)N&yi%XCRyw_~GSvn5zI=Ljg=Vr#5QQ6PkWYQlG6lXZ zFjhbAZ$RONy?4?GI!$oy)JUE1@>Ou|EaFke*4JYl3kG;1_N-_N_aN;}f35$xjp_W) zX=KK(s40rs&dP;_g)way!B#b^-31bso0>^dLsNXS_LvPeAEmdqi=CCdoYWX-rONI( zN2N+CcM{w+`jcsvR4j&$+(T0wdIVt7vA8>qWE7(YPECw;Y3z4%caP08pzI&aQUs10 zcvlo|mB5;Ma#`x=Vu2`w5Uu`PPSBFQnCi;1&x%?2WFJz4o{MZ559F+({Kq9gJfe_s zE`I=oN+6A_Ufh#(6+ShTY*RKwB293={f6Y}7>WZK1u4-?W+4&_3Ys?RrQkA}T)@1T zA34|V3dsS4Hk3NHr+q-B19?0!%4Kd*#efvjfC(_jXWhs;NtX&26;&KNVURH|-+-a` z(RvFNn>XD$o{}D2Vb5hm{=n1r6RBYooN~$SkBt*cv{aN(sd5mA>9cK3@7d0#au!=D z+7;M-L3FmXm~!TP@!H$f{r;~TNBqID-gc7L3%-Xw9_n=r-mITdDn&`&$1t-muJ!t9 z)x)V%tM@8{{IA{z42_93gK^ibPd6vFxOn9Zc-M9R3CkK{?S1(1ePG;Z<2I9tX5#U$ zTiBlm=+`tR2BtTY-34dzRve&me4dZs)3B(#p+g*DKfR;3$J6iJ%P1k{Nr)jkT}o6Q zLdgkMN5v;rwCWcF;0)gq6K`rmk1HdeFltGz*q+q2G)ex0`(Nky*3&BtVL^&lVC#Ub)(#A$Xp&TstHVjr# zH!>#_YD)<7KOm*BPlveWf#rxULgJnSRRJ=L>u1ai=iD=L5wrMN#mS{aj^7h<6-^)_ z4}+CDhq>UC9iwMS*URvrbAxE3CYVwS$GaRsK<~Po`M+mZN2e<0Bq*ntsd;1|jAHm- zhodF?1`<%*89H7DZ*rg{4I}q=gkFrl8q03d>eurkw&OCEUmFr^(*?Yf`f-3ac{5^v!%c~tK6cP!mU3fq~W_$X0PE=%TjfA&`N(0E8FQ}a$XUW#N zGQP#tY`0FPnDtxJL|{lb?3#w#ksBVumGyAT$1oU-RaMjSNo5hG`!Tnt@U3@yLtLwx z`iLZHsc*A{uOCNqbwHAfG(U-A?Dnk5-vRlK$Kw%4wzEf@gzX{u_(|K=hVlepdHIo4 zvtRe%DUc#XqB=T(B{BueTkI;^n7pfGxe*6krInF29WP4)FNBHCM;vjxAP)#JiLyQyhBFawe(r?voAo`b3F5*14hdhww9 z!@p2(-`W8^pxBf^P%|GG7XnqydXQt8%jG_hvv^`+*~;t3pCpp?6_H4Ud`H;(Dwoxu z4P5Ni&m@ut&ORd+x`ItcBK`wJwe}GeH4sJZuRRcIY4|Tt17AYWyf@AWw$0%v#NJ2vfb))fq`E!b&C3pj z;^+8=rya-{DNiMlKzQPEEhSxAJw4(^mHCijSGK-)TTSImXfF2T(sMRubWN*wplG>A zAP|IjMN;}c7Ow1K(Y(Ur-D-C)97THoC6^feKK#yGv4MmGh_D<&oU*JjMDKKU`>0z~ z7<*KOs*0uv>^Z>jn-zLt6UD0P`DX;%VmO%YJXcHY;2V`E7kwrPu^ue-iR;(nFHNl; zKah$!=voLu!1&&967cn_!-8K>oHJfS+~05I$irfb?WYs1urJzqS^U{wc2U+t;f474 zc-K%!46BAj-|kZpcg;Qc8k9?n2!hP`L;XYvnaicL?UOqEl?<<*(HUl@Lvq7 z%a>ct_!%aC-G|dGel%fE2KVZaP5iEkcJJ8SlB~L`E%4hU2X#(y-ZlPaecW0)z6%$c zO}wb~9oM643)_@`vMsUt{R6`Gzoqs+fJt86$HgN2#^%>weAba$*nQ{2f7=0(|G(S# z{p}b0fAB@VsiqA(I0B)R)Y;bu_Pe%aQRqThr7&`Raq HP}e0w?SMoJDQ&gBU`u& zNLvGfEt%BZDc19+jn0N+_H;@1#v4;q8{Ddfbb2CNwELINle+==O23o+wYX0Q6qAIJ z&U?(J!}A8bqud+%B3t5PV^1Ydfl5GXMSn<51v~7DyT>Wg({h4572#6`gCUGG&b9s| zTD#5ujJWaraJQ)1%F(FC-TAIHVyPU(B-8n?7k4Ay_``o}a;) z$}TZkE@FPLVF~^j+nQm{+GRw0HyyK%KyC{(&iM(g^mTEuW;{^f3YghxDW{0f)42=o zZf?xGjL}hN=$VXKEu_J5W`sS2KRY`c-Q79)1tckiETyQNbi?C>8Us$S<%wdhem!hu zscKBH9qMLl5C^=QDDUZZO%KLq;nnZhF?C=&0zN2}PV_#n-z`wpFJ#E7+h3@^s7|!N z#>QHWcbeHf@^Z?a35VKfSaX&u?6qu6a;=|@25?@EghMG&)Y2H$_y8Rpor?Q8bWnc< z1qFdhMT1rZkHyet!}Dq@a4Ll@kMu$y!MeGX9D&J9Un-yJKG(!FFHMt)%}bSfvMiOf zE0e%uwJC`_p&$cWBV4^I%)P>{8m$!?dyF7lmq??hnuo9TONM&1YiTsvo;-jmVBkUi zl=>A6&tHE{Wb&t{kJ9YlU@kUqaf9Tf%7IdfuW8a`N3m6orPkY}e&YA^^kCblLB^b- zyTEBPJ5Yq^D5rGWbUw16OgDMgIZ61xx?-)Rv#|Xd3SED2E&>cu7N&WeeKz)DLib!s z*O7*(OK;N97mwa%BEq;s*B!MC0)|6eo(i6WyX{t`+>80Xg`bXl3ySw|hcHfZ)DFvja^EwMog*cA(GoNB+5_M@mFXD-&YW%T)2?7WUDD+#}XD zHwOnw2b-J8_96^Xz;Ju0e~JI{i%FeAVMj21jGDAZ-A|oG#CY-S~6tYr1nR*Q%Dqna5xz2wi<|xX+_J4@@ax$uJxp}$S zE7KB%>YoYSI2q~=dOdhh$6V9RW$-|AA>EB2JCeZirE|;BzNqY((53@>ox$>wgb29& z@3ap-Y`14BVO6r_k1$Dz$oZn|&9toX*j$E=d`gj_)Ij}8>dpGaGUum3W+}!)ACd+xd=yKvW{;6K!giM_Hu2s%d-YUS*m!a`PV~tFDI%4nOzE= zTA&GnmUX|hY}e~2k)RWI4qMSLwgGdXt-!XQ`>gWhyhj9IsWL8c_*69y``3gj6Fa6< zu+qZb8mYB6I;8`gc_O&Cj=>XA^@9d(P4By?a_|-`HBIdBql*~Dr$qDsdyMl3FoGBl zgor7OJRe!!nrEd?{?w6Quj+iFk`Bn zf4h}Ex4aIF3>`;~F09aTk{c3|bT^^r(=ejI`UH4Ndo_&*#+th-6rNMsdc(zGIRBS2 zgX<;Xw8_=Z>4_B_3dO4W3zX7~Xc{P_#mf}n?6tqnk!Vy;pE@VIJ+mh|ux)|EqfYw2 z5js>rV-7T|uykK|BnUp0-Mq%x=2FABiEu^h_km1c`ICzovg{J}q({s6Q|E{rrF#Sh z4?O%c`>xTsGRX?p%&x@$MghMw2Um<0{Q8VUYLzeUFFWs{kdZzMU&(0~RuWf9^#l%#Q_!0^1+`VlOi8)|Uf=-AqlM~d3 zr$8kH_04fOT;P~~e|EnY2k7dnoB7z<^ss@uz-Uu$xeGc4kM<7D){{s}>Y&%rUQNhK z1Rc0h0NXYm7`*L#yG;S75z~L@wL18xHW(O46eA%++GpO*|TJ$0eK*|c2ggVr8 z@&(Ph#W z_L8w~VAr@xzLmABUr9@c%E0l-eLz~4ct_qaGA?cKyqAZyrv6`+p8K}L+Hj~X+qWZ-gua4q6JYuJ0%F?s*=TCbzDue{1N#+o=f+5@@|$g>{t)>E3jFP$9?Qr65-E@huPw&9oxTOX-z4!WT`;SH|-TZVlG|N54aN%eLRBNg+V}Gzs8m_Dz;% Lwil?sd))djhTkWo diff --git a/tests/integration/stax/snapshots/test_blindsign_valid/info.png b/tests/integration/stax/snapshots/test_blindsign_valid/info.png index 8b571da7e1d27d7ef4ac01871b389c44e2258784..9be5755ffb991fa29c3112414c984433657b0959 100644 GIT binary patch literal 9777 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 G)c*ot6)%?n diff --git a/tests/integration/stax/snapshots/test_expert_mode_rejections/enabled_expert_mode.png b/tests/integration/stax/snapshots/test_expert_mode_rejections/enabled_expert_mode.png index 9bb9098130f449907246ec5afd48ec1f3915403f..c9ef229fa7be8fd071a271ce31ba27c48213c36b 100644 GIT binary patch literal 5065 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 Zc|82`(!0{lz=+P|%;}I*jVEFY{tAkTu;%~( literal 8077 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 HP}e0w?SMoJDQ&gBU`u& zNLvGfEt%BZDc19+jn0N+_H;@1#v4;q8{Ddfbb2CNwELINle+==O23o+wYX0Q6qAIJ z&U?(J!}A8bqud+%B3t5PV^1Ydfl5GXMSn<51v~7DyT>Wg({h4572#6`gCUGG&b9s| zTD#5ujJWaraJQ)1%F(FC-TAIHVyPU(B-8n?7k4Ay_``o}a;) z$}TZkE@FPLVF~^j+nQm{+GRw0HyyK%KyC{(&iM(g^mTEuW;{^f3YghxDW{0f)42=o zZf?xGjL}hN=$VXKEu_J5W`sS2KRY`c-Q79)1tckiETyQNbi?C>8Us$S<%wdhem!hu zscKBH9qMLl5C^=QDDUZZO%KLq;nnZhF?C=&0zN2}PV_#n-z`wpFJ#E7+h3@^s7|!N z#>QHWcbeHf@^Z?a35VKfSaX&u?6qu6a;=|@25?@EghMG&)Y2H$_y8Rpor?Q8bWnc< z1qFdhMT1rZkHyet!}Dq@a4Ll@kMu$y!MeGX9D&J9Un-yJKG(!FFHMt)%}bSfvMiOf zE0e%uwJC`_p&$cWBV4^I%)P>{8m$!?dyF7lmq??hnuo9TONM&1YiTsvo;-jmVBkUi zl=>A6&tHE{Wb&t{kJ9YlU@kUqaf9Tf%7IdfuW8a`N3m6orPkY}e&YA^^kCblLB^b- zyTEBPJ5Yq^D5rGWbUw16OgDMgIZ61xx?-)Rv#|Xd3SED2E&>cu7N&WeeKz)DLib!s z*O7*(OK;N97mwa%BEq;s*B!MC0)|6eo(i6WyX{t`+>80Xg`bXl3ySw|hcHfZ)DFvja^EwMog*cA(GoNB+5_M@mFXD-&YW%T)2?7WUDD+#}XD zHwOnw2b-J8_96^Xz;Ju0e~JI{i%FeAVMj21jGDAZ-A|oG#CY-S~6tYr1nR*Q%Dqna5xz2wi<|xX+_J4@@ax$uJxp}$S zE7KB%>YoYSI2q~=dOdhh$6V9RW$-|AA>EB2JCeZirE|;BzNqY((53@>ox$>wgb29& z@3ap-Y`14BVO6r_k1$Dz$oZn|&9toX*j$E=d`gj_)Ij}8>dpGaGUum3W+}!)ACd+xd=yKvW{;6K!giM_Hu2s%d-YUS*m!a`PV~tFDI%4nOzE= zTA&GnmUX|hY}e~2k)RWI4qMSLwgGdXt-!XQ`>gWhyhj9IsWL8c_*69y``3gj6Fa6< zu+qZb8mYB6I;8`gc_O&Cj=>XA^@9d(P4By?a_|-`HBIdBql*~Dr$qDsdyMl3FoGBl zgor7OJRe!!nrEd?{?w6Quj+iFk`Bn zf4h}Ex4aIF3>`;~F09aTk{c3|bT^^r(=ejI`UH4Ndo_&*#+th-6rNMsdc(zGIRBS2 zgX<;Xw8_=Z>4_B_3dO4W3zX7~Xc{P_#mf}n?6tqnk!Vy;pE@VIJ+mh|ux)|EqfYw2 z5js>rV-7T|uykK|BnUp0-Mq%x=2FABiEu^h_km1c`ICzovg{J}q({s6Q|E{rrF#Sh z4?O%c`>xTsGRX?p%&x@$MghMw2Um<0{Q8VUYLzeUFFWs{kdZzMU&(0~RuWf9^#l%#Q_!0^1+`VlOi8)|Uf=-AqlM~d3 zr$8kH_04fOT;P~~e|EnY2k7dnoB7z<^ss@uz-Uu$xeGc4kM<7D){{s}>Y&%rUQNhK z1Rc0h0NXYm7`*L#yG;S75z~L@wL18xHW(O46eA%++GpO*|TJ$0eK*|c2ggVr8 z@&(Ph#W z_L8w~VAr@xzLmABUr9@c%E0l-eLz~4ct_qaGA?cKyqAZyrv6`+p8K}L+Hj~X+qWZ-gua4q6JYuJ0%F?s*=TCbzDue{1N#+o=f+5@@|$g>{t)>E3jFP$9?Qr65-E@huPw&9oxTOX-z4!WT`;SH|-TZVlG|N54aN%eLRBNg+V}Gzs8m_Dz;% Lwil?sd))djhTkWo diff --git a/tests/integration/stax/snapshots/test_expert_mode_rejections/info.png b/tests/integration/stax/snapshots/test_expert_mode_rejections/info.png deleted file mode 100644 index 8b571da7e1d27d7ef4ac01871b389c44e2258784..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9890 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 G)c*ot6)%?n diff --git a/tests/integration/stax/snapshots/test_expert_mode_rejections/settings_expert_blindsiging_off.png b/tests/integration/stax/snapshots/test_expert_mode_rejections/settings_expert_blindsiging_off.png deleted file mode 100644 index 9375185102e260e6f784ba7125f0626dd3fbb8b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12528 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 diff --git a/tests/integration/stax/snapshots/test_parsing_errors/enabled_expert_mode.png b/tests/integration/stax/snapshots/test_parsing_errors/enabled_expert_mode.png index 9bb9098130f449907246ec5afd48ec1f3915403f..c9ef229fa7be8fd071a271ce31ba27c48213c36b 100644 GIT binary patch literal 5065 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 Zc|82`(!0{lz=+P|%;}I*jVEFY{tAkTu;%~( literal 8077 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 HP}e0w?SMoJDQ&gBU`u& zNLvGfEt%BZDc19+jn0N+_H;@1#v4;q8{Ddfbb2CNwELINle+==O23o+wYX0Q6qAIJ z&U?(J!}A8bqud+%B3t5PV^1Ydfl5GXMSn<51v~7DyT>Wg({h4572#6`gCUGG&b9s| zTD#5ujJWaraJQ)1%F(FC-TAIHVyPU(B-8n?7k4Ay_``o}a;) z$}TZkE@FPLVF~^j+nQm{+GRw0HyyK%KyC{(&iM(g^mTEuW;{^f3YghxDW{0f)42=o zZf?xGjL}hN=$VXKEu_J5W`sS2KRY`c-Q79)1tckiETyQNbi?C>8Us$S<%wdhem!hu zscKBH9qMLl5C^=QDDUZZO%KLq;nnZhF?C=&0zN2}PV_#n-z`wpFJ#E7+h3@^s7|!N z#>QHWcbeHf@^Z?a35VKfSaX&u?6qu6a;=|@25?@EghMG&)Y2H$_y8Rpor?Q8bWnc< z1qFdhMT1rZkHyet!}Dq@a4Ll@kMu$y!MeGX9D&J9Un-yJKG(!FFHMt)%}bSfvMiOf zE0e%uwJC`_p&$cWBV4^I%)P>{8m$!?dyF7lmq??hnuo9TONM&1YiTsvo;-jmVBkUi zl=>A6&tHE{Wb&t{kJ9YlU@kUqaf9Tf%7IdfuW8a`N3m6orPkY}e&YA^^kCblLB^b- zyTEBPJ5Yq^D5rGWbUw16OgDMgIZ61xx?-)Rv#|Xd3SED2E&>cu7N&WeeKz)DLib!s z*O7*(OK;N97mwa%BEq;s*B!MC0)|6eo(i6WyX{t`+>80Xg`bXl3ySw|hcHfZ)DFvja^EwMog*cA(GoNB+5_M@mFXD-&YW%T)2?7WUDD+#}XD zHwOnw2b-J8_96^Xz;Ju0e~JI{i%FeAVMj21jGDAZ-A|oG#CY-S~6tYr1nR*Q%Dqna5xz2wi<|xX+_J4@@ax$uJxp}$S zE7KB%>YoYSI2q~=dOdhh$6V9RW$-|AA>EB2JCeZirE|;BzNqY((53@>ox$>wgb29& z@3ap-Y`14BVO6r_k1$Dz$oZn|&9toX*j$E=d`gj_)Ij}8>dpGaGUum3W+}!)ACd+xd=yKvW{;6K!giM_Hu2s%d-YUS*m!a`PV~tFDI%4nOzE= zTA&GnmUX|hY}e~2k)RWI4qMSLwgGdXt-!XQ`>gWhyhj9IsWL8c_*69y``3gj6Fa6< zu+qZb8mYB6I;8`gc_O&Cj=>XA^@9d(P4By?a_|-`HBIdBql*~Dr$qDsdyMl3FoGBl zgor7OJRe!!nrEd?{?w6Quj+iFk`Bn zf4h}Ex4aIF3>`;~F09aTk{c3|bT^^r(=ejI`UH4Ndo_&*#+th-6rNMsdc(zGIRBS2 zgX<;Xw8_=Z>4_B_3dO4W3zX7~Xc{P_#mf}n?6tqnk!Vy;pE@VIJ+mh|ux)|EqfYw2 z5js>rV-7T|uykK|BnUp0-Mq%x=2FABiEu^h_km1c`ICzovg{J}q({s6Q|E{rrF#Sh z4?O%c`>xTsGRX?p%&x@$MghMw2Um<0{Q8VUYLzeUFFWs{kdZzMU&(0~RuWf9^#l%#Q_!0^1+`VlOi8)|Uf=-AqlM~d3 zr$8kH_04fOT;P~~e|EnY2k7dnoB7z<^ss@uz-Uu$xeGc4kM<7D){{s}>Y&%rUQNhK z1Rc0h0NXYm7`*L#yG;S75z~L@wL18xHW(O46eA%++GpO*|TJ$0eK*|c2ggVr8 z@&(Ph#W z_L8w~VAr@xzLmABUr9@c%E0l-eLz~4ct_qaGA?cKyqAZyrv6`+p8K}L+Hj~X+qWZ-gua4q6JYuJ0%F?s*=TCbzDue{1N#+o=f+5@@|$g>{t)>E3jFP$9?Qr65-E@huPw&9oxTOX-z4!WT`;SH|-TZVlG|N54aN%eLRBNg+V}Gzs8m_Dz;% Lwil?sd))djhTkWo diff --git a/tests/integration/stax/snapshots/test_sign_execute_outbox_messages/enabled_expert_mode.png b/tests/integration/stax/snapshots/test_sign_execute_outbox_messages/enabled_expert_mode.png index 9bb9098130f449907246ec5afd48ec1f3915403f..c9ef229fa7be8fd071a271ce31ba27c48213c36b 100644 GIT binary patch literal 5065 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 Zc|82`(!0{lz=+P|%;}I*jVEFY{tAkTu;%~( literal 8077 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 HP}e0w?SMoJDQ&gBU`u& zNLvGfEt%BZDc19+jn0N+_H;@1#v4;q8{Ddfbb2CNwELINle+==O23o+wYX0Q6qAIJ z&U?(J!}A8bqud+%B3t5PV^1Ydfl5GXMSn<51v~7DyT>Wg({h4572#6`gCUGG&b9s| zTD#5ujJWaraJQ)1%F(FC-TAIHVyPU(B-8n?7k4Ay_``o}a;) z$}TZkE@FPLVF~^j+nQm{+GRw0HyyK%KyC{(&iM(g^mTEuW;{^f3YghxDW{0f)42=o zZf?xGjL}hN=$VXKEu_J5W`sS2KRY`c-Q79)1tckiETyQNbi?C>8Us$S<%wdhem!hu zscKBH9qMLl5C^=QDDUZZO%KLq;nnZhF?C=&0zN2}PV_#n-z`wpFJ#E7+h3@^s7|!N z#>QHWcbeHf@^Z?a35VKfSaX&u?6qu6a;=|@25?@EghMG&)Y2H$_y8Rpor?Q8bWnc< z1qFdhMT1rZkHyet!}Dq@a4Ll@kMu$y!MeGX9D&J9Un-yJKG(!FFHMt)%}bSfvMiOf zE0e%uwJC`_p&$cWBV4^I%)P>{8m$!?dyF7lmq??hnuo9TONM&1YiTsvo;-jmVBkUi zl=>A6&tHE{Wb&t{kJ9YlU@kUqaf9Tf%7IdfuW8a`N3m6orPkY}e&YA^^kCblLB^b- zyTEBPJ5Yq^D5rGWbUw16OgDMgIZ61xx?-)Rv#|Xd3SED2E&>cu7N&WeeKz)DLib!s z*O7*(OK;N97mwa%BEq;s*B!MC0)|6eo(i6WyX{t`+>80Xg`bXl3ySw|hcHfZ)DFvja^EwMog*cA(GoNB+5_M@mFXD-&YW%T)2?7WUDD+#}XD zHwOnw2b-J8_96^Xz;Ju0e~JI{i%FeAVMj21jGDAZ-A|oG#CY-S~6tYr1nR*Q%Dqna5xz2wi<|xX+_J4@@ax$uJxp}$S zE7KB%>YoYSI2q~=dOdhh$6V9RW$-|AA>EB2JCeZirE|;BzNqY((53@>ox$>wgb29& z@3ap-Y`14BVO6r_k1$Dz$oZn|&9toX*j$E=d`gj_)Ij}8>dpGaGUum3W+}!)ACd+xd=yKvW{;6K!giM_Hu2s%d-YUS*m!a`PV~tFDI%4nOzE= zTA&GnmUX|hY}e~2k)RWI4qMSLwgGdXt-!XQ`>gWhyhj9IsWL8c_*69y``3gj6Fa6< zu+qZb8mYB6I;8`gc_O&Cj=>XA^@9d(P4By?a_|-`HBIdBql*~Dr$qDsdyMl3FoGBl zgor7OJRe!!nrEd?{?w6Quj+iFk`Bn zf4h}Ex4aIF3>`;~F09aTk{c3|bT^^r(=ejI`UH4Ndo_&*#+th-6rNMsdc(zGIRBS2 zgX<;Xw8_=Z>4_B_3dO4W3zX7~Xc{P_#mf}n?6tqnk!Vy;pE@VIJ+mh|ux)|EqfYw2 z5js>rV-7T|uykK|BnUp0-Mq%x=2FABiEu^h_km1c`ICzovg{J}q({s6Q|E{rrF#Sh z4?O%c`>xTsGRX?p%&x@$MghMw2Um<0{Q8VUYLzeUFFWs{kdZzMU&(0~RuWf9^#l%#Q_!0^1+`VlOi8)|Uf=-AqlM~d3 zr$8kH_04fOT;P~~e|EnY2k7dnoB7z<^ss@uz-Uu$xeGc4kM<7D){{s}>Y&%rUQNhK z1Rc0h0NXYm7`*L#yG;S75z~L@wL18xHW(O46eA%++GpO*|TJ$0eK*|c2ggVr8 z@&(Ph#W z_L8w~VAr@xzLmABUr9@c%E0l-eLz~4ct_qaGA?cKyqAZyrv6`+p8K}L+Hj~X+qWZ-gua4q6JYuJ0%F?s*=TCbzDue{1N#+o=f+5@@|$g>{t)>E3jFP$9?Qr65-E@huPw&9oxTOX-z4!WT`;SH|-TZVlG|N54aN%eLRBNg+V}Gzs8m_Dz;% Lwil?sd))djhTkWo diff --git a/tests/integration/stax/snapshots/test_sign_transfer/enabled_expert_mode.png b/tests/integration/stax/snapshots/test_sign_transfer/enabled_expert_mode.png index 9bb9098130f449907246ec5afd48ec1f3915403f..c9ef229fa7be8fd071a271ce31ba27c48213c36b 100644 GIT binary patch literal 5065 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 Zc|82`(!0{lz=+P|%;}I*jVEFY{tAkTu;%~( literal 8077 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 HP}e0w?SMoJDQ&gBU`u& zNLvGfEt%BZDc19+jn0N+_H;@1#v4;q8{Ddfbb2CNwELINle+==O23o+wYX0Q6qAIJ z&U?(J!}A8bqud+%B3t5PV^1Ydfl5GXMSn<51v~7DyT>Wg({h4572#6`gCUGG&b9s| zTD#5ujJWaraJQ)1%F(FC-TAIHVyPU(B-8n?7k4Ay_``o}a;) z$}TZkE@FPLVF~^j+nQm{+GRw0HyyK%KyC{(&iM(g^mTEuW;{^f3YghxDW{0f)42=o zZf?xGjL}hN=$VXKEu_J5W`sS2KRY`c-Q79)1tckiETyQNbi?C>8Us$S<%wdhem!hu zscKBH9qMLl5C^=QDDUZZO%KLq;nnZhF?C=&0zN2}PV_#n-z`wpFJ#E7+h3@^s7|!N z#>QHWcbeHf@^Z?a35VKfSaX&u?6qu6a;=|@25?@EghMG&)Y2H$_y8Rpor?Q8bWnc< z1qFdhMT1rZkHyet!}Dq@a4Ll@kMu$y!MeGX9D&J9Un-yJKG(!FFHMt)%}bSfvMiOf zE0e%uwJC`_p&$cWBV4^I%)P>{8m$!?dyF7lmq??hnuo9TONM&1YiTsvo;-jmVBkUi zl=>A6&tHE{Wb&t{kJ9YlU@kUqaf9Tf%7IdfuW8a`N3m6orPkY}e&YA^^kCblLB^b- zyTEBPJ5Yq^D5rGWbUw16OgDMgIZ61xx?-)Rv#|Xd3SED2E&>cu7N&WeeKz)DLib!s z*O7*(OK;N97mwa%BEq;s*B!MC0)|6eo(i6WyX{t`+>80Xg`bXl3ySw|hcHfZ)DFvja^EwMog*cA(GoNB+5_M@mFXD-&YW%T)2?7WUDD+#}XD zHwOnw2b-J8_96^Xz;Ju0e~JI{i%FeAVMj21jGDAZ-A|oG#CY-S~6tYr1nR*Q%Dqna5xz2wi<|xX+_J4@@ax$uJxp}$S zE7KB%>YoYSI2q~=dOdhh$6V9RW$-|AA>EB2JCeZirE|;BzNqY((53@>ox$>wgb29& z@3ap-Y`14BVO6r_k1$Dz$oZn|&9toX*j$E=d`gj_)Ij}8>dpGaGUum3W+}!)ACd+xd=yKvW{;6K!giM_Hu2s%d-YUS*m!a`PV~tFDI%4nOzE= zTA&GnmUX|hY}e~2k)RWI4qMSLwgGdXt-!XQ`>gWhyhj9IsWL8c_*69y``3gj6Fa6< zu+qZb8mYB6I;8`gc_O&Cj=>XA^@9d(P4By?a_|-`HBIdBql*~Dr$qDsdyMl3FoGBl zgor7OJRe!!nrEd?{?w6Quj+iFk`Bn zf4h}Ex4aIF3>`;~F09aTk{c3|bT^^r(=ejI`UH4Ndo_&*#+th-6rNMsdc(zGIRBS2 zgX<;Xw8_=Z>4_B_3dO4W3zX7~Xc{P_#mf}n?6tqnk!Vy;pE@VIJ+mh|ux)|EqfYw2 z5js>rV-7T|uykK|BnUp0-Mq%x=2FABiEu^h_km1c`ICzovg{J}q({s6Q|E{rrF#Sh z4?O%c`>xTsGRX?p%&x@$MghMw2Um<0{Q8VUYLzeUFFWs{kdZzMU&(0~RuWf9^#l%#Q_!0^1+`VlOi8)|Uf=-AqlM~d3 zr$8kH_04fOT;P~~e|EnY2k7dnoB7z<^ss@uz-Uu$xeGc4kM<7D){{s}>Y&%rUQNhK z1Rc0h0NXYm7`*L#yG;S75z~L@wL18xHW(O46eA%++GpO*|TJ$0eK*|c2ggVr8 z@&(Ph#W z_L8w~VAr@xzLmABUr9@c%E0l-eLz~4ct_qaGA?cKyqAZyrv6`+p8K}L+Hj~X+qWZ-gua4q6JYuJ0%F?s*=TCbzDue{1N#+o=f+5@@|$g>{t)>E3jFP$9?Qr65-E@huPw&9oxTOX-z4!WT`;SH|-TZVlG|N54aN%eLRBNg+V}Gzs8m_Dz;% Lwil?sd))djhTkWo diff --git a/tests/integration/stax/snapshots/test_sign_transfer_without_hash/enabled_expert_mode.png b/tests/integration/stax/snapshots/test_sign_transfer_without_hash/enabled_expert_mode.png index 9bb9098130f449907246ec5afd48ec1f3915403f..c9ef229fa7be8fd071a271ce31ba27c48213c36b 100644 GIT binary patch literal 5065 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 Zc|82`(!0{lz=+P|%;}I*jVEFY{tAkTu;%~( literal 8077 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 HP}e0w?SMoJDQ&gBU`u& zNLvGfEt%BZDc19+jn0N+_H;@1#v4;q8{Ddfbb2CNwELINle+==O23o+wYX0Q6qAIJ z&U?(J!}A8bqud+%B3t5PV^1Ydfl5GXMSn<51v~7DyT>Wg({h4572#6`gCUGG&b9s| zTD#5ujJWaraJQ)1%F(FC-TAIHVyPU(B-8n?7k4Ay_``o}a;) z$}TZkE@FPLVF~^j+nQm{+GRw0HyyK%KyC{(&iM(g^mTEuW;{^f3YghxDW{0f)42=o zZf?xGjL}hN=$VXKEu_J5W`sS2KRY`c-Q79)1tckiETyQNbi?C>8Us$S<%wdhem!hu zscKBH9qMLl5C^=QDDUZZO%KLq;nnZhF?C=&0zN2}PV_#n-z`wpFJ#E7+h3@^s7|!N z#>QHWcbeHf@^Z?a35VKfSaX&u?6qu6a;=|@25?@EghMG&)Y2H$_y8Rpor?Q8bWnc< z1qFdhMT1rZkHyet!}Dq@a4Ll@kMu$y!MeGX9D&J9Un-yJKG(!FFHMt)%}bSfvMiOf zE0e%uwJC`_p&$cWBV4^I%)P>{8m$!?dyF7lmq??hnuo9TONM&1YiTsvo;-jmVBkUi zl=>A6&tHE{Wb&t{kJ9YlU@kUqaf9Tf%7IdfuW8a`N3m6orPkY}e&YA^^kCblLB^b- zyTEBPJ5Yq^D5rGWbUw16OgDMgIZ61xx?-)Rv#|Xd3SED2E&>cu7N&WeeKz)DLib!s z*O7*(OK;N97mwa%BEq;s*B!MC0)|6eo(i6WyX{t`+>80Xg`bXl3ySw|hcHfZ)DFvja^EwMog*cA(GoNB+5_M@mFXD-&YW%T)2?7WUDD+#}XD zHwOnw2b-J8_96^Xz;Ju0e~JI{i%FeAVMj21jGDAZ-A|oG#CY-S~6tYr1nR*Q%Dqna5xz2wi<|xX+_J4@@ax$uJxp}$S zE7KB%>YoYSI2q~=dOdhh$6V9RW$-|AA>EB2JCeZirE|;BzNqY((53@>ox$>wgb29& z@3ap-Y`14BVO6r_k1$Dz$oZn|&9toX*j$E=d`gj_)Ij}8>dpGaGUum3W+}!)ACd+xd=yKvW{;6K!giM_Hu2s%d-YUS*m!a`PV~tFDI%4nOzE= zTA&GnmUX|hY}e~2k)RWI4qMSLwgGdXt-!XQ`>gWhyhj9IsWL8c_*69y``3gj6Fa6< zu+qZb8mYB6I;8`gc_O&Cj=>XA^@9d(P4By?a_|-`HBIdBql*~Dr$qDsdyMl3FoGBl zgor7OJRe!!nrEd?{?w6Quj+iFk`Bn zf4h}Ex4aIF3>`;~F09aTk{c3|bT^^r(=ejI`UH4Ndo_&*#+th-6rNMsdc(zGIRBS2 zgX<;Xw8_=Z>4_B_3dO4W3zX7~Xc{P_#mf}n?6tqnk!Vy;pE@VIJ+mh|ux)|EqfYw2 z5js>rV-7T|uykK|BnUp0-Mq%x=2FABiEu^h_km1c`ICzovg{J}q({s6Q|E{rrF#Sh z4?O%c`>xTsGRX?p%&x@$MghMw2Um<0{Q8VUYLzeUFFWs{kdZzMU&(0~RuWf9^#l%#Q_!0^1+`VlOi8)|Uf=-AqlM~d3 zr$8kH_04fOT;P~~e|EnY2k7dnoB7z<^ss@uz-Uu$xeGc4kM<7D){{s}>Y&%rUQNhK z1Rc0h0NXYm7`*L#yG;S75z~L@wL18xHW(O46eA%++GpO*|TJ$0eK*|c2ggVr8 z@&(Ph#W z_L8w~VAr@xzLmABUr9@c%E0l-eLz~4ct_qaGA?cKyqAZyrv6`+p8K}L+Hj~X+qWZ-gua4q6JYuJ0%F?s*=TCbzDue{1N#+o=f+5@@|$g>{t)>E3jFP$9?Qr65-E@huPw&9oxTOX-z4!WT`;SH|-TZVlG|N54aN%eLRBNg+V}Gzs8m_Dz;% Lwil?sd))djhTkWo diff --git a/tests/integration/stax/test_blindsign_too_deep_rejections.py b/tests/integration/stax/test_blindsign_too_deep_rejections.py index da3fab769..2b1517700 100755 --- a/tests/integration/stax/test_blindsign_too_deep_rejections.py +++ b/tests/integration/stax/test_blindsign_too_deep_rejections.py @@ -57,18 +57,6 @@ def toggle_expert_mode(): app.review.tap() verify_err_reject_response(app, "too_deep_blindsign_notify") - - # Rejecting at blindsigning enabled screen (blindsign disabled) - toggle_blindsigning() # Disable blindsigning at home - send_initialize_msg(app, "800f000011048000002c800006c18000000080000000") - send_payload(app, "800f0100eb0502000000f702000000f202000000ed02000000e802000000e302000000de02000000d902000000d402000000cf02000000ca02000000c502000000c002000000bb02000000b602000000b102000000ac02000000a702000000a2020000009d02000000980200000093020000008e02000000890200000084020000007f020000007a02000000750200000070020000006b02000000660200000061020000005c02000000570200000052020000004d02000000480200000043020000003e02000000390200000034020000002f020000002a02000000250200000020020000001b020000001602000000") - app.review.tap() - app.assert_screen("too_deep_expression") - app.review.tap() - app.assert_screen("too_deep_enable_blindsign") - app.choice.confirm() - verify_err_reject_response(app, "blindsign_enabled") - # Rejecting at blindsigning splash screen toggle_blindsigning() # Disable blindsigning at home app.settings_toggle_blindsigning() diff --git a/tests/integration/stax/test_expert_mode_rejections.py b/tests/integration/stax/test_expert_mode_rejections.py index ee58efac2..df6c86225 100644 --- a/tests/integration/stax/test_expert_mode_rejections.py +++ b/tests/integration/stax/test_expert_mode_rejections.py @@ -43,24 +43,7 @@ def sign_transfer_initialize(app): app.review.tap() verify_reject_response(app,"enable_expert_mode") - # Reject from enabled expert mode - sign_transfer_initialize(app) - app.review.tap() - app.assert_screen("enable_expert_mode") - app.welcome.client.finger_touch(BUTTON_ABOVE_LOWER_MIDDLE.x, BUTTON_ABOVE_LOWER_MIDDLE.y) - verify_reject_response(app, "enabled_expert_mode") - - #- Reject from expert mode splash screen - - # In previous test, expert mode was enabled, disable it here. - app.welcome.info() - app.assert_screen(SCREEN_INFO_PAGE) - app.info.next() - app.assert_screen("settings_expert_on_blindsigning_off") - app.settings_toggle_expert_mode() - app.assert_screen("settings_expert_blindsiging_off") - app.info.multi_page_exit() - + # Reject from expert mode splash sign_transfer_initialize(app) app.review.tap() app.enable_expert_mode() From fd3f1ec72583bfd19d3eded0faa85beff50c3a83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Mon, 12 Feb 2024 15:11:40 +0100 Subject: [PATCH 04/38] Docker: fix ledger app-builder version to 3.14.0 --- .github/workflows/build.yml | 2 +- Makefile | 4 ++-- scripts/test_swap.sh | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2aa900c70..0b09579b7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,7 +21,7 @@ jobs: device: [nanos, nanosp, nanox, stax] runs-on: ubuntu-latest container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-dev-tools:latest + image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-dev-tools:3.14.0 steps: - name: Checkout uses: actions/checkout@v3 diff --git a/Makefile b/Makefile index fc1ca058d..889e35b14 100644 --- a/Makefile +++ b/Makefile @@ -25,8 +25,8 @@ docker_speculos: $(DOCKER) image tag $(LEDGERHQ)/speculos speculos docker_ledger_app_builder: - $(DOCKER) pull $(LEDGERHQ)/ledger-app-builder/ledger-app-dev-tools:latest - $(DOCKER) image tag $(LEDGERHQ)/ledger-app-builder/ledger-app-dev-tools:latest \ + $(DOCKER) pull $(LEDGERHQ)/ledger-app-builder/ledger-app-dev-tools:3.14.0 + $(DOCKER) image tag $(LEDGERHQ)/ledger-app-builder/ledger-app-dev-tools:3.14.0 \ ledger-app-builder docker_ledger_app_ocaml: diff --git a/scripts/test_swap.sh b/scripts/test_swap.sh index 56a99d2ed..c9937b4f9 100755 --- a/scripts/test_swap.sh +++ b/scripts/test_swap.sh @@ -104,8 +104,7 @@ _build_app() { ( cd $repo - docker run --rm -ti -v "$(realpath .):/app" --privileged \ - ghcr.io/ledgerhq/ledger-app-builder/ledger-app-dev-tools:latest \ + docker run --rm -ti -v "$(realpath .):/app" --privileged ledger-app-builder:latest \ bash -c "make clean && make -j $params BOLOS_SDK=\$$sdk" ) } From 101ae3bd568942256c948d8d652e15f1183ad84e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Tue, 13 Feb 2024 11:03:58 +0100 Subject: [PATCH 05/38] Style: name parameters in function prototype [misra-c2012-8.2] Function types shall be in prototype form with named parameters --- app/src/apdu.h | 2 +- app/src/apdu_pubkey.c | 5 +++-- app/src/apdu_sign.c | 14 +++++++------- app/src/keys.c | 7 ++++--- app/src/keys.h | 15 +++++++++------ app/src/parser/formatting.c | 7 ++++--- app/src/parser/formatting.h | 21 +++++++++++---------- app/src/parser/micheline_parser.c | 14 +++++++------- app/src/parser/micheline_parser.h | 4 ++-- app/src/parser/num_parser.h | 20 +++++++++++--------- app/src/parser/operation_parser.c | 6 +++--- app/src/parser/operation_parser.h | 7 ++++--- app/src/parser/parser_state.h | 22 ++++++++++++---------- app/src/ui_home.c | 2 +- app/src/ui_settings.c | 2 +- app/src/ui_settings.h | 2 +- app/src/ui_stream.c | 9 +++++---- app/src/ui_stream.h | 20 ++++++++++++-------- app/src/ui_stream_nbgl.c | 10 +++++----- app/src/ui_strings.c | 10 +++++----- app/src/ui_strings.h | 10 +++++----- 21 files changed, 113 insertions(+), 96 deletions(-) diff --git a/app/src/apdu.h b/app/src/apdu.h index 15e5e7521..5d6c85842 100644 --- a/app/src/apdu.h +++ b/app/src/apdu.h @@ -82,7 +82,7 @@ * */ -typedef void(tz_handler)(command_t *); +typedef void(tz_handler)(command_t *cmd); typedef tz_handler *tz_handler_t; tz_handler handle_unimplemented; diff --git a/app/src/apdu_pubkey.c b/app/src/apdu_pubkey.c index 0469b42f6..140d943f9 100644 --- a/app/src/apdu_pubkey.c +++ b/app/src/apdu_pubkey.c @@ -35,8 +35,9 @@ static void provide_pubkey(void); static void prompt_address(void); -static void format_pkh(cx_ecfp_public_key_t *, char *, size_t); -static void stream_cb(tz_ui_cb_type_t); +static void format_pkh(cx_ecfp_public_key_t *pubkey, char *buffer, + size_t len); +static void stream_cb(tz_ui_cb_type_t cb_type); static void provide_pubkey(void) diff --git a/app/src/apdu_sign.c b/app/src/apdu_sign.c index f9798a51f..cd54f63cc 100644 --- a/app/src/apdu_sign.c +++ b/app/src/apdu_sign.c @@ -51,16 +51,16 @@ /* Prototypes */ static void sign_packet(void); -static void send_reject(int); +static void send_reject(int error_code); static void send_continue(void); static void send_cancel(void); static void refill(void); -static void stream_cb(tz_ui_cb_type_t); -static void handle_first_apdu(command_t *); -static void handle_first_apdu_clear(command_t *); +static void stream_cb(tz_ui_cb_type_t cb_type); +static void handle_first_apdu(command_t *cmd); +static void handle_first_apdu_clear(command_t *cmd); static void init_blind_stream(void); -static void handle_data_apdu(command_t *); -static void handle_data_apdu_clear(command_t *); +static void handle_data_apdu(command_t *cmd); +static void handle_data_apdu_clear(command_t *cmd); static void handle_data_apdu_blind(void); /* Macros */ @@ -387,7 +387,7 @@ stream_cb(tz_ui_cb_type_t cb_type) #define FINAL_HASH global.keys.apdu.hash.final_hash #ifdef HAVE_BAGL static void -bs_push_next() +bs_push_next(void) { char obuf[TZ_BASE58_BUFFER_SIZE(sizeof(FINAL_HASH))]; blindsign_step_t *step = &global.keys.apdu.sign.u.blind.step; diff --git a/app/src/keys.c b/app/src/keys.c index 70c609a3e..a800aa227 100644 --- a/app/src/keys.c +++ b/app/src/keys.c @@ -33,9 +33,10 @@ #include "keys.h" #include "globals.h" -static tz_exc public_key_hash(uint8_t *, size_t, cx_ecfp_public_key_t *, - derivation_type_t, - const cx_ecfp_public_key_t *); +static tz_exc public_key_hash(uint8_t *hash_out, size_t hash_out_size, + cx_ecfp_public_key_t *compressed_out, + derivation_type_t derivation_type, + const cx_ecfp_public_key_t *public_key); static cx_curve_t derivation_type_to_cx_curve(derivation_type_t derivation_type) diff --git a/app/src/keys.h b/app/src/keys.h index c623e6b48..d9a1084fd 100644 --- a/app/src/keys.h +++ b/app/src/keys.h @@ -54,12 +54,15 @@ typedef struct { derivation_type_t derivation_type; } bip32_path_with_curve_t; -tz_exc read_bip32_path(bip32_path_t *, const uint8_t *, size_t); -tz_exc derive_pk(cx_ecfp_public_key_t *, derivation_type_t, - const bip32_path_t *); -tz_exc derive_pkh(cx_ecfp_public_key_t *, derivation_type_t, char *, size_t); -void sign(derivation_type_t, const bip32_path_t *, const uint8_t *, size_t, - uint8_t *, size_t *); +tz_exc read_bip32_path(bip32_path_t *out, const uint8_t *in, size_t in_size); +tz_exc derive_pk(cx_ecfp_public_key_t *public_key, + derivation_type_t derivation_type, + const bip32_path_t *bip32_path); +tz_exc derive_pkh(cx_ecfp_public_key_t *pubkey, + derivation_type_t derivation_type, char *buffer, + size_t len); +void sign(derivation_type_t derivation_type, const bip32_path_t *path, + const uint8_t *hash, size_t hashlen, uint8_t *sig, size_t *siglen); static inline bool check_derivation_type(derivation_type_t code) diff --git a/app/src/parser/formatting.c b/app/src/parser/formatting.c index 59ecfcfcb..e0ebe4650 100644 --- a/app/src/parser/formatting.c +++ b/app/src/parser/formatting.c @@ -288,9 +288,10 @@ struct sha256_ctx { uint8_t buf[128]; uint32_t h[8]; }; -extern void digestif_sha256_init(struct sha256_ctx *); -extern void digestif_sha256_update(struct sha256_ctx *, uint8_t *, uint32_t); -extern void digestif_sha256_finalize(struct sha256_ctx *, uint8_t *); +extern void digestif_sha256_init(struct sha256_ctx *ctx); +extern void digestif_sha256_update(struct sha256_ctx *ctx, uint8_t *data, + uint32_t size); +extern void digestif_sha256_finalize(struct sha256_ctx *ctx, uint8_t *out); static void cx_hash_sha256(uint8_t *data, size_t size, uint8_t *out, size_t size_out) { diff --git a/app/src/parser/formatting.h b/app/src/parser/formatting.h index 478209064..38d6c2275 100644 --- a/app/src/parser/formatting.h +++ b/app/src/parser/formatting.h @@ -24,7 +24,7 @@ // Tezos protocol upgrade to support new opcodes, the existing opcodes // are guaranteed to stay unchanged, so not updating does not break // security. -const char *tz_michelson_op_name(uint8_t); +const char *tz_michelson_op_name(uint8_t op_code); #define TZ_LAST_MICHELSON_OPCODE 154 // Should be kept in sync with the last protocol update, including @@ -192,13 +192,13 @@ typedef enum { // stored in little-endian order in the first `l` bytes of `n`. The // output buffer `obuf` must be at least `DECIMAL_BUFFER_SIZE(l)` // (caller responsibility). -int tz_format_decimal(const uint8_t *, size_t, char *, size_t); +int tz_format_decimal(const uint8_t *n, size_t l, char *obuf, size_t olen); #define TZ_DECIMAL_BUFFER_SIZE(_l) ((_l)*241 / 100 + 1) // Formats a data `n` of size `l` in base58 using Tezos' alphabet // order (same as Bitcoin). The output buffer `obuf` must be at least // `BASE58_BUFFER_SIZE(l)` (caller responsibility). -int tz_format_base58(const uint8_t *, size_t, char *, size_t); +int tz_format_base58(const uint8_t *n, size_t l, char *obuf, size_t olen); #define TZ_BASE58_BUFFER_SIZE(_l) ((_l)*138 / 100 + 1) // Looks up the prefix from the provided string (arg1), e.g. "B", @@ -209,8 +209,8 @@ int tz_format_base58(const uint8_t *, size_t, char *, size_t); // double-sha256 of this concatenation, and call `format_base58`. The // output buffer `obuf` must be at least `BASE58CHECK_BUFFER_SIZE(l, // prefix_len)` (caller responsibility). -int tz_format_base58check(const char *, const uint8_t *, size_t, char *, - size_t); +int tz_format_base58check(const char *prefix, const uint8_t *ibuf, + size_t ilen, char *obuf, size_t olen); #define TZ_BASE58CHECK_BUFFER_SIZE(_l, _p) \ TZ_BASE58_BUFFER_SIZE((_p) + (_l) + 4) @@ -225,13 +225,13 @@ int tz_format_base58check(const char *, const uint8_t *, size_t, char *, // tag 1: tz2(36) // tag 2: tz3(36) // tag 3: tz4(36) -int tz_format_pkh(const uint8_t *, size_t, char *, size_t); +int tz_format_pkh(const uint8_t *ibuf, size_t ilen, char *obuf, size_t olen); // size 32, o(51) -int tz_format_oph(const uint8_t *, size_t, char *, size_t); +int tz_format_oph(const uint8_t *ibuf, size_t ilen, char *obuf, size_t olen); // size 32, B(51) -int tz_format_bh(const uint8_t *, size_t, char *, size_t); +int tz_format_bh(const uint8_t *ibuf, size_t ilen, char *obuf, size_t olen); // size 22: tag(1) + data(21) // tag 0: tag(1) + pkh(20) (tz1, tz2, tz3, tz4, see format_pkh) @@ -239,11 +239,12 @@ int tz_format_bh(const uint8_t *, size_t, char *, size_t); // tag 2: txrolluph(20) + padding(1), txr1(36) // tag 3: rolluph(20) + padding(1), scr1(36) // tag 4: zkrolluph(20) + padding(1), zkr1(36) -int tz_format_address(const uint8_t *, size_t, char *, size_t); +int tz_format_address(const uint8_t *ibuf, size_t ilen, char *obuf, + size_t olen); // size 33/34/49: tag(1) + data(32/33/48) // tag 0: pk(32), edpk(54) // tag 1: pk(33), sppk(55) // tag 2: pk(33), p2pk(55) // tag 3: pk(48), BLpk(76) -int tz_format_pk(const uint8_t *, size_t, char *, size_t); +int tz_format_pk(const uint8_t *ibuf, size_t ilen, char *obuf, size_t olen); diff --git a/app/src/parser/micheline_parser.c b/app/src/parser/micheline_parser.c index 9701ef6d6..2b510745d 100644 --- a/app/src/parser/micheline_parser.c +++ b/app/src/parser/micheline_parser.c @@ -24,13 +24,13 @@ /* Prototypes */ -static tz_parser_result push_frame(tz_parser_state *, - tz_micheline_parser_step_kind); -static tz_parser_result pop_frame(tz_parser_state *); -static tz_parser_result begin_sized(tz_parser_state *); -static tz_parser_result print_escaped(tz_parser_state *, uint8_t); -static tz_parser_result parser_put(tz_parser_state *, char); -static tz_parser_result tag_selection(tz_parser_state *, uint8_t); +static tz_parser_result push_frame(tz_parser_state *state, + tz_micheline_parser_step_kind step); +static tz_parser_result pop_frame(tz_parser_state *state); +static tz_parser_result begin_sized(tz_parser_state *state); +static tz_parser_result print_escaped(tz_parser_state *state, uint8_t b); +static tz_parser_result parser_put(tz_parser_state *state, char c); +static tz_parser_result tag_selection(tz_parser_state *state, uint8_t t); #ifdef TEZOS_DEBUG const char *const tz_micheline_parser_step_name[] diff --git a/app/src/parser/micheline_parser.h b/app/src/parser/micheline_parser.h index 9d5b28f6c..d331dcfeb 100644 --- a/app/src/parser/micheline_parser.h +++ b/app/src/parser/micheline_parser.h @@ -18,5 +18,5 @@ #include "parser_state.h" -void tz_micheline_parser_init(tz_parser_state *); -tz_parser_result tz_micheline_parser_step(tz_parser_state *); +void tz_micheline_parser_init(tz_parser_state *state); +tz_parser_result tz_micheline_parser_step(tz_parser_state *state); diff --git a/app/src/parser/num_parser.h b/app/src/parser/num_parser.h index a5182211a..d46bf3124 100644 --- a/app/src/parser/num_parser.h +++ b/app/src/parser/num_parser.h @@ -19,12 +19,14 @@ #include "parser_state.h" -void tz_parse_num_state_init(tz_num_parser_buffer *, tz_num_parser_regs *); -tz_parser_result tz_parse_num_step(tz_num_parser_buffer *, - tz_num_parser_regs *, uint8_t, bool); -tz_parser_result tz_parse_int_step(tz_num_parser_buffer *, - tz_num_parser_regs *, uint8_t); -tz_parser_result tz_parse_nat_step(tz_num_parser_buffer *, - tz_num_parser_regs *, uint8_t); - -bool tz_string_to_mutez(const char *, uint64_t *); +void tz_parse_num_state_init(tz_num_parser_buffer *buffers, + tz_num_parser_regs *regs); +tz_parser_result tz_parse_num_step(tz_num_parser_buffer *buffers, + tz_num_parser_regs *regs, uint8_t b, + bool natural); +tz_parser_result tz_parse_int_step(tz_num_parser_buffer *buffers, + tz_num_parser_regs *regs, uint8_t b); +tz_parser_result tz_parse_nat_step(tz_num_parser_buffer *buffers, + tz_num_parser_regs *regs, uint8_t b); + +bool tz_string_to_mutez(const char *in, uint64_t *out); diff --git a/app/src/parser/operation_parser.c b/app/src/parser/operation_parser.c index 91c7d72f8..d239c0f2e 100644 --- a/app/src/parser/operation_parser.c +++ b/app/src/parser/operation_parser.c @@ -22,9 +22,9 @@ /* Prototypes */ -static tz_parser_result push_frame(tz_parser_state *, - tz_operation_parser_step_kind); -static tz_parser_result pop_frame(tz_parser_state *); +static tz_parser_result push_frame(tz_parser_state *state, + tz_operation_parser_step_kind step); +static tz_parser_result pop_frame(tz_parser_state *state); #ifdef TEZOS_DEBUG const char *const tz_operation_parser_step_name[] = {"OPTION", diff --git a/app/src/parser/operation_parser.h b/app/src/parser/operation_parser.h index fb5004eb1..25457a0a5 100644 --- a/app/src/parser/operation_parser.h +++ b/app/src/parser/operation_parser.h @@ -19,6 +19,7 @@ #include "parser_state.h" #define TZ_UNKNOWN_SIZE 0xFFFF -void tz_operation_parser_init(tz_parser_state *, uint16_t, bool); -void tz_operation_parser_set_size(tz_parser_state *, uint16_t); -tz_parser_result tz_operation_parser_step(tz_parser_state *); +void tz_operation_parser_init(tz_parser_state *state, uint16_t size, + bool skip_magic); +void tz_operation_parser_set_size(tz_parser_state *state, uint16_t size); +tz_parser_result tz_operation_parser_step(tz_parser_state *state); diff --git a/app/src/parser/parser_state.h b/app/src/parser/parser_state.h index 947a10fe0..ef1296a93 100644 --- a/app/src/parser/parser_state.h +++ b/app/src/parser/parser_state.h @@ -64,7 +64,7 @@ typedef enum { #define TZ_IS_BLOCKED(code) (code >= 100) #define TZ_IS_ERR(code) (code >= 200) -const char *tz_parser_result_name(tz_parser_result); +const char *tz_parser_result_name(tz_parser_result code); typedef struct { tz_parser_regs regs; @@ -87,19 +87,21 @@ typedef struct { tz_operation_state operation; } tz_parser_state; -void tz_parser_init(tz_parser_state *); -void tz_parser_flush(tz_parser_state *, char *, size_t); -void tz_parser_flush_up_to(tz_parser_state *, char *, size_t, size_t); -void tz_parser_refill(tz_parser_state *, uint8_t *, size_t); -void tz_parser_skip(tz_parser_state *); +void tz_parser_init(tz_parser_state *state); +void tz_parser_flush(tz_parser_state *state, char *obuf, size_t olen); +void tz_parser_flush_up_to(tz_parser_state *state, char *obuf, size_t olen, + size_t up_to); +void tz_parser_refill(tz_parser_state *state, uint8_t *ibuf, size_t ilen); +void tz_parser_skip(tz_parser_state *state); -tz_parser_result tz_parser_put(tz_parser_state *, char); -tz_parser_result tz_parser_read(tz_parser_state *, uint8_t *); -tz_parser_result tz_parser_peek(tz_parser_state *, uint8_t *); +tz_parser_result tz_parser_put(tz_parser_state *state, char c); +tz_parser_result tz_parser_read(tz_parser_state *state, uint8_t *out); +tz_parser_result tz_parser_peek(tz_parser_state *state, uint8_t *out); // error handling utils -tz_parser_result tz_parser_set_errno(tz_parser_state *, tz_parser_result); +tz_parser_result tz_parser_set_errno(tz_parser_state *state, + tz_parser_result code); #ifdef TEZOS_DEBUG #define tz_return(e) \ do { \ diff --git a/app/src/ui_home.c b/app/src/ui_home.c index 43c375386..0b3d60240 100644 --- a/app/src/ui_home.c +++ b/app/src/ui_home.c @@ -26,7 +26,7 @@ #ifdef HAVE_BAGL /* Prototypes */ -static void cb(tz_ui_cb_type_t); +static void cb(tz_ui_cb_type_t cb_type); static void cb(tz_ui_cb_type_t cb_type) diff --git a/app/src/ui_settings.c b/app/src/ui_settings.c index d23143fc6..da613ae9a 100644 --- a/app/src/ui_settings.c +++ b/app/src/ui_settings.c @@ -21,7 +21,7 @@ #include "globals.h" -static void cb(tz_ui_cb_type_t); +static void cb(tz_ui_cb_type_t cb_type); #define EXPERT_MODE 0x01 #define BLIND_SIGNING 0x02 diff --git a/app/src/ui_settings.h b/app/src/ui_settings.h index a40fdd26e..11cab28dd 100644 --- a/app/src/ui_settings.h +++ b/app/src/ui_settings.h @@ -7,4 +7,4 @@ #define SETTINGS_HOME_PAGE 0 #define SETTINGS_BLINDSIGNING_PAGE 1 -void ui_settings_init(int16_t); +void ui_settings_init(int16_t page); diff --git a/app/src/ui_stream.c b/app/src/ui_stream.c index c9b2e823c..7f1acbac4 100644 --- a/app/src/ui_stream.c +++ b/app/src/ui_stream.c @@ -25,8 +25,9 @@ #define UI_INIT_ARRAY_LEN (4 + TZ_SCREEN_LINES_11PX) #ifdef HAVE_BAGL -static unsigned int cb(unsigned int, unsigned int); -static const char *find_icon(tz_ui_icon_t); +static unsigned int cb(unsigned int button_mask, + unsigned int button_mask_counter); +static const char *find_icon(tz_ui_icon_t icon); static void pred(void); static void succ(void); static void change_screen_left(void); @@ -37,13 +38,13 @@ const bagl_icon_details_t C_icon_rien = {0, 0, 1, NULL, NULL}; #endif // HAVE_BAGL void drop_last_screen(void); -void push_str(const char *, size_t, char **); +void push_str(const char *text, size_t len, char **out); // Model #ifdef HAVE_BAGL void -tz_ui_stream_init(void (*cb)(uint8_t)) +tz_ui_stream_init(void (*cb)(tz_ui_cb_type_t cb_type)) { tz_ui_stream_t *s = &global.stream; diff --git a/app/src/ui_stream.h b/app/src/ui_stream.h index a599e5d40..5fdf8fb83 100644 --- a/app/src/ui_stream.h +++ b/app/src/ui_stream.h @@ -144,7 +144,7 @@ typedef struct { #endif // HAVE_NBGL typedef struct { - void (*cb)(tz_ui_cb_type_t); + void (*cb)(tz_ui_cb_type_t cb_type); tz_ui_stream_screen_t screens[TZ_UI_STREAM_HISTORY_SCREENS]; tz_ui_strings_t strings; int16_t current; @@ -161,18 +161,22 @@ typedef struct { #endif // HAVE_NBGL } tz_ui_stream_t; -void tz_ui_stream_init(void (*)(tz_ui_cb_type_t)); +void tz_ui_stream_init(void (*cb)(tz_ui_cb_type_t cb_type)); /* Push title & content to screen * * content may not always fit on screen entirely - returns total * bytes of content written. */ -size_t tz_ui_stream_push(tz_ui_cb_type_t, const char *, const char *, - tz_ui_layout_type_t, tz_ui_icon_t); -size_t tz_ui_stream_pushl(tz_ui_cb_type_t, const char *, const char *, - ssize_t, tz_ui_layout_type_t, tz_ui_icon_t); -size_t tz_ui_stream_push_all(tz_ui_cb_type_t, const char *, const char *, - tz_ui_layout_type_t, tz_ui_icon_t); +size_t tz_ui_stream_push(tz_ui_cb_type_t cb_type, const char *title, + const char *value, tz_ui_layout_type_t layout_type, + tz_ui_icon_t icon); +size_t tz_ui_stream_pushl(tz_ui_cb_type_t cb_type, const char *title, + const char *value, ssize_t max, + tz_ui_layout_type_t layout_type, tz_ui_icon_t icon); +size_t tz_ui_stream_push_all(tz_ui_cb_type_t cb_type, const char *title, + const char *value, + tz_ui_layout_type_t layout_type, + tz_ui_icon_t icon); void tz_ui_stream_close(void); void tz_ui_stream(void); void tz_ui_stream_start(void); diff --git a/app/src/ui_stream_nbgl.c b/app/src/ui_stream_nbgl.c index fc3f65c9a..804d8e966 100644 --- a/app/src/ui_stream_nbgl.c +++ b/app/src/ui_stream_nbgl.c @@ -24,13 +24,13 @@ #include "globals.h" #include "ui_stream.h" -bool tz_ui_nav_cb(uint8_t, nbgl_pageContent_t *); +bool tz_ui_nav_cb(uint8_t page, nbgl_pageContent_t *content); bool has_final_screen(void); void tz_ui_stream_start(void); void drop_last_screen(void); -void push_str(const char *, size_t, char **); -void switch_to_blindsigning(const char *, const char *); +void push_str(const char *text, size_t len, char **out); +void switch_to_blindsigning(const char *err_type, const char *err_code); void tz_cancel_ui(void) @@ -251,7 +251,7 @@ tz_ui_stream(void) } void -tz_ui_review_start() +tz_ui_review_start(void) { tz_ui_stream_t *s = &global.stream; @@ -264,7 +264,7 @@ tz_ui_review_start() } void -tz_ui_stream_init(void (*cb)(uint8_t)) +tz_ui_stream_init(void (*cb)(tz_ui_cb_type_t cb_type)) { tz_ui_stream_t *s = &global.stream; diff --git a/app/src/ui_strings.c b/app/src/ui_strings.c index 42a2fb805..5003f94c9 100644 --- a/app/src/ui_strings.c +++ b/app/src/ui_strings.c @@ -35,11 +35,11 @@ void ui_strings_drop(char **str); void ui_strings_drop_last(char **str); size_t ui_strings_fit_up_to(size_t len, char **write_start); void ui_strings_can_fit(size_t len, bool *can_fit); -bool ui_strings_is_empty(); -size_t ui_strings_append_last(const char *str, size_t, char **out); +bool ui_strings_is_empty(void); +size_t ui_strings_append_last(const char *str, size_t max, char **out); #ifdef TEZOS_DEBUG -void ui_strings_print(); +void ui_strings_print(void); #define PRINT_STRINGS ui_strings_print() #else #define PRINT_STRINGS @@ -315,7 +315,7 @@ ui_strings_append_last(const char *str, size_t max, char **out) } bool -ui_strings_is_empty() +ui_strings_is_empty(void) { tz_ui_strings_t *s = UI_STRINGS; return s->start == s->end && s->count == 0; /* check COUNT is zero! */ @@ -353,7 +353,7 @@ ui_strings_next(char **p) } void -ui_strings_print() +ui_strings_print(void) { tz_ui_strings_t *s = UI_STRINGS; diff --git a/app/src/ui_strings.h b/app/src/ui_strings.h index 0b4ef3ccc..6f309a44b 100644 --- a/app/src/ui_strings.h +++ b/app/src/ui_strings.h @@ -52,8 +52,8 @@ typedef struct { } tz_ui_strings_t; void ui_strings_init(void); -void ui_strings_push(const char *, size_t, char **); -void ui_strings_drop(char **); -void ui_strings_drop_last(char **); -void ui_strings_can_fit(size_t, bool *); -size_t ui_strings_append_last(const char *, size_t, char **); +void ui_strings_push(const char *str, size_t len, char **out); +void ui_strings_drop(char **str); +void ui_strings_drop_last(char **str); +void ui_strings_can_fit(size_t len, bool *can_fit); +size_t ui_strings_append_last(const char *str, size_t max, char **out); From 0d8bbeaca70fb23a1a7924d9c16b7f243e0288d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Tue, 13 Feb 2024 11:20:05 +0100 Subject: [PATCH 06/38] Style: suffix unsigned type constants with 'u' [misra-c2012-7.2] A "u" or "U" suffix shall be applied to all integer constants that are represented in an unsigned type --- app/src/app_main.c | 2 +- app/src/exception.h | 50 +++++++++++++++---------------- app/src/parser/operation_parser.h | 2 +- app/src/ui_stream.h | 24 +++++++-------- app/src/utils.h | 4 +-- 5 files changed, 41 insertions(+), 41 deletions(-) diff --git a/app/src/app_main.c b/app/src/app_main.c index 6e3b58a88..147734fbb 100644 --- a/app/src/app_main.c +++ b/app/src/app_main.c @@ -118,7 +118,7 @@ app_main(void) command_t cmd; int rx; - app_stack_canary = 0xDEADBEEF; + app_stack_canary = 0xDEADBEEFu; FUNC_ENTER(("void")); print_memory_layout(); diff --git a/app/src/exception.h b/app/src/exception.h index e75bb9b5e..c52e70f3f 100644 --- a/app/src/exception.h +++ b/app/src/exception.h @@ -23,7 +23,7 @@ #include #include -#define SW_OK 0x9000 +#define SW_OK 0x9000u // Standard APDU error codes: // https://www.eftlab.com/knowledge-base/complete-list-of-apdu-responses @@ -31,23 +31,23 @@ typedef uint16_t tz_exc; -#define EXC_WRONG_PARAM 0x6B00 -#define EXC_WRONG_LENGTH 0x6C00 -#define EXC_INVALID_INS 0x6D00 -#define EXC_WRONG_LENGTH_FOR_INS 0x917E -#define EXC_REJECT 0x6985 -#define EXC_PARSE_ERROR 0x9405 -#define EXC_REFERENCED_DATA_NOT_FOUND 0x6A88 -#define EXC_WRONG_VALUES 0x6A80 -#define EXC_SECURITY 0x6982 -#define EXC_HID_REQUIRED 0x6983 -#define EXC_CLASS 0x6E00 -#define EXC_MEMORY_ERROR 0x9200 - -#define EXC_UNEXPECTED_STATE 0x9001 -#define EXC_UNEXPECTED_SIGN_STATE 0x9002 -#define EXC_UNKNOWN_CX_ERR 0x9003 -#define EXC_UNKNOWN 0x90FF +#define EXC_WRONG_PARAM 0x6B00u +#define EXC_WRONG_LENGTH 0x6C00u +#define EXC_INVALID_INS 0x6D00u +#define EXC_WRONG_LENGTH_FOR_INS 0x917Eu +#define EXC_REJECT 0x6985u +#define EXC_PARSE_ERROR 0x9405u +#define EXC_REFERENCED_DATA_NOT_FOUND 0x6A88u +#define EXC_WRONG_VALUES 0x6A80u +#define EXC_SECURITY 0x6982u +#define EXC_HID_REQUIRED 0x6983u +#define EXC_CLASS 0x6E00u +#define EXC_MEMORY_ERROR 0x9200u + +#define EXC_UNEXPECTED_STATE 0x9001u +#define EXC_UNEXPECTED_SIGN_STATE 0x9002u +#define EXC_UNKNOWN_CX_ERR 0x9003u +#define EXC_UNKNOWN 0x90FFu /* * In the handlers and the routines that they call, we define a set of @@ -81,13 +81,13 @@ typedef uint16_t tz_exc; * with this framework, reply with io_send_sw() and return TZ_DONE. */ -#define TZ_PREAMBLE(_args) \ - tz_exc _sw_ret_code = 0x0000; \ - cx_err_t error = CX_OK; \ - if (error != CX_OK) \ - goto bail; \ - if (0) \ - goto end; \ +#define TZ_PREAMBLE(_args) \ + tz_exc _sw_ret_code = 0x0000u; \ + cx_err_t error = CX_OK; \ + if (error != CX_OK) \ + goto bail; \ + if (0) \ + goto end; \ FUNC_ENTER(_args) #define TZ_POSTAMBLE \ diff --git a/app/src/parser/operation_parser.h b/app/src/parser/operation_parser.h index 25457a0a5..1777c3804 100644 --- a/app/src/parser/operation_parser.h +++ b/app/src/parser/operation_parser.h @@ -18,7 +18,7 @@ #include "parser_state.h" -#define TZ_UNKNOWN_SIZE 0xFFFF +#define TZ_UNKNOWN_SIZE 0xFFFFu void tz_operation_parser_init(tz_parser_state *state, uint16_t size, bool skip_magic); void tz_operation_parser_set_size(tz_parser_state *state, uint16_t size); diff --git a/app/src/ui_stream.h b/app/src/ui_stream.h index 5fdf8fb83..c320c26e7 100644 --- a/app/src/ui_stream.h +++ b/app/src/ui_stream.h @@ -78,18 +78,18 @@ */ typedef uint8_t tz_ui_cb_type_t; -#define TZ_UI_STREAM_CB_NOCB 0x00 -#define TZ_UI_STREAM_CB_BLINDSIGN 0x0e -#define TZ_UI_STREAM_CB_REFILL 0xef -#define TZ_UI_STREAM_CB_MAINMASK 0xf0 -#define TZ_UI_STREAM_CB_EXPERT_MODE_FIELD 0xfa -#define TZ_UI_STREAM_CB_EXPERT_MODE_ENABLE 0xfb -#define TZ_UI_STREAM_CB_BLINDSIGN_REJECT 0xfc -#define TZ_UI_STREAM_CB_CANCEL 0xfd -#define TZ_UI_STREAM_CB_REJECT 0xfe -#define TZ_UI_STREAM_CB_ACCEPT 0xff - -#define TZ_UI_LAYOUT_HOME_MASK 0x80 +#define TZ_UI_STREAM_CB_NOCB 0x00u +#define TZ_UI_STREAM_CB_BLINDSIGN 0x0Eu +#define TZ_UI_STREAM_CB_REFILL 0xEFu +#define TZ_UI_STREAM_CB_MAINMASK 0xF0u +#define TZ_UI_STREAM_CB_EXPERT_MODE_FIELD 0xFAu +#define TZ_UI_STREAM_CB_EXPERT_MODE_ENABLE 0xFBu +#define TZ_UI_STREAM_CB_BLINDSIGN_REJECT 0xFCu +#define TZ_UI_STREAM_CB_CANCEL 0xFDu +#define TZ_UI_STREAM_CB_REJECT 0xFEu +#define TZ_UI_STREAM_CB_ACCEPT 0xFFu + +#define TZ_UI_LAYOUT_HOME_MASK 0x80u /** * Layout type: * BNP - refers to Bold Title, normal text/picture below the title. diff --git a/app/src/utils.h b/app/src/utils.h index e479d38f9..bab8b4cde 100644 --- a/app/src/utils.h +++ b/app/src/utils.h @@ -21,13 +21,13 @@ PRINTF x; \ PRINTF(") at %s:%u\n", __FILE__, __LINE__); \ PRINTF("[DEBUG] stack = 0x%p (%s)\n", &_tmp, __func__); \ - if (app_stack_canary != 0xDEADBEEF) \ + if (app_stack_canary != 0xDEADBEEFu) \ PRINTF("[DEBUG] Stack (0x%p) has been smashed\n", \ &app_stack_canary); \ } while (0) #define FUNC_LEAVE() \ do { \ - if (app_stack_canary != 0xDEADBEEF) \ + if (app_stack_canary != 0xDEADBEEFu) \ PRINTF( \ "[DEBUG] Stack (0x%p) has been smashed " \ "(leaving function)\n", \ From 646b4efe03655a6beb55502ada03b1df998726e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Tue, 13 Feb 2024 11:30:19 +0100 Subject: [PATCH 07/38] Style: make tz_string_to_mutez clearer [misra-c2012-13.4] The result of an assignment operator should not be used --- app/src/parser/num_parser.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/app/src/parser/num_parser.c b/app/src/parser/num_parser.c index 944dd15d6..8538cc825 100644 --- a/app/src/parser/num_parser.c +++ b/app/src/parser/num_parser.c @@ -80,20 +80,18 @@ tz_parse_nat_step(tz_num_parser_buffer *buffers, tz_num_parser_regs *regs, bool tz_string_to_mutez(const char *str, uint64_t *res) { - int c; - if (str == NULL || res == NULL) { PRINTF("[ERROR] Null parameter\n"); return false; } *res = 0; - while ((c = *str++) != '\0') { - if (c < '0' || c > '9') { - PRINTF("[ERROR] Non-digit character: %c\n", c); + for (int i = 0; str[i] != '\0'; i++) { + if (str[i] < '0' || str[i] > '9') { + PRINTF("[ERROR] Non-digit character: %c\n", str[i]); return false; } - *res = *res * 10 + (c - '0'); + *res = *res * 10 + (str[i] - '0'); } return true; From 64ebf5009a5091375f740e526cd3980269faa120 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Tue, 13 Feb 2024 12:09:19 +0100 Subject: [PATCH 08/38] Style: avoid one-line `if`, `while`, `for`, ... [misra-c2012-15.6] The body of an iteration-statement or a selection-statement shall be a compound-statement --- .clang-format | 3 +- app/src/apdu_pubkey.c | 5 +- app/src/apdu_sign.c | 30 +++++--- app/src/app_main.c | 3 +- app/src/exception.h | 6 +- app/src/handle_swap.c | 6 +- app/src/keys.c | 12 ++- app/src/parser/formatting.c | 45 ++++++++---- app/src/parser/micheline_parser.c | 30 +++++--- app/src/parser/num_parser.c | 3 +- app/src/parser/operation_parser.c | 85 +++++++++++++++------- app/src/parser/parser_state.c | 9 ++- app/src/parser/parser_state.h | 3 +- app/src/ui_home_nbgl.c | 4 +- app/src/ui_settings.c | 6 +- app/src/ui_stream.c | 40 ++++++---- app/src/ui_stream_nbgl.c | 27 ++++--- app/src/ui_strings.c | 17 +++-- app/src/utils.h | 6 +- tests/unit/ctest/tests_parser.c | 8 +- tests/unit/parser/micheline_cparse_stubs.c | 13 ++-- 21 files changed, 237 insertions(+), 124 deletions(-) diff --git a/.clang-format b/.clang-format index 8efd70ea1..a8b445bf5 100644 --- a/.clang-format +++ b/.clang-format @@ -5,7 +5,7 @@ IndentWidth: 4 ColumnLimit: 78 UseTab: Never IndentCaseLabels: false -InsertBraces: false +InsertBraces: true PointerAlignment: Right AlwaysBreakAfterReturnType: TopLevelDefinitions @@ -36,4 +36,5 @@ AlignArrayOfStructures: Left SortIncludes: Never SpaceAfterCStyleCast: false AllowShortEnumsOnASingleLine: false +AllowShortIfStatementsOnASingleLine: Never ... diff --git a/app/src/apdu_pubkey.c b/app/src/apdu_pubkey.c index 140d943f9..7fa5d4e89 100644 --- a/app/src/apdu_pubkey.c +++ b/app/src/apdu_pubkey.c @@ -191,10 +191,11 @@ handle_apdu_get_public_key(command_t *cmd) TZ_LIB_CHECK(derive_pk(&global.keys.pubkey, global.path_with_curve.derivation_type, &global.path_with_curve.bip32_path)); - if (prompt) + if (prompt) { prompt_address(); - else + } else { provide_pubkey(); + } TZ_POSTAMBLE; } diff --git a/app/src/apdu_sign.c b/app/src/apdu_sign.c index cd54f63cc..0a8bb2f2f 100644 --- a/app/src/apdu_sign.c +++ b/app/src/apdu_sign.c @@ -116,8 +116,9 @@ sign_packet(void) bufs[0].size, sig, &bufs[1].size)); /* If we aren't returning the hash, zero its buffer... */ - if (!global.keys.apdu.sign.return_hash) + if (!global.keys.apdu.sign.return_hash) { bufs[0].size = 0; + } io_send_response_buffers(bufs, 2, SW_OK); global.step = ST_IDLE; @@ -306,8 +307,9 @@ refill(void) tz_parser_state *st = &global.keys.apdu.sign.u.clear.parser_state; TZ_PREAMBLE(("void")); - while (!TZ_IS_BLOCKED(tz_operation_parser_step(st))) - ; + while (!TZ_IS_BLOCKED(tz_operation_parser_step(st))) { + // Loop while the result is successful and not blocking + } PRINTF("[DEBUG] refill(errno: %s)\n", tz_parser_result_name(st->errno)); // clang-format off switch (st->errno) { @@ -399,8 +401,9 @@ bs_push_next(void) *step = BLINDSIGN_ST_HASH; if (tz_format_base58(FINAL_HASH, sizeof(FINAL_HASH), obuf, - sizeof(obuf))) + sizeof(obuf))) { TZ_FAIL(EXC_UNKNOWN); + } tz_ui_stream_push_all(TZ_UI_STREAM_CB_NOCB, "Sign Hash", obuf, TZ_UI_LAYOUT_BNP, TZ_UI_ICON_NONE); @@ -530,11 +533,13 @@ handle_data_apdu(command_t *cmd) cmd->lc, global.keys.apdu.hash.final_hash, sizeof(global.keys.apdu.hash.final_hash))); - if (PKT_IS_LAST(cmd)) + if (PKT_IS_LAST(cmd)) { global.keys.apdu.sign.received_last_msg = true; + } - if (!global.keys.apdu.sign.tag) + if (!global.keys.apdu.sign.tag) { global.keys.apdu.sign.tag = cmd->data[0]; + } // clang-format off switch (global.step) { @@ -558,16 +563,18 @@ handle_data_apdu_clear(command_t *cmd) global.keys.apdu.sign.u.clear.received_msg = true; TZ_ASSERT_NOTNULL(cmd); - if (st->regs.ilen > 0) + if (st->regs.ilen > 0) { // we asked for more input but did not consume what we already had TZ_FAIL(EXC_UNEXPECTED_SIGN_STATE); + } global.keys.apdu.sign.u.clear.total_length += cmd->lc; tz_parser_refill(st, cmd->data, cmd->lc); - if (PKT_IS_LAST(cmd)) + if (PKT_IS_LAST(cmd)) { tz_operation_parser_set_size( st, global.keys.apdu.sign.u.clear.total_length); + } if (global.step == ST_SWAP_SIGN) { do { TZ_CHECK(refill()); @@ -575,8 +582,9 @@ handle_data_apdu_clear(command_t *cmd) } else { TZ_CHECK(refill()); if (global.keys.apdu.sign.step == SIGN_ST_WAIT_USER_INPUT - && global.step != ST_SWAP_SIGN) + && global.step != ST_SWAP_SIGN) { tz_ui_stream(); + } } TZ_POSTAMBLE; } @@ -706,8 +714,10 @@ handle_data_apdu_blind(void) tz_ui_stream(); #elif HAVE_NBGL char obuf[TZ_BASE58_BUFFER_SIZE(sizeof(FINAL_HASH))]; - if (tz_format_base58(FINAL_HASH, sizeof(FINAL_HASH), obuf, sizeof(obuf))) + if (tz_format_base58(FINAL_HASH, sizeof(FINAL_HASH), obuf, + sizeof(obuf))) { TZ_FAIL(EXC_UNKNOWN); + } transaction_type = type; STRLCPY(hash, obuf); diff --git a/app/src/app_main.c b/app/src/app_main.c index 147734fbb..5d163733f 100644 --- a/app/src/app_main.c +++ b/app/src/app_main.c @@ -76,8 +76,9 @@ dispatch(command_t *cmd) tz_handler_t f; TZ_PREAMBLE(("cmd=0x%p {cla=0x02x ins=%u ...}", cmd, cmd->cla, cmd->ins)); - if (cmd->cla != CLA) + if (cmd->cla != CLA) { TZ_FAIL(EXC_CLASS); + } if (tz_ui_stream_get_cb_type() == SCREEN_QUIT) { PRINTF("[ERROR] received instruction whilst on Quit screen\n"); diff --git a/app/src/exception.h b/app/src/exception.h index c52e70f3f..6e4cb70a8 100644 --- a/app/src/exception.h +++ b/app/src/exception.h @@ -84,10 +84,12 @@ typedef uint16_t tz_exc; #define TZ_PREAMBLE(_args) \ tz_exc _sw_ret_code = 0x0000u; \ cx_err_t error = CX_OK; \ - if (error != CX_OK) \ + if (error != CX_OK) { \ goto bail; \ - if (0) \ + } \ + if (0) { \ goto end; \ + } \ FUNC_ENTER(_args) #define TZ_POSTAMBLE \ diff --git a/app/src/handle_swap.c b/app/src/handle_swap.c index f4995cbd5..21ecff369 100644 --- a/app/src/handle_swap.c +++ b/app/src/handle_swap.c @@ -189,11 +189,13 @@ swap_check_validity(void) char dstaddr[ADDRESS_MAX_SIZE]; TZ_PREAMBLE(("")); - if (!G_called_from_swap) + if (!G_called_from_swap) { TZ_SUCCEED(); + } - if (G_swap_response_ready) + if (G_swap_response_ready) { os_sched_exit(-1); + } G_swap_response_ready = true; PRINTF("[DEBUG] batch_index = %u, nb_reveal=%d, tag=%d\n", diff --git a/app/src/keys.c b/app/src/keys.c index a800aa227..d5a7d5079 100644 --- a/app/src/keys.c +++ b/app/src/keys.c @@ -79,8 +79,9 @@ derive_pk(cx_ecfp_public_key_t *public_key, derivation_type_t derivation_type, public_key->curve = derivation_type_to_cx_curve(derivation_type); int derivation_mode = HDW_NORMAL; - if (derivation_type == DERIVATION_TYPE_ED25519) + if (derivation_type == DERIVATION_TYPE_ED25519) { derivation_mode = HDW_ED25519_SLIP10; + } CX_CHECK(bip32_derive_with_seed_get_pubkey_256( derivation_mode, public_key->curve, bip32_path->components, @@ -114,8 +115,9 @@ derive_pkh(cx_ecfp_public_key_t *pubkey, derivation_type_t derivation_type, } // clang-format on - if (tz_format_pkh(hash, 21, buffer, len)) + if (tz_format_pkh(hash, 21, buffer, len)) { TZ_FAIL(EXC_UNKNOWN); + } TZ_LIB_POSTAMBLE; } @@ -203,8 +205,9 @@ sign(derivation_type_t derivation_type, const bip32_path_t *path, case DERIVATION_TYPE_BIP32_ED25519: case DERIVATION_TYPE_ED25519: derivation_mode = HDW_NORMAL; - if (derivation_type == DERIVATION_TYPE_ED25519) + if (derivation_type == DERIVATION_TYPE_ED25519) { derivation_mode = HDW_ED25519_SLIP10; + } CX_CHECK(bip32_derive_with_seed_eddsa_sign_hash_256( derivation_mode, curve, path->components, path->length, CX_SHA512, hash, hashlen, sig, siglen, NULL, 0)); @@ -214,8 +217,9 @@ sign(derivation_type_t derivation_type, const bip32_path_t *path, CX_CHECK(bip32_derive_ecdsa_sign_hash_256( curve, path->components, path->length, CX_RND_RFC6979 | CX_LAST, CX_SHA256, hash, hashlen, sig, siglen, &info)); - if (info & CX_ECCINFO_PARITY_ODD) + if (info & CX_ECCINFO_PARITY_ODD) { sig[0] |= 0x01; + } break; default: TZ_FAIL(EXC_WRONG_VALUES); diff --git a/app/src/parser/formatting.c b/app/src/parser/formatting.c index e0ebe4650..0b51ff45d 100644 --- a/app/src/parser/formatting.c +++ b/app/src/parser/formatting.c @@ -184,8 +184,9 @@ const char *const tz_michelson_op_names_ordered[TZ_LAST_MICHELSON_OPCODE + 1] const char * tz_michelson_op_name(uint8_t op_code) { - if (op_code > TZ_LAST_MICHELSON_OPCODE) + if (op_code > TZ_LAST_MICHELSON_OPCODE) { return NULL; + } return PIC(tz_michelson_op_names_ordered[op_code]); } @@ -216,8 +217,9 @@ tz_format_base58(const uint8_t *n, size_t l, char *obuf, size_t olen) memset(obuf, 0, obuf_len); - while (zcount < l && !n[zcount]) + while (zcount < l && !n[zcount]) { ++zcount; + } for (i = zcount, high = obuf_len - 1; i < l; ++i, high = j) { carry = n[i]; @@ -228,13 +230,16 @@ tz_format_base58(const uint8_t *n, size_t l, char *obuf, size_t olen) } } - if (zcount) + if (zcount) { memset(obuf, '1', zcount); + } - for (j = 0; !obuf[j]; ++j) - ; - for (i = 0; j < obuf_len; ++i, ++j) + for (j = 0; !obuf[j]; ++j) { + // Find the last index of obuf + } + for (i = 0; j < obuf_len; ++i, ++j) { obuf[i] = tz_b58digits_ordered[(unsigned)obuf[j]]; + } obuf[i] = '\0'; return 0; } @@ -253,8 +258,9 @@ tz_format_decimal(const uint8_t *n, size_t l, char *obuf, size_t olen) memset(obuf, 0, obuf_len); - while (zcount < l && !n[l - zcount - 1]) + while (zcount < l && !n[l - zcount - 1]) { ++zcount; + } if (zcount == l) { obuf[0] = '0'; @@ -270,10 +276,12 @@ tz_format_decimal(const uint8_t *n, size_t l, char *obuf, size_t olen) } } - for (j = 0; !obuf[j]; ++j) - ; - for (i = 0; j < obuf_len; ++i, ++j) + for (j = 0; !obuf[j]; ++j) { + // Find the last index of obuf + } + for (i = 0; j < obuf_len; ++i, ++j) { obuf[i] = '0' + obuf[j]; + } obuf[i] = '\0'; return 0; } @@ -327,8 +335,9 @@ cx_hash_sha256(uint8_t *data, size_t size, uint8_t *out, size_t size_out) // clang-format off #define B58_PREFIX(_s, _p, _pl, _dl) do { \ if (!strcmp((_s), s)) { \ - if ((_dl) != dl) \ - return 1; \ + if ((_dl) != dl) { \ + return 1; \ + } \ (*p) = (const uint8_t *)(_p); \ (*pl) = (_pl); \ return 0; \ @@ -385,8 +394,9 @@ tz_format_base58check(const char *sprefix, const uint8_t *data, size_t size, const uint8_t *prefix = NULL; size_t prefix_len; - if (find_prefix(sprefix, &prefix, &prefix_len, size)) + if (find_prefix(sprefix, &prefix, &prefix_len, size)) { return 1; + } /* In order to avoid vla, we have a maximum buffer size of 64 */ uint8_t prepared[64]; @@ -412,8 +422,9 @@ tz_format_pkh(const uint8_t *data, size_t size, char *obuf, size_t olen) { const char *prefix; - if (size < 1) + if (size < 1) { return 1; + } // clang-format off switch (data[0]) { case 0: prefix = "tz1"; break; @@ -432,8 +443,9 @@ tz_format_pk(const uint8_t *data, size_t size, char *obuf, size_t olen) { const char *prefix; - if (size < 1) + if (size < 1) { return 1; + } // clang-format off switch (data[0]) { case 0: prefix = "edpk"; break; @@ -466,8 +478,9 @@ tz_format_address(const uint8_t *data, size_t size, char *obuf, size_t olen) { const char *prefix; - if (size < 1) + if (size < 1) { return 1; + } // clang-format off switch (data[0]) { case 1: prefix = "KT1"; break; diff --git a/app/src/parser/micheline_parser.c b/app/src/parser/micheline_parser.c index 2b510745d..4644b0a04 100644 --- a/app/src/parser/micheline_parser.c +++ b/app/src/parser/micheline_parser.c @@ -54,8 +54,9 @@ push_frame(tz_parser_state *state, tz_micheline_parser_step_kind step) { tz_micheline_state *m = &state->micheline; - if (m->frame >= &m->stack[TZ_MICHELINE_STACK_DEPTH - 1]) + if (m->frame >= &m->stack[TZ_MICHELINE_STACK_DEPTH - 1]) { tz_raise(TOO_DEEP); + } m->frame++; m->frame->step = step; tz_continue; @@ -79,8 +80,9 @@ begin_sized(tz_parser_state *state) { tz_micheline_state *m = &state->micheline; - if (push_frame(state, TZ_MICHELINE_STEP_SIZE)) + if (push_frame(state, TZ_MICHELINE_STEP_SIZE)) { tz_reraise; + } m->frame->step_size.size = 0; m->frame->stop = state->ofs + 4; tz_continue; @@ -129,8 +131,9 @@ tag_selection(tz_parser_state *state, uint8_t t) case TZ_MICHELINE_TAG_INT: m->frame->step = TZ_MICHELINE_STEP_INT; tz_parse_num_state_init(&state->buffers.num, &m->frame->step_int); - for (int i = 0; i < TZ_NUM_BUFFER_SIZE / 8; i++) + for (int i = 0; i < TZ_NUM_BUFFER_SIZE / 8; i++) { state->buffers.num.bytes[i] = 0; + } break; case TZ_MICHELINE_TAG_SEQ: m->frame->step = TZ_MICHELINE_STEP_SEQ; @@ -189,11 +192,13 @@ tz_micheline_parser_step(tz_parser_state *state) uint8_t t; // cannot restart after error - if (TZ_IS_ERR(state->errno)) + if (TZ_IS_ERR(state->errno)) { tz_reraise; + } // nothing else to do - if (state->micheline.frame == NULL) + if (state->micheline.frame == NULL) { tz_stop(DONE); + } PRINTF( "[DEBUG] micheline(frame: %d, offset:%d/%d, step: %s, errno: %s)\n", @@ -225,8 +230,9 @@ tz_micheline_parser_step(tz_parser_state *state) break; case TZ_MICHELINE_STEP_SIZE: tz_must(tz_parser_read(state, &b)); - if (m->frame->step_size.size > 255) + if (m->frame->step_size.size > 255) { tz_raise(TOO_LARGE); // enforce 16-bit restriction + } m->frame->step_size.size = m->frame->step_size.size << 8 | b; if (m->frame->stop == state->ofs) { m->frame[-1].stop = state->ofs + m->frame->step_size.size; @@ -321,8 +327,9 @@ tz_micheline_parser_step(tz_parser_state *state) break; case TZ_MICHELINE_STEP_PRIM_OP: tz_must(tz_parser_read(state, &op)); - if (tz_michelson_op_name(op) == NULL) + if (tz_michelson_op_name(op) == NULL) { tz_raise(INVALID_OP); + } m->frame->step = TZ_MICHELINE_STEP_PRIM_NAME; m->frame->step_prim.op = op; break; @@ -339,8 +346,9 @@ tz_micheline_parser_step(tz_parser_state *state) m->frame->step_prim.ofs++; } else { m->frame->step = TZ_MICHELINE_STEP_PRIM; - if (m->frame->step_prim.nargs == 3) + if (m->frame->step_prim.nargs == 3) { tz_must(begin_sized(state)); + } } break; case TZ_MICHELINE_STEP_PRIM: @@ -353,16 +361,18 @@ tz_micheline_parser_step(tz_parser_state *state) m->frame->step_annot.first = true; tz_must(begin_sized(state)); } else { - if (m->frame->step_prim.wrap) + if (m->frame->step_prim.wrap) { tz_must(parser_put(state, ')')); + } tz_must(pop_frame(state)); } } else if (!m->frame->step_prim.spc) { tz_must(parser_put(state, ' ')); m->frame->step_prim.spc = true; } else { - if (m->frame->step_prim.nargs < 3) + if (m->frame->step_prim.nargs < 3) { m->frame->step_prim.nargs--; + } m->frame->step_prim.spc = false; tz_must(push_frame(state, TZ_MICHELINE_STEP_TAG)); } diff --git a/app/src/parser/num_parser.c b/app/src/parser/num_parser.c index 8538cc825..9f307d3c7 100644 --- a/app/src/parser/num_parser.c +++ b/app/src/parser/num_parser.c @@ -48,8 +48,9 @@ tz_parse_num_step(tz_num_parser_buffer *buffers, tz_num_parser_regs *regs, buffers->bytes[lo_idx] |= lo; if (hi_idx >= TZ_NUM_BUFFER_SIZE / 8) { // accept and dismiss a few trailing zeroes - if (hi || cont) + if (hi || cont) { return TZ_ERR_TOO_LARGE; + } regs->size = TZ_NUM_BUFFER_SIZE; } else { buffers->bytes[hi_idx] = hi; diff --git a/app/src/parser/operation_parser.c b/app/src/parser/operation_parser.c index d239c0f2e..5b7cec30a 100644 --- a/app/src/parser/operation_parser.c +++ b/app/src/parser/operation_parser.c @@ -223,8 +223,9 @@ push_frame(tz_parser_state *state, tz_operation_parser_step_kind step) { tz_operation_state *op = &state->operation; - if (op->frame >= &op->stack[TZ_OPERATION_STACK_DEPTH - 1]) + if (op->frame >= &op->stack[TZ_OPERATION_STACK_DEPTH - 1]) { tz_raise(TOO_DEEP); + } op->frame++; op->frame->step = step; tz_continue; @@ -329,8 +330,9 @@ tz_step_option(tz_parser_state *state) tz_must(tz_parser_read(state, &present)); if (!present) { if (op->frame->step_option.display_none) { - if (op->frame->step_option.field->skip) + if (op->frame->step_option.field->skip) { tz_raise(INVALID_STATE); + } op->frame->step = TZ_OPERATION_STEP_PRINT; op->frame->step_print.str = (char *)unset_message; } else { @@ -354,8 +356,9 @@ tz_step_tuple(tz_parser_state *state) &op->frame->step_tuple.fields[op->frame->step_tuple.field_index]); // Remaining content from previous section - display this first. - if (regs->oofs > 0) + if (regs->oofs > 0) { tz_stop(IM_FULL); + } if (field->kind == TZ_OPERATION_FIELD_END) { // is_field_complex is reset after reaching the last field @@ -411,8 +414,9 @@ tz_step_size(tz_parser_state *state) tz_operation_state *op = &state->operation; uint8_t b; tz_must(tz_parser_read(state, &b)); - if (op->frame->step_size.size > 255) + if (op->frame->step_size.size > 255) { tz_raise(TOO_LARGE); // enforce 16-bit restriction + } op->frame->step_size.size = op->frame->step_size.size << 8 | b; op->frame->step_size.size_len--; if (op->frame->step_size.size_len <= 0) { @@ -433,8 +437,9 @@ tz_step_tag(tz_parser_state *state) tz_must(tz_parser_read(state, &t)); #ifdef HAVE_SWAP op->last_tag = t; - if (t == TZ_OPERATION_TAG_REVEAL) + if (t == TZ_OPERATION_TAG_REVEAL) { op->nb_reveal++; + } #endif // HAVE_SWAP for (d = tz_operation_descriptors; d->tag != TZ_OPERATION_TAG_END; d++) { if (d->tag == t) { @@ -466,13 +471,15 @@ tz_step_read_micheline(tz_parser_state *state) } tz_micheline_parser_step(state); if (state->errno == TZ_BLO_DONE) { - if (op->frame->stop != 0 && state->ofs != op->frame->stop) + if (op->frame->stop != 0 && state->ofs != op->frame->stop) { tz_raise(TOO_LARGE); + } tz_must(pop_frame(state)); - if (regs->oofs > 0) + if (regs->oofs > 0) { tz_stop(IM_FULL); - else + } else { tz_continue; + } } tz_reraise; } @@ -491,8 +498,9 @@ tz_step_read_num(tz_parser_state *state) if (op->frame->step_read_num.state.stop) { #ifdef HAVE_SWAP uint64_t value; - if (!tz_string_to_mutez(state->buffers.num.decimal, &value)) + if (!tz_string_to_mutez(state->buffers.num.decimal, &value)) { tz_raise(INVALID_DATA); + } switch (op->frame->step_read_num.kind) { case TZ_OPERATION_FIELD_AMOUNT: op->last_amount = value; @@ -517,32 +525,38 @@ tz_step_read_num(tz_parser_state *state) case TZ_OPERATION_FIELD_FEE: case TZ_OPERATION_FIELD_AMOUNT: { int len = 0; - while (str[len]) + while (str[len]) { len++; - if (len == 1 && str[0] == 0) + } + if (len == 1 && str[0] == 0) { // just 0 goto add_currency; + } if (len < 7) { // less than one tez, pad left up to the '0.' int j; int pad = 7 - len; - for (j = len; j >= 0; j--) + for (j = len; j >= 0; j--) { str[j + pad] = str[j]; - for (j = 0; j < pad; j++) + } + for (j = 0; j < pad; j++) { str[j] = '0'; + } len = 7; } int no_decimals = 1; - for (int i = 0; i < 6; i++) + for (int i = 0; i < 6; i++) { no_decimals &= (str[len - 1 - i] == '0'); + } if (no_decimals) { // integral value, don't include the decimal part (no '.'_ str[len - 6] = 0; len -= 6; } else { // more than one tez, add the '.' - for (int i = 0; i < 6; i++) + for (int i = 0; i < 6; i++) { str[len - i] = str[len - i - 1]; + } str[len - 6] = '.'; len++; str[len] = 0; @@ -610,42 +624,52 @@ tz_step_read_bytes(tz_parser_state *state) memcpy(op->source, CAPTURE, 22); __attribute__((fallthrough)); case TZ_OPERATION_FIELD_PKH: - if (tz_format_pkh(CAPTURE, 21, (char *)CAPTURE, sizeof(CAPTURE))) + if (tz_format_pkh(CAPTURE, 21, (char *)CAPTURE, + sizeof(CAPTURE))) { tz_raise(INVALID_TAG); + } break; case TZ_OPERATION_FIELD_PK: if (tz_format_pk(CAPTURE, op->frame->step_read_bytes.len, - (char *)CAPTURE, sizeof(CAPTURE))) + (char *)CAPTURE, sizeof(CAPTURE))) { tz_raise(INVALID_TAG); + } break; case TZ_OPERATION_FIELD_SR: if (tz_format_base58check("sr1", CAPTURE, 20, (char *)CAPTURE, - sizeof(CAPTURE))) + sizeof(CAPTURE))) { tz_raise(INVALID_TAG); + } break; case TZ_OPERATION_FIELD_SRC: if (tz_format_base58check("src1", CAPTURE, 32, (char *)CAPTURE, - sizeof(CAPTURE))) + sizeof(CAPTURE))) { tz_raise(INVALID_TAG); + } break; case TZ_OPERATION_FIELD_PROTO: if (tz_format_base58check("proto", CAPTURE, 32, (char *)CAPTURE, - sizeof(CAPTURE))) + sizeof(CAPTURE))) { tz_raise(INVALID_TAG); + } break; case TZ_OPERATION_FIELD_DESTINATION: memcpy(op->destination, CAPTURE, 22); if (tz_format_address(CAPTURE, 22, (char *)CAPTURE, - sizeof(CAPTURE))) + sizeof(CAPTURE))) { tz_raise(INVALID_TAG); + } break; case TZ_OPERATION_FIELD_OPH: - if (tz_format_oph(CAPTURE, 32, (char *)CAPTURE, sizeof(CAPTURE))) + if (tz_format_oph(CAPTURE, 32, (char *)CAPTURE, + sizeof(CAPTURE))) { tz_raise(INVALID_TAG); + } break; case TZ_OPERATION_FIELD_BH: - if (tz_format_bh(CAPTURE, 32, (char *)CAPTURE, sizeof(CAPTURE))) + if (tz_format_bh(CAPTURE, 32, (char *)CAPTURE, sizeof(CAPTURE))) { tz_raise(INVALID_TAG); + } break; default: tz_raise(INVALID_STATE); @@ -995,8 +1019,9 @@ tz_step_read_soru_messages(tz_parser_state *state) uint16_t index = op->frame->step_read_list.index; // Remaining content from previous message - display this first. - if (regs->oofs > 0) + if (regs->oofs > 0) { tz_stop(IM_FULL); + } if (op->frame->stop == state->ofs) { tz_must(pop_frame(state)); @@ -1071,8 +1096,9 @@ tz_step_read_protos(tz_parser_state *state) uint16_t index = op->frame->step_read_list.index; // Remaining content from previous proto - display this first. - if (regs->oofs > 0) + if (regs->oofs > 0) { tz_stop(IM_FULL); + } if (op->frame->stop == state->ofs) { tz_must(pop_frame(state)); @@ -1109,8 +1135,9 @@ tz_step_print(tz_parser_state *state, bool partial) op->frame->step_print.str++; } else { tz_must(pop_frame(state)); - if (!partial) + if (!partial) { tz_stop(IM_FULL); + } } tz_continue; } @@ -1121,12 +1148,14 @@ tz_operation_parser_step(tz_parser_state *state) tz_operation_state *op = &state->operation; // cannot restart after error - if (TZ_IS_ERR(state->errno)) + if (TZ_IS_ERR(state->errno)) { tz_reraise; + } // nothing else to do - if (op->frame == NULL) + if (op->frame == NULL) { tz_stop(DONE); + } PRINTF( "[DEBUG] operation(frame: %d, offset:%d/%d, ilen: %d, olen: %d, " diff --git a/app/src/parser/parser_state.c b/app/src/parser/parser_state.c index ed415d913..33ff70f6f 100644 --- a/app/src/parser/parser_state.c +++ b/app/src/parser/parser_state.c @@ -104,8 +104,9 @@ tz_parser_put(tz_parser_state *state, char c) { tz_parser_regs *regs = &state->regs; - if (regs->olen < 1) + if (regs->olen < 1) { tz_stop(IM_FULL); + } regs->obuf[regs->oofs] = c; regs->oofs++; regs->olen--; @@ -117,8 +118,9 @@ tz_parser_read(tz_parser_state *state, uint8_t *r) { tz_parser_regs *regs = &state->regs; - if (regs->ilen < 1) + if (regs->ilen < 1) { tz_stop(FEED_ME); + } state->ofs++; regs->ilen--; *r = regs->ibuf[regs->iofs++]; @@ -130,8 +132,9 @@ tz_parser_peek(tz_parser_state *state, uint8_t *r) { tz_parser_regs *regs = &state->regs; - if (regs->ilen < 1) + if (regs->ilen < 1) { tz_stop(FEED_ME); + } *r = regs->ibuf[regs->iofs]; tz_continue; } diff --git a/app/src/parser/parser_state.h b/app/src/parser/parser_state.h index ef1296a93..942e7b234 100644 --- a/app/src/parser/parser_state.h +++ b/app/src/parser/parser_state.h @@ -121,8 +121,9 @@ tz_parser_result tz_parser_set_errno(tz_parser_state *state, #define tz_must(cond) \ do { \ tz_parser_result _err = cond; \ - if (_err) \ + if (_err) { \ tz_return(_err); \ + } \ } while (0) #define tz_continue tz_return(TZ_CONTINUE) #define tz_break tz_return(TZ_BREAK) diff --git a/app/src/ui_home_nbgl.c b/app/src/ui_home_nbgl.c index d41720faa..efdef2532 100644 --- a/app/src/ui_home_nbgl.c +++ b/app/src/ui_home_nbgl.c @@ -81,9 +81,9 @@ navigation_cb_wallet(__attribute__((unused)) uint8_t page, static void controls_callback(int token, __attribute__((unused)) uint8_t index) { - if (token == BLIND_SIGNING_TOKEN) + if (token == BLIND_SIGNING_TOKEN) { toggle_blindsigning(); - else if (token == EXPERT_MODE_TOKEN) { + } else if (token == EXPERT_MODE_TOKEN) { toggle_expert_mode(); } } diff --git a/app/src/ui_settings.c b/app/src/ui_settings.c index da613ae9a..031d08a53 100644 --- a/app/src/ui_settings.c +++ b/app/src/ui_settings.c @@ -54,11 +54,13 @@ ui_settings_init(int16_t page) FUNC_ENTER(("void")); - if (N_settings.blindsigning) + if (N_settings.blindsigning) { bsigning = "ENABLED"; + } - if (N_settings.expert_mode) + if (N_settings.expert_mode) { exp_mode = "ENABLED"; + } tz_ui_stream_init(cb); tz_ui_stream_push(EXPERT_MODE, "Expert mode", exp_mode, diff --git a/app/src/ui_stream.c b/app/src/ui_stream.c index 7f1acbac4..e4a4fa8ca 100644 --- a/app/src/ui_stream.c +++ b/app/src/ui_stream.c @@ -162,8 +162,9 @@ cb(unsigned int button_mask, change_screen_right(); break; case BUTTON_EVT_RELEASED | BUTTON_LEFT | BUTTON_RIGHT: - if (cb_type) + if (cb_type) { s->cb(cb_type); + } if (cb_type & TZ_UI_STREAM_CB_MAINMASK) { global.step = ST_IDLE; ui_home_init(); @@ -201,14 +202,16 @@ display_init(bagl_element_t init[UI_INIT_ARRAY_LEN]) /* If we aren't on the first screen, we can go back */ if (s->current > 0) { /* Unless we can't... */ - if (s->current == s->total - TZ_UI_STREAM_HISTORY_SCREENS + 1) + if (s->current == s->total - TZ_UI_STREAM_HISTORY_SCREENS + 1) { init[1].text = (const char *)&C_icon_go_forbid; - else + } else { init[1].text = (const char *)&C_icon_go_left; + } } /* If we aren't full or aren't on the last page, we can go right */ - if (!s->full || s->current < s->total) + if (!s->full || s->current < s->total) { init[2].text = (const char *)&C_icon_go_right; + } DISPLAY(init, cb, UI_INIT_ARRAY_LEN) FUNC_LEAVE(); @@ -295,10 +298,11 @@ redisplay_screen(tz_ui_layout_type_t layout, uint8_t icon_pos) for (int i = txt_start_line + 1; i < UI_INIT_ARRAY_LEN; i++) { init[i].component = init[icon_pos + 1].component; init[i].component.font_id = BOLD; - if (i == txt_start_line + 1) + if (i == txt_start_line + 1) { init[i].text = s->screens[bucket].title; - else + } else { init[i].text = s->screens[bucket].body[i - 5]; + } init[i].component.x = 8; init[i].component.y = init[txt_start_line].component.y + 16 + 8 + ((i - 4) * 12); @@ -310,8 +314,9 @@ redisplay_screen(tz_ui_layout_type_t layout, uint8_t icon_pos) init[icon_pos].text = find_icon(icon); #ifdef TARGET_NANOS // Make sure text does not overflow on icon line in non-PB layouts. - if (layout != TZ_UI_LAYOUT_HOME_PB) + if (layout != TZ_UI_LAYOUT_HOME_PB) { init[icon_pos - 1].text = NULL; + } #endif } @@ -398,8 +403,9 @@ tz_ui_stream(void) FUNC_ENTER(("void")); tz_ui_stream_t *s = &global.stream; - if (s->pressed_right) + if (s->pressed_right) { succ(); + } redisplay(); FUNC_LEAVE(); @@ -414,8 +420,9 @@ tz_ui_max_line_chars(const char *value, int length) /* Wrap on newline */ const char *tmp = memchr(value, '\n', will_fit); - if (tmp && (tmp - value) <= will_fit) + if (tmp && (tmp - value) <= will_fit) { will_fit = (tmp - value); + } #ifdef TARGET_NANOS will_fit = se_get_cropped_length(value, will_fit, BAGL_WIDTH, @@ -467,8 +474,9 @@ tz_ui_stream_pushl(tz_ui_cb_type_t cb_type, const char *title, } /* drop the previous screen text in our bucket */ - if (s->total > 0 && bucket == (s->last % TZ_UI_STREAM_HISTORY_SCREENS)) + if (s->total > 0 && bucket == (s->last % TZ_UI_STREAM_HISTORY_SCREENS)) { drop_last_screen(); + } push_str(title, strlen(title), &s->screens[bucket].title); @@ -476,8 +484,9 @@ tz_ui_stream_pushl(tz_ui_cb_type_t cb_type, const char *title, size_t length = strlen(value); size_t offset = 0; - if (max != -1) + if (max != -1) { length = MIN(length, (size_t)max); + } s->screens[bucket].cb_type = cb_type; s->screens[bucket].layout_type = layout_type; @@ -487,8 +496,9 @@ tz_ui_stream_pushl(tz_ui_cb_type_t cb_type, const char *title, while (offset < length && line < TZ_UI_STREAM_CONTENTS_LINES) { uint8_t will_fit; - if (value[offset] == '\n') + if (value[offset] == '\n') { offset++; + } will_fit = tz_ui_max_line_chars(&value[offset], length - offset); @@ -507,13 +517,14 @@ tz_ui_stream_pushl(tz_ui_cb_type_t cb_type, const char *title, PRINTF("[DEBUG] tz_ui_stream_pushl(%s, %s, %u)\n", title, value, max); PRINTF("[DEBUG] bucket %d\n", bucket); PRINTF("[DEBUG] title: \"%s\"\n", s->screens[bucket].title); - for (line = 0; line < TZ_UI_STREAM_CONTENTS_LINES; line++) + for (line = 0; line < TZ_UI_STREAM_CONTENTS_LINES; line++) { if (s->screens[bucket].body[line]) { PRINTF("[DEBUG] value[%d]: \"%s\"\n", line, s->screens[bucket].body[line]); } else { PRINTF("[DEBUG] value[%d]: \"\"\n", line); } + } PRINTF("[DEBUG] total: %d -> %d\n", prev_total, s->total); PRINTF("[DEBUG] current: %d -> %d\n", prev_current, s->current); PRINTF("[DEBUG] last: %d -> %d\n", prev_last, s->last); @@ -532,8 +543,9 @@ drop_last_screen(void) TZ_PREAMBLE(("last: %d", s->last)); size_t i; - if (s->screens[bucket].title) + if (s->screens[bucket].title) { TZ_CHECK(ui_strings_drop(&s->screens[bucket].title)); + } for (i = 0; i < TZ_UI_STREAM_CONTENTS_LINES; i++) { if (s->screens[bucket].body[i]) { TZ_CHECK(ui_strings_drop(&s->screens[bucket].body[i])); diff --git a/app/src/ui_stream_nbgl.c b/app/src/ui_stream_nbgl.c index 804d8e966..7381a8182 100644 --- a/app/src/ui_stream_nbgl.c +++ b/app/src/ui_stream_nbgl.c @@ -107,8 +107,9 @@ handle_blindsigning(bool confirm) { TZ_PREAMBLE(("void")); if (confirm) { - if (!N_settings.blindsigning) + if (!N_settings.blindsigning) { toggle_blindsigning(); + } nbgl_useCaseStatus("BLIND SIGNING\nENABLED", true, blindsign_splash); } else { tz_reject_ui(); @@ -157,8 +158,9 @@ handle_expert_mode(bool confirm) { TZ_PREAMBLE(("void")); if (confirm) { - if (!N_settings.expert_mode) + if (!N_settings.expert_mode) { toggle_expert_mode(); + } nbgl_useCaseStatus("EXPERT MODE\nENABLED", true, tz_ui_stream_start); @@ -243,8 +245,9 @@ tz_ui_stream(void) tz_ui_stream_t *s = &global.stream; FUNC_ENTER(("void")); - if (s->stream_cb) + if (s->stream_cb) { s->stream_cb(); + } FUNC_LEAVE(); return; @@ -468,15 +471,18 @@ tz_ui_stream_pushl(tz_ui_cb_type_t cb_type, const char *title, } if (idx > 0 - && 0 == strcmp(title, s->screens[bucket].pairs[idx - 1].item)) + && 0 == strcmp(title, s->screens[bucket].pairs[idx - 1].item)) { append = true; + } - if (!append) + if (!append) { push_str(title, strlen(title), (char **)&s->screens[bucket].pairs[idx].item); + } - if (max != -1) + if (max != -1) { length = MIN(length, (size_t)max); + } if (idx == 0) { s->screens[bucket].cb_type = cb_type; @@ -487,8 +493,9 @@ tz_ui_stream_pushl(tz_ui_cb_type_t cb_type, const char *title, if (append) { bool can_fit = false; ui_strings_can_fit(length, &can_fit); - if (!can_fit) + if (!can_fit) { drop_last_screen(); + } offset = ui_strings_append_last(&value[offset], length, &out); idx--; @@ -575,12 +582,14 @@ drop_last_screen(void) TZ_PREAMBLE(("last: %d", s->last)); for (i = 0; i < s->screens[bucket].nb_pairs; i++) { - if (s->screens[bucket].pairs[i].item) + if (s->screens[bucket].pairs[i].item) { TZ_CHECK( ui_strings_drop((char **)&s->screens[bucket].pairs[i].item)); - if (s->screens[bucket].pairs[i].value) + } + if (s->screens[bucket].pairs[i].value) { TZ_CHECK( ui_strings_drop((char **)&s->screens[bucket].pairs[i].value)); + } } s->screens[bucket].nb_pairs = 0; diff --git a/app/src/ui_strings.c b/app/src/ui_strings.c index 5003f94c9..bcd814a89 100644 --- a/app/src/ui_strings.c +++ b/app/src/ui_strings.c @@ -165,8 +165,9 @@ ui_strings_push(const char *in, size_t len, char **out) s->end = ws + len + 1; - if (s->end > s->internal_end) + if (s->end > s->internal_end) { s->internal_end = s->end; + } *out = ws; PRINTF("[DEBUG] Pushed '%s' to %p\n", *out, *out); @@ -303,8 +304,9 @@ ui_strings_append_last(const char *str, size_t max, char **out) s->end += appended; - if (s->end > s->start) + if (s->end > s->start) { s->internal_end = s->end; + } PRINTF("[DEBUG] appended=%d, end=%p, out=%p, end?=%p\n", appended, s->end, *out, *out + appended); @@ -368,8 +370,9 @@ ui_strings_print(void) PRINTF("[DEBUG] START\tstart->\t%p %s\n", s->start, s->start); while (true) { ui_strings_next(&p); - if (!p) + if (!p) { break; + } PRINTF("[DEBUG] \t\t%p %s\n", p, p); } if (s->end < BUFF_END) { @@ -395,10 +398,11 @@ ui_strings_print(void) PRINTF("[DEBUG] \tstart->\t%p %s\n", p, p); while (true) { ui_strings_next(&p); - if (p >= s->start) + if (p >= s->start) { PRINTF("[DEBUG] \t\t%p %s\n", p, p); - else + } else { break; + } } PRINTF("[DEBUG] END\t\t%p\n", BUFF_END); } else { @@ -407,8 +411,9 @@ ui_strings_print(void) PRINTF("[DEBUG] \tstart->\t%p %s\n", p, p); while (true) { ui_strings_next(&p); - if (!p) + if (!p) { break; + } PRINTF("[DEBUG] \t\t%p %s\n", p, p); } if (s->end < BUFF_END) { diff --git a/app/src/utils.h b/app/src/utils.h index bab8b4cde..db22e0f21 100644 --- a/app/src/utils.h +++ b/app/src/utils.h @@ -21,17 +21,19 @@ PRINTF x; \ PRINTF(") at %s:%u\n", __FILE__, __LINE__); \ PRINTF("[DEBUG] stack = 0x%p (%s)\n", &_tmp, __func__); \ - if (app_stack_canary != 0xDEADBEEFu) \ + if (app_stack_canary != 0xDEADBEEFu) { \ PRINTF("[DEBUG] Stack (0x%p) has been smashed\n", \ &app_stack_canary); \ + } \ } while (0) #define FUNC_LEAVE() \ do { \ - if (app_stack_canary != 0xDEADBEEFu) \ + if (app_stack_canary != 0xDEADBEEFu) { \ PRINTF( \ "[DEBUG] Stack (0x%p) has been smashed " \ "(leaving function)\n", \ &app_stack_canary); \ + } \ PRINTF("[DEBUG] leave %s\n", __func__); \ } while (0) #else diff --git a/tests/unit/ctest/tests_parser.c b/tests/unit/ctest/tests_parser.c index 282ccc024..5e3c75a60 100644 --- a/tests/unit/ctest/tests_parser.c +++ b/tests/unit/ctest/tests_parser.c @@ -98,8 +98,9 @@ check_field_complexity(struct ctest_operation_parser_data *data, char *str, bool already_seen = false; while (true) { - while (!TZ_IS_BLOCKED(tz_operation_parser_step(st))) - ; + while (!TZ_IS_BLOCKED(tz_operation_parser_step(st))) { + // Loop while the result is successful and not blocking + } switch (st->errno) { case TZ_BLO_FEED_ME: @@ -144,11 +145,12 @@ check_field_complexity(struct ctest_operation_parser_data *data, char *str, continue; case TZ_BLO_DONE: - if (fields_check_len != idx + 1) + if (fields_check_len != idx + 1) { CTEST_ERR( "%s:%d all the field have not been seen, %d fields " "expected but got %d seen", __FILE__, __LINE__, (int)fields_check_len, (int)idx); + } ASSERT_TRUE(result); break; diff --git a/tests/unit/parser/micheline_cparse_stubs.c b/tests/unit/parser/micheline_cparse_stubs.c index 3303287b0..9c172c371 100644 --- a/tests/unit/parser/micheline_cparse_stubs.c +++ b/tests/unit/parser/micheline_cparse_stubs.c @@ -41,8 +41,9 @@ micheline_cparse_init(value size) *((tz_parser_state **)Data_abstract_val(r)) = state; tz_micheline_parser_init(state); size_t s = Long_val(size); - if (s >= 0xFFFF) + if (s >= 0xFFFF) { caml_failwith("micheline_cparse_init: size too large"); + } tz_operation_parser_init(state, (uint16_t)s, 1); CAMLreturn(r); } @@ -71,8 +72,9 @@ micheline_cparse_step(value mlstate, value input, value output) state->regs.oofs = oofs; state->regs.olen = olen; - while (!TZ_IS_BLOCKED(tz_micheline_parser_step(state))) - ; + while (!TZ_IS_BLOCKED(tz_micheline_parser_step(state))) { + // Loop while the result is successful and not blocking + } int read = ilen - state->regs.ilen; int written = olen - state->regs.olen; @@ -137,8 +139,9 @@ operation_cparse_step(value mlstate, value input, value output) state->regs.oofs = oofs; state->regs.olen = olen; - while (!TZ_IS_BLOCKED(tz_operation_parser_step(state))) - ; + while (!TZ_IS_BLOCKED(tz_operation_parser_step(state))) { + // Loop while the result is successful and not blocking + } int read = ilen - state->regs.ilen; int written = olen - state->regs.olen; From 389ee57c0476c51f4eb0db7e76501e3c29b9a606 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Tue, 13 Feb 2024 14:12:53 +0100 Subject: [PATCH 09/38] Style: explicit the precedence of operators [misra-c2012-12.1] The precedence of operators within expressions should be made explicit --- app/src/apdu_pubkey.c | 4 ++-- app/src/apdu_sign.c | 33 +++++++++++++++--------------- app/src/handle_swap.c | 6 +++--- app/src/keys.h | 3 ++- app/src/parser/formatting.c | 6 +++--- app/src/parser/formatting.h | 6 +++--- app/src/parser/micheline_parser.c | 24 +++++++++++----------- app/src/parser/num_parser.c | 10 ++++----- app/src/parser/operation_parser.c | 15 +++++++------- app/src/ui_stream.c | 34 ++++++++++++++++--------------- app/src/ui_stream_nbgl.c | 30 +++++++++++++-------------- app/src/ui_strings.c | 15 ++++++++------ tests/unit/ctest/tests_parser.c | 12 +++++------ 13 files changed, 103 insertions(+), 95 deletions(-) diff --git a/app/src/apdu_pubkey.c b/app/src/apdu_pubkey.c index 7fa5d4e89..57c76c6ca 100644 --- a/app/src/apdu_pubkey.c +++ b/app/src/apdu_pubkey.c @@ -172,13 +172,13 @@ handle_apdu_get_public_key(command_t *cmd) TZ_PREAMBLE(("cmd=%p", cmd)); TZ_ASSERT(EXC_UNEXPECTED_STATE, - global.step == ST_IDLE || global.step == ST_SWAP_SIGN); + (global.step == ST_IDLE) || (global.step == ST_SWAP_SIGN)); TZ_ASSERT(EXC_WRONG_PARAM, cmd->p1 == 0); // do not expose pks without prompt through U2F (permissionless legacy // comm in browser) TZ_ASSERT(EXC_HID_REQUIRED, - prompt || G_io_apdu_media != IO_APDU_MEDIA_U2F); + prompt || (G_io_apdu_media != IO_APDU_MEDIA_U2F)); global.path_with_curve.derivation_type = cmd->p2; TZ_ASSERT(EXC_WRONG_PARAM, diff --git a/app/src/apdu_sign.c b/app/src/apdu_sign.c index 0a8bb2f2f..7a4ebbe24 100644 --- a/app/src/apdu_sign.c +++ b/app/src/apdu_sign.c @@ -142,8 +142,8 @@ send_continue(void) { TZ_PREAMBLE(("void")); - APDU_SIGN_ASSERT(global.keys.apdu.sign.step == SIGN_ST_WAIT_USER_INPUT - || global.keys.apdu.sign.step == SIGN_ST_WAIT_DATA); + APDU_SIGN_ASSERT((global.keys.apdu.sign.step == SIGN_ST_WAIT_USER_INPUT) + || (global.keys.apdu.sign.step == SIGN_ST_WAIT_DATA)); APDU_SIGN_ASSERT(!global.keys.apdu.sign.received_last_msg); if (global.keys.apdu.sign.u.clear.received_msg) { @@ -183,8 +183,8 @@ refill_blo_im_full(void) goto end; } else { if (st->field_info.is_field_complex - && global.keys.apdu.sign.u.clear.last_field_index - != st->field_info.field_index) { + && (global.keys.apdu.sign.u.clear.last_field_index + != st->field_info.field_index)) { tz_ui_stream_push(TZ_UI_STREAM_CB_NOCB, "Next field requires", "careful review", TZ_UI_LAYOUT_HOME_BP, TZ_UI_ICON_NONE); @@ -200,8 +200,8 @@ refill_blo_im_full(void) PRINTF("[DEBUG] field=%s complex=%d\n", st->field_info.field_name, st->field_info.is_field_complex); if (st->field_info.is_field_complex - && global.keys.apdu.sign.u.clear.last_field_index - != st->field_info.field_index) { + && (global.keys.apdu.sign.u.clear.last_field_index + != st->field_info.field_index)) { global.keys.apdu.sign.u.clear.last_field_index = st->field_info.field_index; if (!N_settings.expert_mode) { @@ -231,8 +231,9 @@ refill_blo_done(void) tz_parser_state *st = &global.keys.apdu.sign.u.clear.parser_state; TZ_PREAMBLE(("void")); - TZ_ASSERT(EXC_UNEXPECTED_STATE, - global.keys.apdu.sign.received_last_msg && st->regs.ilen == 0); + TZ_ASSERT( + EXC_UNEXPECTED_STATE, + (global.keys.apdu.sign.received_last_msg && st->regs.ilen) == 0); global.keys.apdu.sign.u.clear.received_msg = false; if (st->regs.oofs != 0) { @@ -464,8 +465,8 @@ handle_first_apdu(command_t *cmd) TZ_CHECK(handle_first_apdu_clear(cmd)); - TZ_ASSERT(EXC_UNEXPECTED_STATE, - global.step == ST_CLEAR_SIGN || global.step == ST_SWAP_SIGN); + TZ_ASSERT(EXC_UNEXPECTED_STATE, (global.step == ST_CLEAR_SIGN) + || (global.step == ST_SWAP_SIGN)); io_send_sw(SW_OK); global.keys.apdu.sign.step = SIGN_ST_WAIT_DATA; @@ -581,8 +582,8 @@ handle_data_apdu_clear(command_t *cmd) } while (global.keys.apdu.sign.u.clear.received_msg); } else { TZ_CHECK(refill()); - if (global.keys.apdu.sign.step == SIGN_ST_WAIT_USER_INPUT - && global.step != ST_SWAP_SIGN) { + if ((global.keys.apdu.sign.step == SIGN_ST_WAIT_USER_INPUT) + && (global.step != ST_SWAP_SIGN)) { tz_ui_stream(); } } @@ -739,7 +740,7 @@ handle_apdu_sign(command_t *cmd) if (PKT_IS_FIRST(cmd)) { TZ_ASSERT(EXC_UNEXPECTED_STATE, - global.step == ST_IDLE || global.step == ST_SWAP_SIGN); + (global.step == ST_IDLE) || (global.step == ST_SWAP_SIGN)); memset(&global.keys, 0, sizeof(global.keys)); TZ_CHECK(handle_first_apdu(cmd)); @@ -747,9 +748,9 @@ handle_apdu_sign(command_t *cmd) goto end; } - TZ_ASSERT(EXC_UNEXPECTED_STATE, global.step == ST_BLIND_SIGN - || global.step == ST_CLEAR_SIGN - || global.step == ST_SWAP_SIGN); + TZ_ASSERT(EXC_UNEXPECTED_STATE, (global.step == ST_BLIND_SIGN) + || (global.step == ST_CLEAR_SIGN) + || (global.step == ST_SWAP_SIGN)); TZ_ASSERT(EXC_INVALID_INS, return_hash == global.keys.apdu.sign.return_hash); TZ_CHECK(handle_data_apdu(cmd)); diff --git a/app/src/handle_swap.c b/app/src/handle_swap.c index 21ecff369..4c88bef1e 100644 --- a/app/src/handle_swap.c +++ b/app/src/handle_swap.c @@ -52,8 +52,8 @@ swap_handle_check_address(check_address_parameters_t *params) goto bail; } - if (params->address_parameters_length == 0 - || params->address_parameters == NULL) { + if ((params->address_parameters_length == 0) + || (params->address_parameters == NULL)) { PRINTF("[ERROR] Address parameters is null\n"); goto bail; } @@ -201,7 +201,7 @@ swap_check_validity(void) PRINTF("[DEBUG] batch_index = %u, nb_reveal=%d, tag=%d\n", op->batch_index, op->nb_reveal, op->last_tag); TZ_ASSERT(EXC_REJECT, op->nb_reveal <= 1); - TZ_ASSERT(EXC_REJECT, op->batch_index - op->nb_reveal == 1); + TZ_ASSERT(EXC_REJECT, (op->batch_index - op->nb_reveal) == 1); TZ_ASSERT(EXC_REJECT, op->last_tag == TZ_OPERATION_TAG_TRANSACTION); TZ_ASSERT(EXC_REJECT, op->last_amount == G_swap_params.amount); TZ_ASSERT(EXC_REJECT, op->last_fee == G_swap_params.fee); diff --git a/app/src/keys.h b/app/src/keys.h index d9a1084fd..84c8a27ec 100644 --- a/app/src/keys.h +++ b/app/src/keys.h @@ -67,5 +67,6 @@ void sign(derivation_type_t derivation_type, const bip32_path_t *path, static inline bool check_derivation_type(derivation_type_t code) { - return (code >= DERIVATION_TYPE_ED25519 && code < DERIVATION_TYPE_MAX); + return ((code >= DERIVATION_TYPE_ED25519) + && (code < DERIVATION_TYPE_MAX)); } diff --git a/app/src/parser/formatting.c b/app/src/parser/formatting.c index 0b51ff45d..01cbc6696 100644 --- a/app/src/parser/formatting.c +++ b/app/src/parser/formatting.c @@ -217,7 +217,7 @@ tz_format_base58(const uint8_t *n, size_t l, char *obuf, size_t olen) memset(obuf, 0, obuf_len); - while (zcount < l && !n[zcount]) { + while ((zcount < l) && !n[zcount]) { ++zcount; } @@ -258,7 +258,7 @@ tz_format_decimal(const uint8_t *n, size_t l, char *obuf, size_t olen) memset(obuf, 0, obuf_len); - while (zcount < l && !n[l - zcount - 1]) { + while ((zcount < l) && !n[l - zcount - 1]) { ++zcount; } @@ -400,7 +400,7 @@ tz_format_base58check(const char *sprefix, const uint8_t *data, size_t size, /* In order to avoid vla, we have a maximum buffer size of 64 */ uint8_t prepared[64]; - if (prefix_len + size + 4 > sizeof(prepared)) { + if ((prefix_len + size + 4) > sizeof(prepared)) { PRINTF( "[WARNING] tz_format_base58check() failed: fixed size " "array is too small need: %u\n", diff --git a/app/src/parser/formatting.h b/app/src/parser/formatting.h index 38d6c2275..121e714e2 100644 --- a/app/src/parser/formatting.h +++ b/app/src/parser/formatting.h @@ -193,13 +193,13 @@ typedef enum { // output buffer `obuf` must be at least `DECIMAL_BUFFER_SIZE(l)` // (caller responsibility). int tz_format_decimal(const uint8_t *n, size_t l, char *obuf, size_t olen); -#define TZ_DECIMAL_BUFFER_SIZE(_l) ((_l)*241 / 100 + 1) +#define TZ_DECIMAL_BUFFER_SIZE(_l) ((((_l)*241) / 100) + 1) // Formats a data `n` of size `l` in base58 using Tezos' alphabet // order (same as Bitcoin). The output buffer `obuf` must be at least // `BASE58_BUFFER_SIZE(l)` (caller responsibility). int tz_format_base58(const uint8_t *n, size_t l, char *obuf, size_t olen); -#define TZ_BASE58_BUFFER_SIZE(_l) ((_l)*138 / 100 + 1) +#define TZ_BASE58_BUFFER_SIZE(_l) ((((_l)*138) / 100) + 1) // Looks up the prefix from the provided string (arg1), e.g. "B", // "o", "expr", "tz2", etc. This indexes into a table which finds @@ -212,7 +212,7 @@ int tz_format_base58(const uint8_t *n, size_t l, char *obuf, size_t olen); int tz_format_base58check(const char *prefix, const uint8_t *ibuf, size_t ilen, char *obuf, size_t olen); #define TZ_BASE58CHECK_BUFFER_SIZE(_l, _p) \ - TZ_BASE58_BUFFER_SIZE((_p) + (_l) + 4) + TZ_BASE58_BUFFER_SIZE(((_p) + (_l)) + 4) // Some Tezos-specific base58check formatters. These functions // deconstruct the Tezos binary header to figure out the kind within diff --git a/app/src/parser/micheline_parser.c b/app/src/parser/micheline_parser.c index 4644b0a04..36be70674 100644 --- a/app/src/parser/micheline_parser.c +++ b/app/src/parser/micheline_parser.c @@ -102,9 +102,9 @@ print_escaped(tz_parser_state *state, uint8_t b) case '\n': strncpy(buf,"\\n",TZ_CAPTURE_BUFFER_SIZE); break; case '\t': strncpy(buf,"\\t",TZ_CAPTURE_BUFFER_SIZE); break; default: - buf[0] = '0' + b/100; - buf[1] = '0' + (b/10)%10; - buf[2] = '0' + b%10; + buf[0] = '0' + (b/100); + buf[1] = '0' + ((b/10)%10); + buf[2] = '0' + (b%10); buf[3] = 0; break; } @@ -131,7 +131,7 @@ tag_selection(tz_parser_state *state, uint8_t t) case TZ_MICHELINE_TAG_INT: m->frame->step = TZ_MICHELINE_STEP_INT; tz_parse_num_state_init(&state->buffers.num, &m->frame->step_int); - for (int i = 0; i < TZ_NUM_BUFFER_SIZE / 8; i++) { + for (int i = 0; i < (TZ_NUM_BUFFER_SIZE / 8); i++) { state->buffers.num.bytes[i] = 0; } break; @@ -160,12 +160,12 @@ tag_selection(tz_parser_state *state, uint8_t t) nargs = (t - 3) >> 1; annot = (~t & 1); wrap = (m->frame > m->stack) - && m->frame[-1].step == TZ_MICHELINE_STEP_PRIM - && (nargs > 0 || annot); + && (m->frame[-1].step == TZ_MICHELINE_STEP_PRIM) + && ((nargs > 0) || annot); goto common_prim; case TZ_MICHELINE_TAG_PRIM_N: wrap = (m->frame > m->stack) - && m->frame[-1].step == TZ_MICHELINE_STEP_PRIM; + && (m->frame[-1].step == TZ_MICHELINE_STEP_PRIM); nargs = 3; annot = true; common_prim: @@ -233,7 +233,7 @@ tz_micheline_parser_step(tz_parser_state *state) if (m->frame->step_size.size > 255) { tz_raise(TOO_LARGE); // enforce 16-bit restriction } - m->frame->step_size.size = m->frame->step_size.size << 8 | b; + m->frame->step_size.size = (m->frame->step_size.size << 8) | b; if (m->frame->stop == state->ofs) { m->frame[-1].stop = state->ofs + m->frame->step_size.size; tz_must(pop_frame(state)); @@ -298,7 +298,7 @@ tz_micheline_parser_step(tz_parser_state *state) tz_must(pop_frame(state)); } else { tz_must(tz_parser_peek(state, &b)); - if (b >= 0x20 && b < 0x80 && b != '\"' && b != '\\') { + if ((b >= 0x20) && (b < 0x80) && (b != '\"') && (b != '\\')) { tz_must(parser_put(state, b)); tz_parser_skip(state); } else { @@ -352,9 +352,9 @@ tz_micheline_parser_step(tz_parser_state *state) } break; case TZ_MICHELINE_STEP_PRIM: - if (m->frame->step_prim.nargs == 0 - || (m->frame->step_prim.nargs == 3 - && m->frame->stop == state->ofs)) { + if ((m->frame->step_prim.nargs == 0) + || ((m->frame->step_prim.nargs == 3) + && (m->frame->stop == state->ofs))) { if (m->frame->step_prim.annot) { m->frame->step_prim.annot = false; tz_must(push_frame(state, TZ_MICHELINE_STEP_ANNOT)); diff --git a/app/src/parser/num_parser.c b/app/src/parser/num_parser.c index 9f307d3c7..67f41decf 100644 --- a/app/src/parser/num_parser.c +++ b/app/src/parser/num_parser.c @@ -33,7 +33,7 @@ tz_parse_num_step(tz_num_parser_buffer *buffers, tz_num_parser_regs *regs, { uint8_t v, cont, s; cont = b >> 7; - if (regs->size == 0 && !natural) { + if ((regs->size == 0) && !natural) { v = b & 0x3F; regs->sign = (b >> 6) & 1; s = 6; @@ -46,7 +46,7 @@ tz_parse_num_step(tz_num_parser_buffer *buffers, tz_num_parser_regs *regs, int lo_idx = regs->size / 8; int hi_idx = lo_idx + 1; buffers->bytes[lo_idx] |= lo; - if (hi_idx >= TZ_NUM_BUFFER_SIZE / 8) { + if (hi_idx >= (TZ_NUM_BUFFER_SIZE / 8)) { // accept and dismiss a few trailing zeroes if (hi || cont) { return TZ_ERR_TOO_LARGE; @@ -81,18 +81,18 @@ tz_parse_nat_step(tz_num_parser_buffer *buffers, tz_num_parser_regs *regs, bool tz_string_to_mutez(const char *str, uint64_t *res) { - if (str == NULL || res == NULL) { + if ((str == NULL) || (res == NULL)) { PRINTF("[ERROR] Null parameter\n"); return false; } *res = 0; for (int i = 0; str[i] != '\0'; i++) { - if (str[i] < '0' || str[i] > '9') { + if ((str[i] < '0') || (str[i] > '9')) { PRINTF("[ERROR] Non-digit character: %c\n", str[i]); return false; } - *res = *res * 10 + (str[i] - '0'); + *res = (*res * 10) + (str[i] - '0'); } return true; diff --git a/app/src/parser/operation_parser.c b/app/src/parser/operation_parser.c index 5b7cec30a..8fbf23552 100644 --- a/app/src/parser/operation_parser.c +++ b/app/src/parser/operation_parser.c @@ -417,7 +417,7 @@ tz_step_size(tz_parser_state *state) if (op->frame->step_size.size > 255) { tz_raise(TOO_LARGE); // enforce 16-bit restriction } - op->frame->step_size.size = op->frame->step_size.size << 8 | b; + op->frame->step_size.size = (op->frame->step_size.size << 8) | b; op->frame->step_size.size_len--; if (op->frame->step_size.size_len <= 0) { op->frame[-1].stop = state->ofs + op->frame->step_size.size; @@ -471,7 +471,7 @@ tz_step_read_micheline(tz_parser_state *state) } tz_micheline_parser_step(state); if (state->errno == TZ_BLO_DONE) { - if (op->frame->stop != 0 && state->ofs != op->frame->stop) { + if ((op->frame->stop != 0) && (state->ofs != op->frame->stop)) { tz_raise(TOO_LARGE); } tz_must(pop_frame(state)); @@ -528,7 +528,7 @@ tz_step_read_num(tz_parser_state *state) while (str[len]) { len++; } - if (len == 1 && str[0] == 0) { + if ((len == 1) && (str[0] == 0)) { // just 0 goto add_currency; } @@ -593,7 +593,7 @@ tz_step_read_int32(tz_parser_state *state) uint32_t *value = &op->frame->step_read_int32.value; if (op->frame->step_read_int32.ofs < 4) { tz_must(tz_parser_read(state, &b)); - *value = *value << 8 | b; + *value = (*value << 8) | b; op->frame->step_read_int32.ofs++; } else { snprintf((char *)CAPTURE, sizeof(CAPTURE), "%d", *value); @@ -737,7 +737,7 @@ tz_step_read_binary(tz_parser_state *state) if (state->ofs == op->frame->stop) { CAPTURE[op->frame->step_read_string.ofs] = 0; tz_must(tz_print_string(state)); - } else if (op->frame->step_read_string.ofs + 2 + } else if ((op->frame->step_read_string.ofs + 2) >= TZ_CAPTURE_BUFFER_SIZE) { CAPTURE[op->frame->step_read_string.ofs] = 0; op->frame->step_read_string.ofs = 0; @@ -1120,8 +1120,9 @@ tz_step_read_protos(tz_parser_state *state) static tz_parser_result tz_step_print(tz_parser_state *state, bool partial) { - if (state->operation.frame->step != TZ_OPERATION_STEP_PRINT - && state->operation.frame->step != TZ_OPERATION_STEP_PARTIAL_PRINT) { + if ((state->operation.frame->step != TZ_OPERATION_STEP_PRINT) + && (state->operation.frame->step + != TZ_OPERATION_STEP_PARTIAL_PRINT)) { PRINTF("[DEBUG] expected step %s or step %s but got step %s)\n", STRING_STEP(TZ_OPERATION_STEP_PRINT), STRING_STEP(TZ_OPERATION_STEP_PARTIAL_PRINT), diff --git a/app/src/ui_stream.c b/app/src/ui_stream.c index e4a4fa8ca..00d7f5d22 100644 --- a/app/src/ui_stream.c +++ b/app/src/ui_stream.c @@ -122,7 +122,7 @@ pred(void) tz_ui_stream_t *s = &global.stream; FUNC_ENTER(("void")); - if (s->current >= 1 && s->current > s->last) { + if ((s->current >= 1) && (s->current > s->last)) { s->current--; } FUNC_LEAVE(); @@ -202,14 +202,14 @@ display_init(bagl_element_t init[UI_INIT_ARRAY_LEN]) /* If we aren't on the first screen, we can go back */ if (s->current > 0) { /* Unless we can't... */ - if (s->current == s->total - TZ_UI_STREAM_HISTORY_SCREENS + 1) { + if (s->current == (s->total - TZ_UI_STREAM_HISTORY_SCREENS + 1)) { init[1].text = (const char *)&C_icon_go_forbid; } else { init[1].text = (const char *)&C_icon_go_left; } } /* If we aren't full or aren't on the last page, we can go right */ - if (!s->full || s->current < s->total) { + if (!s->full || (s->current < s->total)) { init[2].text = (const char *)&C_icon_go_right; } @@ -276,29 +276,30 @@ redisplay_screen(tz_ui_layout_type_t layout, uint8_t icon_pos) = 3; /// first three lines are for black rectangle, left screen icon /// and right screen icon. - if (layout == TZ_UI_LAYOUT_BP || layout == TZ_UI_LAYOUT_HOME_BP) { + if ((layout == TZ_UI_LAYOUT_BP) || (layout == TZ_UI_LAYOUT_HOME_BP)) { // Change the contents to bold. for (int i = txt_start_line + 1; i < icon_pos; i++) { init[i].component.font_id = BOLD; } - } else if (layout == TZ_UI_LAYOUT_NP || layout == TZ_UI_LAYOUT_HOME_NP) { + } else if ((layout == TZ_UI_LAYOUT_NP) + || (layout == TZ_UI_LAYOUT_HOME_NP)) { // Set title to Regular. init[txt_start_line].component.font_id = REGULAR; } else if (layout == TZ_UI_LAYOUT_HOME_PB) { // Icon will be at txt_start_line. // modify the x,y coordinates for index txt_start_line to end. init[txt_start_line].component = init[icon_pos].component; - init[txt_start_line].component.x = BAGL_WIDTH / 2 - 8; + init[txt_start_line].component.x = (BAGL_WIDTH / 2) - 8; #ifdef TARGET_NANOS - init[txt_start_line].component.y = BAGL_HEIGHT / 2 - 14; + init[txt_start_line].component.y = (BAGL_HEIGHT / 2) - 14; #else - init[txt_start_line].component.y = BAGL_HEIGHT / 2 - 20; + init[txt_start_line].component.y = (BAGL_HEIGHT / 2) - 20; #endif icon_pos = txt_start_line; for (int i = txt_start_line + 1; i < UI_INIT_ARRAY_LEN; i++) { init[i].component = init[icon_pos + 1].component; init[i].component.font_id = BOLD; - if (i == txt_start_line + 1) { + if (i == (txt_start_line + 1)) { init[i].text = s->screens[bucket].title; } else { init[i].text = s->screens[bucket].body[i - 5]; @@ -323,15 +324,15 @@ redisplay_screen(tz_ui_layout_type_t layout, uint8_t icon_pos) // if the screen layout type is home , set the left and right arrows to // middle of screen. if (layout & TZ_UI_LAYOUT_HOME_MASK) { - init[1].component.y = BAGL_HEIGHT / 2 - 3; - init[2].component.y = BAGL_HEIGHT / 2 - 3; + init[1].component.y = (BAGL_HEIGHT / 2) - 3; + init[2].component.y = (BAGL_HEIGHT / 2) - 3; // as icon_pos = txt_start_line in TZ_UI_LAYOUT_HOME_PB layout, // following changes dont affect it. for (int i = txt_start_line; i < icon_pos; i++) { init[i].component.x = 8; init[i].component.width = 112; init[i].component.y - = BAGL_HEIGHT / 2 - 3 + ((i - txt_start_line) * 13); + = (BAGL_HEIGHT / 2) - 3 + ((i - txt_start_line) * 13); } } @@ -369,7 +370,7 @@ change_screen_right(void) TZ_PREAMBLE(("void")); s->pressed_right = true; - if (!s->full && s->current == s->total) { + if (!s->full && (s->current == s->total)) { PRINTF("[DEBUG] Looping in change_screen_right\n"); s->cb(TZ_UI_STREAM_CB_REFILL); PRINTF("[DEBUG] step=%d\n", global.keys.apdu.sign.step); @@ -466,7 +467,7 @@ tz_ui_stream_pushl(tz_ui_cb_type_t cb_type, const char *title, s->total++; int bucket = s->total % TZ_UI_STREAM_HISTORY_SCREENS; - if (s->total > 0 + if ((s->total > 0) && (s->current % TZ_UI_STREAM_HISTORY_SCREENS) == bucket) { PRINTF( "[ERROR] PANIC!!!! Overwriting current screen, some bad things " @@ -474,7 +475,8 @@ tz_ui_stream_pushl(tz_ui_cb_type_t cb_type, const char *title, } /* drop the previous screen text in our bucket */ - if (s->total > 0 && bucket == (s->last % TZ_UI_STREAM_HISTORY_SCREENS)) { + if ((s->total > 0) + && (bucket == (s->last % TZ_UI_STREAM_HISTORY_SCREENS))) { drop_last_screen(); } @@ -493,7 +495,7 @@ tz_ui_stream_pushl(tz_ui_cb_type_t cb_type, const char *title, s->screens[bucket].icon = icon; int line = 0; - while (offset < length && line < TZ_UI_STREAM_CONTENTS_LINES) { + while ((offset < length) && (line < TZ_UI_STREAM_CONTENTS_LINES)) { uint8_t will_fit; if (value[offset] == '\n') { diff --git a/app/src/ui_stream_nbgl.c b/app/src/ui_stream_nbgl.c index 7381a8182..56015b81c 100644 --- a/app/src/ui_stream_nbgl.c +++ b/app/src/ui_stream_nbgl.c @@ -325,7 +325,7 @@ tz_ui_nav_cb(uint8_t page, nbgl_pageContent_t *content) "global.step= %d\n", s->pressed_right, s->current, s->total, s->full, global.step); - while ((s->total < 0 || (s->current == s->total && !s->full)) + while (((s->total < 0) || ((s->current == s->total) && !s->full)) && (st->errno < TZ_ERR_INVALID_TAG)) { PRINTF("tz_ui_nav_cb: Looping...\n"); tz_ui_continue(); @@ -451,17 +451,17 @@ tz_ui_stream_pushl(tz_ui_cb_type_t cb_type, const char *title, size_t offset = 0; size_t length = strlen(value); - if (s->total >= 0 - && (s->current % TZ_UI_STREAM_HISTORY_SCREENS) == bucket) { + if ((s->total >= 0) + && ((s->current % TZ_UI_STREAM_HISTORY_SCREENS) == bucket)) { PRINTF( "[ERROR] PANIC!!!! Overwriting current screen, some bad things " "are happening\n"); } - if ((cb_type == TZ_UI_STREAM_CB_CANCEL - || cb_type == TZ_UI_STREAM_CB_EXPERT_MODE_ENABLE - || cb_type == TZ_UI_STREAM_CB_EXPERT_MODE_FIELD) - && idx > 0) { + if (((cb_type == TZ_UI_STREAM_CB_CANCEL) + || (cb_type == TZ_UI_STREAM_CB_EXPERT_MODE_ENABLE) + || (cb_type == TZ_UI_STREAM_CB_EXPERT_MODE_FIELD)) + && (idx > 0)) { PRINTF("[DEBUG] PUSH_TO_NEXT: %x\n", cb_type); push_to_next = true; } else { @@ -470,8 +470,8 @@ tz_ui_stream_pushl(tz_ui_cb_type_t cb_type, const char *title, PRINTF("[ERROR] PANIC!!! we pushing to a screen that's full"); } - if (idx > 0 - && 0 == strcmp(title, s->screens[bucket].pairs[idx - 1].item)) { + if ((idx > 0) + && (0 == strcmp(title, s->screens[bucket].pairs[idx - 1].item))) { append = true; } @@ -525,7 +525,7 @@ tz_ui_stream_pushl(tz_ui_cb_type_t cb_type, const char *title, if (push_to_next) { /* We need to move to the next screen, retry */ - if (append && offset > 0) { + if (append && (offset > 0)) { ui_strings_drop_last(&out); } else { ui_strings_drop_last( @@ -539,12 +539,12 @@ tz_ui_stream_pushl(tz_ui_cb_type_t cb_type, const char *title, } if (push_to_next - || (!append && ++(s->screens[bucket].nb_pairs) == max_pairs) - || (append && offset == 0)) { + || (!append && (++(s->screens[bucket].nb_pairs) == max_pairs)) + || (append && (offset == 0))) { s->total++; - if (s->total > 0 - && s->total % TZ_UI_STREAM_HISTORY_SCREENS - == s->last % TZ_UI_STREAM_HISTORY_SCREENS) { + if ((s->total > 0) + && ((s->total % TZ_UI_STREAM_HISTORY_SCREENS) + == (s->last % TZ_UI_STREAM_HISTORY_SCREENS))) { drop_last_screen(); } } diff --git a/app/src/ui_strings.c b/app/src/ui_strings.c index bcd814a89..2ced007dd 100644 --- a/app/src/ui_strings.c +++ b/app/src/ui_strings.c @@ -95,13 +95,16 @@ ui_strings_fit_up_to(size_t len, char **write_start) } else if (s->start < s->end) { /* start < end */ size_t chars_at_start = MIN((size_t)(s->start - BUFF_START), len + 1); - chars_at_start - = chars_at_start > 0 ? chars_at_start - 1 : chars_at_start; + if (chars_at_start > 0) { + chars_at_start--; + } size_t chars_at_end = MIN((size_t)(BUFF_END - s->end), len + 1); - chars_at_end = chars_at_end > 0 ? chars_at_end - 1 : chars_at_end; + if (chars_at_end > 0) { + chars_at_end--; + } - if (chars_at_end == len || chars_at_end >= chars_at_start) { + if ((chars_at_end == len) || (chars_at_end >= chars_at_start)) { *write_start = s->end; out_len = chars_at_end; } else { @@ -236,7 +239,7 @@ ui_strings_drop_last(char **in) size_t len = strlen(*in); TZ_ASSERT(EXC_MEMORY_ERROR, (len > 0)); TZ_ASSERT(EXC_MEMORY_ERROR, (!ui_strings_is_empty())); - TZ_ASSERT(EXC_MEMORY_ERROR, (*in + len == s->end - 1)); + TZ_ASSERT(EXC_MEMORY_ERROR, ((*in + len) == (s->end - 1))); /* Internal checks */ TZ_ASSERT(EXC_MEMORY_ERROR, (s->start < s->internal_end)); TZ_ASSERT(EXC_MEMORY_ERROR, (s->end <= s->internal_end)); @@ -320,7 +323,7 @@ bool ui_strings_is_empty(void) { tz_ui_strings_t *s = UI_STRINGS; - return s->start == s->end && s->count == 0; /* check COUNT is zero! */ + return (s->start == s->end) && (s->count == 0); /* check COUNT is zero! */ } #ifdef TEZOS_DEBUG diff --git a/tests/unit/ctest/tests_parser.c b/tests/unit/ctest/tests_parser.c index 5e3c75a60..4721255c2 100644 --- a/tests/unit/ctest/tests_parser.c +++ b/tests/unit/ctest/tests_parser.c @@ -58,7 +58,7 @@ refill(struct ctest_operation_parser_data *data) { data->ilen = 0; while ( - (data->str_ofs < data->str_len || data->ilen < data->max_ilen) + ((data->str_ofs < data->str_len) || (data->ilen < data->max_ilen)) && sscanf(data->str + data->str_ofs, "%2hhx", &data->ibuf[data->ilen]) == 1) { data->str_ofs += 2; @@ -118,10 +118,10 @@ check_field_complexity(struct ctest_operation_parser_data *data, char *str, } if (strstr(st->field_info.field_name, fields_check[idx].name) != NULL) { - if (fields_check[idx].complex - != st->field_info.is_field_complex - || fields_check[idx].field_index - != st->field_info.field_index) { + if ((fields_check[idx].complex + != st->field_info.is_field_complex) + || (fields_check[idx].field_index + != st->field_info.field_index)) { CTEST_LOG( "%s:%d '%s' field expected to have complex: %s " "index: %d but " @@ -145,7 +145,7 @@ check_field_complexity(struct ctest_operation_parser_data *data, char *str, continue; case TZ_BLO_DONE: - if (fields_check_len != idx + 1) { + if (fields_check_len != (idx + 1)) { CTEST_ERR( "%s:%d all the field have not been seen, %d fields " "expected but got %d seen", From 36aef281768ee6f9fb78b9d811345d429cd30e9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Tue, 13 Feb 2024 14:23:03 +0100 Subject: [PATCH 10/38] Header guard: add the missing header guard to handle_swap.h to prevent it from being included twice --- app/src/handle_swap.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/handle_swap.h b/app/src/handle_swap.h index c1e6cc202..f20a3a041 100644 --- a/app/src/handle_swap.h +++ b/app/src/handle_swap.h @@ -20,4 +20,6 @@ See the License for the specific language governing permissions and limitations under the License. */ +#pragma once + void swap_check_validity(void); From 1af0de989c11c1354b0f85b927ca4a1d1bda2962 Mon Sep 17 00:00:00 2001 From: Ajinkya Rajandekar Date: Tue, 13 Feb 2024 17:14:14 +0000 Subject: [PATCH 11/38] Remove unused Ledger flags APPLICATION_FLAG_GLOBAL_PIN, APPLICATION_FLAG_BOLOS_SETTINGS --- app/Makefile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/Makefile b/app/Makefile index a842c50e0..47d50889a 100644 --- a/app/Makefile +++ b/app/Makefile @@ -135,10 +135,6 @@ CFLAGS += -Wwrite-strings ######################################## # See SDK `include/appflags.h` for the purpose of each permission #HAVE_APPLICATION_FLAG_DERIVE_MASTER = 1 -ifneq ($(TARGET_NAME), TARGET_NANOS) -HAVE_APPLICATION_FLAG_GLOBAL_PIN = 1 -HAVE_APPLICATION_FLAG_BOLOS_SETTINGS = 1 -endif HAVE_APPLICATION_FLAG_LIBRARY = 1 ######################################## From e2abf4914430c91cfe15db2786d165a672fd035b Mon Sep 17 00:00:00 2001 From: Ajinkya Rajandekar Date: Wed, 14 Feb 2024 11:11:16 +0000 Subject: [PATCH 12/38] Add new Oxford2 entrypoints --- app/src/parser/operation_parser.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/app/src/parser/operation_parser.c b/app/src/parser/operation_parser.c index 8fbf23552..5bcf464a7 100644 --- a/app/src/parser/operation_parser.c +++ b/app/src/parser/operation_parser.c @@ -788,6 +788,22 @@ tz_step_read_smart_entrypoint(tz_parser_state *state) strlcpy((char *)CAPTURE, "deposit", sizeof(CAPTURE)); tz_must(tz_print_string(state)); break; + case 6: + strlcpy((char *)CAPTURE, "stake", sizeof(CAPTURE)); + tz_must(tz_print_string(state)); + break; + case 7: + strlcpy((char *)CAPTURE, "unstake", sizeof(CAPTURE)); + tz_must(tz_print_string(state)); + break; + case 8: + strlcpy((char *)CAPTURE, "finalize_unstake", sizeof(CAPTURE)); + tz_must(tz_print_string(state)); + break; + case 9: + strlcpy((char *)CAPTURE, "set_delegate_parameters", sizeof(CAPTURE)); + tz_must(tz_print_string(state)); + break; case 0xFF: op->frame->step = TZ_OPERATION_STEP_READ_STRING; op->frame->step_read_string.ofs = 0; From 8a498c9bf6590c5724181e3d03970095981064d3 Mon Sep 17 00:00:00 2001 From: Ajinkya Rajandekar Date: Mon, 12 Feb 2024 16:19:07 +0000 Subject: [PATCH 13/38] Remove unnecessary comments --- app/src/apdu.c | 2 -- app/src/apdu.h | 2 -- app/src/apdu_sign.c | 5 +---- app/src/globals.h | 2 -- app/src/keys.c | 2 -- app/src/keys.h | 2 -- app/src/ui_stream.h | 4 +--- app/src/ui_strings.c | 3 --- tests/integration/test_runtime.sh | 1 - 9 files changed, 2 insertions(+), 21 deletions(-) diff --git a/app/src/apdu.c b/app/src/apdu.c index 9b97fc4a3..4715ede40 100644 --- a/app/src/apdu.c +++ b/app/src/apdu.c @@ -1,7 +1,5 @@ /* Tezos Ledger application - Some common primitives and some command handlers - TODO: split this file (apdu primitives and apdu handlers) - Copyright 2023 Nomadic Labs Copyright 2023 Trilitech diff --git a/app/src/apdu.h b/app/src/apdu.h index 5d6c85842..467567f78 100644 --- a/app/src/apdu.h +++ b/app/src/apdu.h @@ -1,7 +1,5 @@ /* Tezos Ledger application - Some common primitives and some command handlers - TODO: split this file (apdu primitives and apdu handlers) - Copyright 2023 Nomadic Labs With code excerpts from: diff --git a/app/src/apdu_sign.c b/app/src/apdu_sign.c index 7a4ebbe24..be7738ffc 100644 --- a/app/src/apdu_sign.c +++ b/app/src/apdu_sign.c @@ -115,11 +115,10 @@ sign_packet(void) &global.path_with_curve.bip32_path, bufs[0].ptr, bufs[0].size, sig, &bufs[1].size)); - /* If we aren't returning the hash, zero its buffer... */ + /* If we aren't returning the hash, zero its buffer. */ if (!global.keys.apdu.sign.return_hash) { bufs[0].size = 0; } - io_send_response_buffers(bufs, 2, SW_OK); global.step = ST_IDLE; @@ -724,8 +723,6 @@ handle_data_apdu_blind(void) STRLCPY(hash, obuf); continue_blindsign_cb(); #endif - - /* XXXrcd: the logic here need analysis. */ TZ_POSTAMBLE; } #undef FINAL_HASH diff --git a/app/src/globals.h b/app/src/globals.h index b0510da81..dc38e1e61 100644 --- a/app/src/globals.h +++ b/app/src/globals.h @@ -118,5 +118,3 @@ extern const settings_t N_settings_real; extern unsigned int app_stack_canary; // From SDK extern unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; - -// extern const uint32_t mainnet_chain_id = 0x7A06A770 // NetXdQprcVkpaWU diff --git a/app/src/keys.c b/app/src/keys.c index d5a7d5079..6991a3b34 100644 --- a/app/src/keys.c +++ b/app/src/keys.c @@ -1,7 +1,5 @@ /* Tezos Ledger application - Signature primitives - TODO: cleanup/refactor - Copyright 2023 Nomadic Labs Copyright 2023 Functori diff --git a/app/src/keys.h b/app/src/keys.h index 84c8a27ec..e5e587d66 100644 --- a/app/src/keys.h +++ b/app/src/keys.h @@ -1,7 +1,5 @@ /* Tezos Ledger application - Signature primitives - TODO: cleanup/refactor - Copyright 2023 Nomadic Labs With code excerpts from: diff --git a/app/src/ui_stream.h b/app/src/ui_stream.h index c320c26e7..564a47f44 100644 --- a/app/src/ui_stream.h +++ b/app/src/ui_stream.h @@ -151,9 +151,7 @@ typedef struct { int16_t total; int16_t last; bool full; - // FIXME: workaround for issue with non-local control flow. Remove once - // fixed see !66 - bool pressed_right; + bool pressed_right; #ifdef HAVE_NBGL tz_ui_stream_display_t current_screen; char verify_address[TZ_BASE58CHECK_BUFFER_SIZE(20, 3)]; diff --git a/app/src/ui_strings.c b/app/src/ui_strings.c index 2ced007dd..00bad70f0 100644 --- a/app/src/ui_strings.c +++ b/app/src/ui_strings.c @@ -136,9 +136,6 @@ ui_strings_can_fit(size_t len, bool *can_fit) /* @param in: ptr to char[] to copy into the buffer @param in_len: number of of chars to copy. in_len <= strlen(in) @param out: will be set to the start of the char[] in the buffer - - // TODO: for future, when appending is a possibility - @param out_len: strlen(out) 0 < out_len <= in_len */ void ui_strings_push(const char *in, size_t len, char **out) diff --git a/tests/integration/test_runtime.sh b/tests/integration/test_runtime.sh index 81d2da678..025d2bf8c 100644 --- a/tests/integration/test_runtime.sh +++ b/tests/integration/test_runtime.sh @@ -65,7 +65,6 @@ compare_strings() { STR2="$2" if [ "nanox" = "$TARGET" ]; then - # TODO: raise issue on speculos? STR1="$(echo $1 | sed 's/Parsing errorERR//g')" STR2="$(echo $2 | sed 's/Parsing errorERR//g')" fi From 6da3923ebda0b18dee3f90366df939af2bf4c889 Mon Sep 17 00:00:00 2001 From: Ajinkya Rajandekar Date: Fri, 9 Feb 2024 16:29:18 +0000 Subject: [PATCH 14/38] Reset entire buffer not just its size --- app/src/apdu_sign.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/apdu_sign.c b/app/src/apdu_sign.c index be7738ffc..4dabf90b0 100644 --- a/app/src/apdu_sign.c +++ b/app/src/apdu_sign.c @@ -117,8 +117,10 @@ sign_packet(void) /* If we aren't returning the hash, zero its buffer. */ if (!global.keys.apdu.sign.return_hash) { + memset((void *)bufs[0].ptr, 0, bufs[0].size); bufs[0].size = 0; } + io_send_response_buffers(bufs, 2, SW_OK); global.step = ST_IDLE; From 26e8721b753ffe2d7a61d8d53f57b6146a7cfe9e Mon Sep 17 00:00:00 2001 From: Ajinkya Rajandekar Date: Mon, 12 Feb 2024 09:10:41 +0000 Subject: [PATCH 15/38] - Initialize pressed_right to 0. --- app/src/ui_stream.c | 11 ++++++----- app/src/ui_stream_nbgl.c | 14 ++++++-------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/app/src/ui_stream.c b/app/src/ui_stream.c index 00d7f5d22..f3a0f9584 100644 --- a/app/src/ui_stream.c +++ b/app/src/ui_stream.c @@ -50,11 +50,12 @@ tz_ui_stream_init(void (*cb)(tz_ui_cb_type_t cb_type)) FUNC_ENTER(("cb=%p", cb)); memset(s, 0x0, sizeof(*s)); - s->cb = cb; - s->full = false; - s->current = 0; - s->total = -1; - s->last = 0; + s->cb = cb; + s->full = false; + s->current = 0; + s->pressed_right = false; + s->total = -1; + s->last = 0; ui_strings_init(); diff --git a/app/src/ui_stream_nbgl.c b/app/src/ui_stream_nbgl.c index 56015b81c..6788a6098 100644 --- a/app/src/ui_stream_nbgl.c +++ b/app/src/ui_stream_nbgl.c @@ -273,11 +273,12 @@ tz_ui_stream_init(void (*cb)(tz_ui_cb_type_t cb_type)) FUNC_ENTER(("cb=%p", cb)); memset(s, 0x0, sizeof(*s)); - s->cb = cb; - s->full = false; - s->last = 0; - s->current = -1; - s->total = -1; + s->cb = cb; + s->full = false; + s->last = 0; + s->current = -1; + s->total = -1; + s->pressed_right = false; ui_strings_init(); @@ -347,9 +348,6 @@ tz_ui_nav_cb(uint8_t page, nbgl_pageContent_t *content) s->pressed_right, s->current, s->total, s->full, global.step); if (global.step == ST_ERROR) { - // TODO: this is handled by change_screen_right except we disable it - // to use it here. We should make ui_stream fully compatible with - // exception.h global.step = ST_IDLE; ui_home_init(); result = false; From e6b4200b14387597433a3bfdd60093137b5e693a Mon Sep 17 00:00:00 2001 From: Ajinkya Rajandekar Date: Mon, 12 Feb 2024 13:28:21 +0000 Subject: [PATCH 16/38] Remove redundant global.step check --- app/src/apdu_sign.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/app/src/apdu_sign.c b/app/src/apdu_sign.c index 4dabf90b0..501c1f219 100644 --- a/app/src/apdu_sign.c +++ b/app/src/apdu_sign.c @@ -488,15 +488,14 @@ handle_first_apdu_clear(__attribute__((unused)) command_t *cmd) #endif tz_ui_stream_init(stream_cb); global.step = ST_CLEAR_SIGN; - if (global.step == ST_CLEAR_SIGN) { + #ifdef TARGET_NANOS - tz_ui_stream_push(TZ_UI_STREAM_CB_NOCB, "Review operation", "", - TZ_UI_LAYOUT_HOME_PB, TZ_UI_ICON_EYE); -#elif defined(HAVE_BAGL) - tz_ui_stream_push(TZ_UI_STREAM_CB_NOCB, "Review", "operation", + tz_ui_stream_push(TZ_UI_STREAM_CB_NOCB, "Review operation", "", TZ_UI_LAYOUT_HOME_PB, TZ_UI_ICON_EYE); +#elif defined(HAVE_BAGL) + tz_ui_stream_push(TZ_UI_STREAM_CB_NOCB, "Review", "operation", + TZ_UI_LAYOUT_HOME_PB, TZ_UI_ICON_EYE); #endif - } #ifdef HAVE_SWAP } else { PRINTF("[DEBUG] If called from SWAP : global.step =%d\n", From 9a4ca9ffac196f42baa2d5ba41b14b8b0ff9049f Mon Sep 17 00:00:00 2001 From: Ajinkya Rajandekar Date: Mon, 12 Feb 2024 16:17:32 +0000 Subject: [PATCH 17/38] Fix unsigned int treated as int. --- app/src/parser/operation_parser.c | 4 ++-- app/src/parser/operation_state.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/parser/operation_parser.c b/app/src/parser/operation_parser.c index 5bcf464a7..89bd9339c 100644 --- a/app/src/parser/operation_parser.c +++ b/app/src/parser/operation_parser.c @@ -419,7 +419,7 @@ tz_step_size(tz_parser_state *state) } op->frame->step_size.size = (op->frame->step_size.size << 8) | b; op->frame->step_size.size_len--; - if (op->frame->step_size.size_len <= 0) { + if (op->frame->step_size.size_len == 0) { op->frame[-1].stop = state->ofs + op->frame->step_size.size; tz_must(pop_frame(state)); } @@ -590,7 +590,7 @@ tz_step_read_int32(tz_parser_state *state) ASSERT_STEP(state, READ_INT32); tz_operation_state *op = &state->operation; uint8_t b; - uint32_t *value = &op->frame->step_read_int32.value; + int32_t *value = &op->frame->step_read_int32.value; if (op->frame->step_read_int32.ofs < 4) { tz_must(tz_parser_read(state, &b)); *value = (*value << 8) | b; diff --git a/app/src/parser/operation_state.h b/app/src/parser/operation_state.h index a9ec5efa8..eae58b6dd 100644 --- a/app/src/parser/operation_state.h +++ b/app/src/parser/operation_state.h @@ -147,8 +147,8 @@ typedef struct { uint8_t skip : 1, natural : 1; } step_read_num; struct { - uint32_t value; - uint8_t skip : 1, ofs : 3; + int32_t value; + uint8_t skip : 1, ofs : 3; } step_read_int32; struct { uint16_t ofs; From 9b12e71805e7800e27541820881934dd6e323661 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Wed, 14 Feb 2024 13:11:23 +0100 Subject: [PATCH 18/38] Parser: reduce TZ_FIELD_NAME_SIZE size to a more appropriate size --- app/src/parser/parser_state.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/parser/parser_state.h b/app/src/parser/parser_state.h index 942e7b234..a530c8010 100644 --- a/app/src/parser/parser_state.h +++ b/app/src/parser/parser_state.h @@ -41,7 +41,7 @@ typedef struct { // Parser state -#define TZ_FIELD_NAME_SIZE 80 +#define TZ_FIELD_NAME_SIZE 30 #define TZ_CAPTURE_BUFFER_SIZE 256 typedef enum { From 904f73de3df827f66df1e7729b891fc412371741 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Wed, 14 Feb 2024 13:14:29 +0100 Subject: [PATCH 19/38] Makefile: build the app with the latest app-builder version --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 889e35b14..fc1ca058d 100644 --- a/Makefile +++ b/Makefile @@ -25,8 +25,8 @@ docker_speculos: $(DOCKER) image tag $(LEDGERHQ)/speculos speculos docker_ledger_app_builder: - $(DOCKER) pull $(LEDGERHQ)/ledger-app-builder/ledger-app-dev-tools:3.14.0 - $(DOCKER) image tag $(LEDGERHQ)/ledger-app-builder/ledger-app-dev-tools:3.14.0 \ + $(DOCKER) pull $(LEDGERHQ)/ledger-app-builder/ledger-app-dev-tools:latest + $(DOCKER) image tag $(LEDGERHQ)/ledger-app-builder/ledger-app-dev-tools:latest \ ledger-app-builder docker_ledger_app_ocaml: From e03d17ed07f6ffc8ac6f5fad6a11321fab4108fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Palmer=20S=C3=A9bastien?= Date: Wed, 14 Feb 2024 17:08:38 +0100 Subject: [PATCH 20/38] Bump up the ledger-sdk in CI Co-authored-by: Ajinkya Rajandekar --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0b09579b7..2aa900c70 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,7 +21,7 @@ jobs: device: [nanos, nanosp, nanox, stax] runs-on: ubuntu-latest container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-dev-tools:3.14.0 + image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-dev-tools:latest steps: - name: Checkout uses: actions/checkout@v3 From 79728a76829cdefcf27344b307c6f1ad503b0c53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Wed, 14 Feb 2024 17:25:31 +0100 Subject: [PATCH 21/38] CodeQL: make strlcpy explicit --- app/src/handle_swap.c | 1 + app/src/parser/operation_parser.c | 2 ++ app/src/ui_strings.c | 1 + 3 files changed, 4 insertions(+) diff --git a/app/src/handle_swap.c b/app/src/handle_swap.c index 4c88bef1e..9f7a8a48d 100644 --- a/app/src/handle_swap.c +++ b/app/src/handle_swap.c @@ -24,6 +24,7 @@ #include #include +#include #include #include "handle_swap.h" diff --git a/app/src/parser/operation_parser.c b/app/src/parser/operation_parser.c index 89bd9339c..2936818ee 100644 --- a/app/src/parser/operation_parser.c +++ b/app/src/parser/operation_parser.c @@ -16,6 +16,8 @@ See the License for the specific language governing permissions and limitations under the License. */ +#include + #include "operation_parser.h" #include "micheline_parser.h" #include "num_parser.h" diff --git a/app/src/ui_strings.c b/app/src/ui_strings.c index 00bad70f0..11bd52f68 100644 --- a/app/src/ui_strings.c +++ b/app/src/ui_strings.c @@ -16,6 +16,7 @@ #include #include +#include #include "globals.h" #include "ui_strings.h" From 16df3048715c02b64da472c548ae9dd326186e40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Wed, 14 Feb 2024 17:36:24 +0100 Subject: [PATCH 22/38] CodeQL: make all the enumeration items explicit if items other than the first are defined --- app/src/parser/micheline_state.h | 14 +++++++------- app/src/parser/parser_state.h | 22 +++++++++++----------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/app/src/parser/micheline_state.h b/app/src/parser/micheline_state.h index 2a2e60c4a..50b016423 100644 --- a/app/src/parser/micheline_state.h +++ b/app/src/parser/micheline_state.h @@ -50,13 +50,13 @@ typedef enum { } tz_micheline_parser_step_kind; typedef enum { - TZ_CAP_STREAM_ANY = 0, - TZ_CAP_STREAM_BYTES, - TZ_CAP_STREAM_INT, - TZ_CAP_STREAM_STRING, - TZ_CAP_ADDRESS, - TZ_CAP_LIST = 62, - TZ_CAP_OR + TZ_CAP_STREAM_ANY = 0, + TZ_CAP_STREAM_BYTES = 1, + TZ_CAP_STREAM_INT = 2, + TZ_CAP_STREAM_STRING = 3, + TZ_CAP_ADDRESS = 4, + TZ_CAP_LIST = 62, + TZ_CAP_OR = 63 } tz_micheline_capture_kind; typedef struct { diff --git a/app/src/parser/parser_state.h b/app/src/parser/parser_state.h index a530c8010..eb6e51f0e 100644 --- a/app/src/parser/parser_state.h +++ b/app/src/parser/parser_state.h @@ -47,19 +47,19 @@ typedef struct { typedef enum { // success and non blocking, should loop again TZ_CONTINUE = 0, // fall through rest of current step - TZ_BREAK, // signals caller to return, errno should be CONTINUE + TZ_BREAK = 1, // signals caller to return, errno should be CONTINUE // success but parsing blocked - TZ_BLO_DONE = 100, // parsing complete - TZ_BLO_FEED_ME, // blocked on read from input - TZ_BLO_IM_FULL, // blocked on output space + TZ_BLO_DONE = 100, // parsing complete + TZ_BLO_FEED_ME = 101, // blocked on read from input + TZ_BLO_IM_FULL = 102, // blocked on output space // everything below is an error - TZ_ERR_INVALID_TAG = 200, - TZ_ERR_INVALID_OP, - TZ_ERR_INVALID_DATA, - TZ_ERR_UNSUPPORTED, - TZ_ERR_TOO_LARGE, - TZ_ERR_TOO_DEEP, - TZ_ERR_INVALID_STATE, + TZ_ERR_INVALID_TAG = 200, + TZ_ERR_INVALID_OP = 201, + TZ_ERR_INVALID_DATA = 202, + TZ_ERR_UNSUPPORTED = 203, + TZ_ERR_TOO_LARGE = 204, + TZ_ERR_TOO_DEEP = 205, + TZ_ERR_INVALID_STATE = 206, } tz_parser_result; #define TZ_IS_BLOCKED(code) (code >= 100) #define TZ_IS_ERR(code) (code >= 200) From e26d259a1e87ce7c2f9f7285315cde05cdbc4448 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Wed, 14 Feb 2024 18:35:54 +0100 Subject: [PATCH 23/38] CodeQL: short tz_step_read_num switch case --- app/src/parser/operation_parser.c | 104 ++++++++++++++++-------------- 1 file changed, 55 insertions(+), 49 deletions(-) diff --git a/app/src/parser/operation_parser.c b/app/src/parser/operation_parser.c index 2936818ee..1f185ff86 100644 --- a/app/src/parser/operation_parser.c +++ b/app/src/parser/operation_parser.c @@ -486,6 +486,60 @@ tz_step_read_micheline(tz_parser_state *state) tz_reraise; } +static void +tz_format_amount(char *str) +{ + int len = 0; + while (str[len]) { + len++; + } + if ((len == 1) && (str[0] == 0)) { + // just 0 + goto add_currency; + } + if (len < 7) { + // less than one tez, pad left up to the '0.' + int j; + int pad = 7 - len; + for (j = len; j >= 0; j--) { + str[j + pad] = str[j]; + } + for (j = 0; j < pad; j++) { + str[j] = '0'; + } + len = 7; + } + int no_decimals = 1; + for (int i = 0; i < 6; i++) { + no_decimals &= (str[len - 1 - i] == '0'); + } + if (no_decimals) { + // integral value, don't include the decimal part (no '.'_ + str[len - 6] = 0; + len -= 6; + } else { + // more than one tez, add the '.' + for (int i = 0; i < 6; i++) { + str[len - i] = str[len - i - 1]; + } + str[len - 6] = '.'; + len++; + str[len] = 0; + // drop trailing non significant zeroes + while (str[len - 1] == '0') { + len--; + str[len] = 0; + } + } +add_currency: + str[len] = ' '; + str[len + 1] = 'X'; + str[len + 2] = 'T'; + str[len + 3] = 'Z'; + len += 4; + str[len] = 0; +} + /* Read a number */ static tz_parser_result tz_step_read_num(tz_parser_state *state) @@ -526,55 +580,7 @@ tz_step_read_num(tz_parser_state *state) break; case TZ_OPERATION_FIELD_FEE: case TZ_OPERATION_FIELD_AMOUNT: { - int len = 0; - while (str[len]) { - len++; - } - if ((len == 1) && (str[0] == 0)) { - // just 0 - goto add_currency; - } - if (len < 7) { - // less than one tez, pad left up to the '0.' - int j; - int pad = 7 - len; - for (j = len; j >= 0; j--) { - str[j + pad] = str[j]; - } - for (j = 0; j < pad; j++) { - str[j] = '0'; - } - len = 7; - } - int no_decimals = 1; - for (int i = 0; i < 6; i++) { - no_decimals &= (str[len - 1 - i] == '0'); - } - if (no_decimals) { - // integral value, don't include the decimal part (no '.'_ - str[len - 6] = 0; - len -= 6; - } else { - // more than one tez, add the '.' - for (int i = 0; i < 6; i++) { - str[len - i] = str[len - i - 1]; - } - str[len - 6] = '.'; - len++; - str[len] = 0; - // drop trailing non significant zeroes - while (str[len - 1] == '0') { - len--; - str[len] = 0; - } - } - add_currency: - str[len] = ' '; - str[len + 1] = 'X'; - str[len + 2] = 'T'; - str[len + 3] = 'Z'; - len += 4; - str[len] = 0; + tz_format_amount(str); break; } default: From 8f0e585d00b42f1465158d9cd18494916f61f10d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Thu, 15 Feb 2024 10:25:48 +0100 Subject: [PATCH 24/38] Documentation: add documentation for formatting.(c|h) --- app/src/parser/formatting.c | 101 ++++++++++++----- app/src/parser/formatting.h | 212 +++++++++++++++++++++++++++--------- 2 files changed, 232 insertions(+), 81 deletions(-) diff --git a/app/src/parser/formatting.c b/app/src/parser/formatting.c index 01cbc6696..d3de8c62d 100644 --- a/app/src/parser/formatting.c +++ b/app/src/parser/formatting.c @@ -16,12 +16,16 @@ #include "formatting.h" -// Should be kept in sync with the last protocol update, including -// order, currently defined in the `michelson_v1_primitives.ml` file -// in the Tezos protocol code. -// -// NEVER REORDER elements of this array as the index is used as a -// selector by `michelson_op_name`. +/** + * @brief Ordered array of names for michelson primitives + * + * Should be kept in sync with the last protocol update, including + * order, currently defined in the `michelson_v1_primitives.ml` file + * in the Tezos protocol code. + * + * NEVER REORDER elements of this array as the index is used as a + * selector by `michelson_op_name`. + */ const char *const tz_michelson_op_names_ordered[TZ_LAST_MICHELSON_OPCODE + 1] = { "parameter", // 0 @@ -203,6 +207,15 @@ tz_michelson_op_name(uint8_t op_code) static const char tz_b58digits_ordered[] = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; +/** + * @brief Get the base58 format of a number + * + * @param n: input number + * @param l: length of the input buffer + * @param obuf: output buffer + * @param olen: length of the output buffer + * @return int: 0 on success + */ int tz_format_base58(const uint8_t *n, size_t l, char *obuf, size_t olen) { @@ -291,15 +304,49 @@ tz_format_decimal(const uint8_t *n, size_t l, char *obuf, size_t olen) // package does not publish their C header file for others to use, so // we are forced to piggy import the external definitions in order to // access them. + +/** + * @brief This struct represents the sha256 context + */ struct sha256_ctx { uint64_t sz; uint8_t buf[128]; uint32_t h[8]; }; + +/** + * @brief Initialize a sha256 context + * + * @param ctx: sha256 context + */ extern void digestif_sha256_init(struct sha256_ctx *ctx); + +/** + * @brief Update the sha256 context with data + * + * @param ctx: sha256 context + * @param data: data + * @param size: length of the data + */ extern void digestif_sha256_update(struct sha256_ctx *ctx, uint8_t *data, uint32_t size); + +/** + * @brief Finalize to digest the sha256 context + * + * @param ctx: sha256 context + * @param out: output buffer + */ extern void digestif_sha256_finalize(struct sha256_ctx *ctx, uint8_t *out); + +/** + * @brief Get the hash sha256 of a data + * + * @param data: data + * @param size: length of the data + * @param out: output buffer + * @param size_out: length of the output buffer + */ static void cx_hash_sha256(uint8_t *data, size_t size, uint8_t *out, size_t size_out) { @@ -312,26 +359,6 @@ cx_hash_sha256(uint8_t *data, size_t size, uint8_t *out, size_t size_out) } #endif -/* - * find_prefix() is passed in: - * s: the prefix we are looking for - * p: an out parameter which is the binary prefix we matched - * pl: another out parameter: the length of the returned binary prefix - * dl: the data length which we got - * - * To save lines and make things easier to read and modify, we implement - * find_prefix() as a series of invocations of the macro B58_PREFIX(). - * This macro takes 4 arguments: which correspond the the arguments of - * our function directly. It matches the textual prefixes and if they - * do match, it sets the output parameters and validates that the length - * is correct. - * - * find_prefix() returns successfully if it finds a definition and the - * length is correct. - * - * We turn off clang format for this so that we can line everything up. - */ - // clang-format off #define B58_PREFIX(_s, _p, _pl, _dl) do { \ if (!strcmp((_s), s)) { \ @@ -344,6 +371,26 @@ cx_hash_sha256(uint8_t *data, size_t size, uint8_t *out, size_t size_out) } \ } while (0) +/** + * @brief Get base58 prefix information + * + * To save lines and make things easier to read and modify, we + * implement find_prefix() as a series of invocations of the + * macro B58_PREFIX(). This macro takes 4 arguments: which + * correspond the the arguments of our function directly. It + * matches the textual prefixes and if they do match, it sets + * the output parameters and validates that the length is + * correct. + * + * find_prefix() returns successfully if it finds a definition + * and the length is correct. + * + * @param s: prefix we are looking for + * @param p: an out parameter which is the binary prefix we matched + * @param pl: another out parameter: the length of the returned binary prefix + * @param dl: data length which we got + * @return int: 0 on success + */ static int find_prefix(const char *s, const uint8_t **p, size_t *pl, size_t dl) { @@ -459,14 +506,12 @@ tz_format_pk(const uint8_t *data, size_t size, char *obuf, size_t olen) return tz_format_base58check(prefix, data + 1, size - 1, obuf, olen); } -/* Deprecated, use tz_format_base58check("o", ...) instead */ int tz_format_oph(const uint8_t *data, size_t size, char *obuf, size_t olen) { return tz_format_base58check("o", data, size, obuf, olen); } -/* Deprecated, use tz_format_base58check("B", ...) instead */ int tz_format_bh(const uint8_t *data, size_t size, char *obuf, size_t olen) { diff --git a/app/src/parser/formatting.h b/app/src/parser/formatting.h index 121e714e2..0436ca1e9 100644 --- a/app/src/parser/formatting.h +++ b/app/src/parser/formatting.h @@ -18,18 +18,34 @@ #include "compat.h" -// Returns the human readable name of a Michelson op_code if valid -// (`op_code <= LAST_MICHELSON_OPCODE`), or `NULL`. This function -// needs to be updated when new michelson instructions are added via a -// Tezos protocol upgrade to support new opcodes, the existing opcodes -// are guaranteed to stay unchanged, so not updating does not break -// security. -const char *tz_michelson_op_name(uint8_t op_code); +/** + * @brief Last Michelson operation code + * + * Should be kept in sync with the last protocol update. + */ #define TZ_LAST_MICHELSON_OPCODE 154 -// Should be kept in sync with the last protocol update, including -// order, currently defined in the `michelson_v1_primitives.ml` file -// in the Tezos protocol code. +/** + * @brief Get the human readable name of a Michelson op_code if valid + * (`op_code <= TZ_LAST_MICHELSON_OPCODE`), or `NULL`. + * + * This function needs to be updated when new michelson + * instructions are added via a Tezos protocol upgrade to + * support new opcodes, the existing opcodes are guaranteed to + * stay unchanged, so not updating does not break security. + * + * @param op_code: code of the michelson primitive + * @return const char*: name of the michelson primitive + */ +const char *tz_michelson_op_name(uint8_t op_code); + +/** + * @brief Enumeration of all Michelson operation code + * + * Should be kept in sync with the last protocol update, including + * order, currently defined in the `michelson_v1_primitives.ml` file + * in the Tezos protocol code. + */ typedef enum { TZ_MICHELSON_OP_parameter = 0, TZ_MICHELSON_OP_storage = 1, @@ -188,63 +204,153 @@ typedef enum { TZ_MICHELSON_OP_TICKET = 154 } tz_michelson_opcode; -// Formats a positive number of arbitrary to decimal. The number is -// stored in little-endian order in the first `l` bytes of `n`. The -// output buffer `obuf` must be at least `DECIMAL_BUFFER_SIZE(l)` -// (caller responsibility). -int tz_format_decimal(const uint8_t *n, size_t l, char *obuf, size_t olen); #define TZ_DECIMAL_BUFFER_SIZE(_l) ((((_l)*241) / 100) + 1) -// Formats a data `n` of size `l` in base58 using Tezos' alphabet -// order (same as Bitcoin). The output buffer `obuf` must be at least -// `BASE58_BUFFER_SIZE(l)` (caller responsibility). -int tz_format_base58(const uint8_t *n, size_t l, char *obuf, size_t olen); +/** + * @brief Formats a positive number of arbitrary to decimal. + * + * The number is stored in little-endian order in the first `l` + * bytes of `n`. The output buffer `obuf` must be at least + * `TZ_DECIMAL_BUFFER_SIZE(l)` (caller responsibility). + * + * @param n: input number + * @param l: length of the input number + * @param obuf: output buffer + * @param olen: length of the output buffer + * @return int: 0 on success + */ +int tz_format_decimal(const uint8_t *n, size_t l, char *obuf, size_t olen); + #define TZ_BASE58_BUFFER_SIZE(_l) ((((_l)*138) / 100) + 1) -// Looks up the prefix from the provided string (arg1), e.g. "B", -// "o", "expr", "tz2", etc. This indexes into a table which finds -// the appropriate binary prefix and the data length which is required. -// Will return an error if the lengths do not match. Then it will -// add the provided prefix, append the four first bytes of a -// double-sha256 of this concatenation, and call `format_base58`. The -// output buffer `obuf` must be at least `BASE58CHECK_BUFFER_SIZE(l, -// prefix_len)` (caller responsibility). -int tz_format_base58check(const char *prefix, const uint8_t *ibuf, - size_t ilen, char *obuf, size_t olen); +/** + * @brief Formats a data `n` of size `l` in base58 using Tezos' + * alphabet order (same as Bitcoin). + * + * The output buffer `obuf` must be at least + * `BASE58_BUFFER_SIZE(l)` (caller responsibility). + * + * @param n: input data + * @param l: length of the input data + * @param obuf: output buffer + * @param olen: length of the output buffer + * @return int: 0 on success + */ +int tz_format_base58(const uint8_t *n, size_t l, char *obuf, size_t olen); + #define TZ_BASE58CHECK_BUFFER_SIZE(_l, _p) \ TZ_BASE58_BUFFER_SIZE(((_p) + (_l)) + 4) -// Some Tezos-specific base58check formatters. These functions -// deconstruct the Tezos binary header to figure out the kind within -// the type (e.g. the curve for keys), check the length, and feed the -// appropriate prefix to `format_base58check`. These function need to -// be updated when new formats are added via a Tezos protocol upgrade. - -// size 21: tag(1) + pkh(20) -// tag 0: tz1(36) -// tag 1: tz2(36) -// tag 2: tz3(36) -// tag 3: tz4(36) +/** + * @brief Looks up the prefix from the provided string (arg1), + * e.g. "B", "o", "expr", "tz2", etc. + * + * This indexes into a table which finds the appropriate binary + * prefix and the data length which is required. Will return an + * error if the lengths do not match. Then it will add the + * provided prefix, append the four first bytes of a + * double-sha256 of this concatenation, and call + * `format_base58`. The output buffer `obuf` must be at least + * `TZ_BASE58CHECK_BUFFER_SIZE(l, prefix_len)` (caller + * responsibility). + * + * @param prefix: base58 prefix + * @param ibuf: input buffer + * @param ilen: length of the input buffer + * @param obuf: output buffer + * @param olen: length of the output buffer + * @return int: 0 on success + */ +int tz_format_base58check(const char *prefix, const uint8_t *ibuf, + size_t ilen, char *obuf, size_t olen); + +/** + * Some Tezos-specific base58check formatters. These functions + * deconstruct the Tezos binary header to figure out the kind within + * the type (e.g. the curve for keys), check the length, and feed the + * appropriate prefix to `format_base58check`. These function need to + * be updated when new formats are added via a Tezos protocol upgrade. + */ + +/** + * @brief Get the public key hash format + * + * size 21: tag(1) + pkh(20) + * tag 0: tz1(36) + * tag 1: tz2(36) + * tag 2: tz3(36) + * tag 3: tz4(36) + * + * @param ibuf: input buffer + * @param ilen: length of the input buffer + * @param obuf: output buffer + * @param olen: length of the output buffer + * @return int: 0 on success + */ int tz_format_pkh(const uint8_t *ibuf, size_t ilen, char *obuf, size_t olen); -// size 32, o(51) +/** + * @brief Get the public key hash format + * + * size 32, o(51) + * + * @param ibuf: input buffer + * @param ilen: length of the input buffer + * @param obuf: output buffer + * @param olen: length of the output buffer + * @return int: 0 on success + * + * @deprecated Use tz_format_base58check("o", ...) instead + */ int tz_format_oph(const uint8_t *ibuf, size_t ilen, char *obuf, size_t olen); -// size 32, B(51) +/** + * @brief Get the public key hash format + * + * size 32, B(51) + * + * @param ibuf: input buffer + * @param ilen: length of the input buffer + * @param obuf: output buffer + * @param olen: length of the output buffer + * @return int: 0 on success + * + * @deprecated Use tz_format_base58check("B", ...) instead + */ int tz_format_bh(const uint8_t *ibuf, size_t ilen, char *obuf, size_t olen); -// size 22: tag(1) + data(21) -// tag 0: tag(1) + pkh(20) (tz1, tz2, tz3, tz4, see format_pkh) -// tag 1: txrolluph(20) + padding(1), KT1(36) -// tag 2: txrolluph(20) + padding(1), txr1(36) -// tag 3: rolluph(20) + padding(1), scr1(36) -// tag 4: zkrolluph(20) + padding(1), zkr1(36) +/** + * @brief Get the public key hash format + * + * size 22: tag(1) + data(21) + * tag 0: tag(1) + pkh(20) (tz1, tz2, tz3, tz4, see format_pkh) + * tag 1: txrolluph(20) + padding(1), KT1(36) + * tag 2: txrolluph(20) + padding(1), txr1(36) + * tag 3: rolluph(20) + padding(1), scr1(36) + * tag 4: zkrolluph(20) + padding(1), zkr1(36) + * + * @param ibuf: input buffer + * @param ilen: length of the input buffer + * @param obuf: output buffer + * @param olen: length of the output buffer + * @return int: 0 on success + */ int tz_format_address(const uint8_t *ibuf, size_t ilen, char *obuf, size_t olen); -// size 33/34/49: tag(1) + data(32/33/48) -// tag 0: pk(32), edpk(54) -// tag 1: pk(33), sppk(55) -// tag 2: pk(33), p2pk(55) -// tag 3: pk(48), BLpk(76) +/** + * @brief Get the address format + * + * size 33/34/49: tag(1) + data(32/33/48) + * tag 0: pk(32), edpk(54) + * tag 1: pk(33), sppk(55) + * tag 2: pk(33), p2pk(55) + * tag 3: pk(48), BLpk(76) + * + * @param ibuf: input buffer + * @param ilen: length of the input buffer + * @param obuf: output buffer + * @param olen: length of the output buffer + * @return int: 0 on success + */ int tz_format_pk(const uint8_t *ibuf, size_t ilen, char *obuf, size_t olen); From c3720741bd5711320ad25d3419631273fd64c839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Thu, 15 Feb 2024 11:39:12 +0100 Subject: [PATCH 25/38] Documentation: add documentation for parser_state.(c|h) --- app/src/parser/parser_state.c | 7 ++ app/src/parser/parser_state.h | 203 +++++++++++++++++++++++++--------- 2 files changed, 160 insertions(+), 50 deletions(-) diff --git a/app/src/parser/parser_state.c b/app/src/parser/parser_state.c index 33ff70f6f..14d1d1221 100644 --- a/app/src/parser/parser_state.c +++ b/app/src/parser/parser_state.c @@ -18,9 +18,16 @@ #include "parser_state.h" +/** + * @brief Helper to handle parser result case + */ #define TZ_LABEL(_x) \ case TZ_##_x: \ return #_x + +/** + * @brief Helper to handle blocking parser result case + */ #define BLO_LABEL(_x) \ case TZ_BLO_##_x: \ return #_x diff --git a/app/src/parser/parser_state.h b/app/src/parser/parser_state.h index eb6e51f0e..891c65c92 100644 --- a/app/src/parser/parser_state.h +++ b/app/src/parser/parser_state.h @@ -24,84 +24,179 @@ // Parser buffers and buffer handling registers +/** + * @brief This struct represents the parser register. + * + * It contains an output and an input buffers + */ typedef struct { - // update `ibuf`, `iofs` and `ilen` at once with `parser_regs_refill` - // invariant between two refills: - // `iofs + ilen` = (constant) number of readable bytes in `ibuf` - uint8_t *ibuf; // input buffer - size_t iofs; // current offset - size_t ilen; // remaining bytes readable in input - // update `obuf`, `oofs` and `olen` at once with `parser_regs_flush` - // invariant between two refills: - // `oofs + olen` = (constant) number of readable bytes in `obuf` - char *obuf; // output buffer - size_t oofs; // current offset - size_t olen; // remaining bytes writable in output + /// update `ibuf`, `iofs` and `ilen` at once with `parser_regs_refill` + /// invariant between two refills: + /// `iofs + ilen` = (constant) number of readable bytes in `ibuf` + uint8_t *ibuf; /// input buffer + size_t iofs; /// current offset + size_t ilen; /// remaining bytes readable in input + /// update `obuf`, `oofs` and `olen` at once with `parser_regs_flush` + /// invariant between two refills: + /// `oofs + olen` = (constant) number of readable bytes in `obuf` + char *obuf; /// output buffer + size_t oofs; /// current offset + size_t olen; /// remaining bytes writable in output } tz_parser_regs; // Parser state -#define TZ_FIELD_NAME_SIZE 30 -#define TZ_CAPTURE_BUFFER_SIZE 256 +#define TZ_FIELD_NAME_SIZE 30 /// Size of the field name buffer +#define TZ_CAPTURE_BUFFER_SIZE 256 /// Size of the capture buffer +/** + * @brief Enumeration of all kinds of results meaningful to the parser + */ typedef enum { - // success and non blocking, should loop again - TZ_CONTINUE = 0, // fall through rest of current step - TZ_BREAK = 1, // signals caller to return, errno should be CONTINUE - // success but parsing blocked - TZ_BLO_DONE = 100, // parsing complete - TZ_BLO_FEED_ME = 101, // blocked on read from input - TZ_BLO_IM_FULL = 102, // blocked on output space - // everything below is an error - TZ_ERR_INVALID_TAG = 200, - TZ_ERR_INVALID_OP = 201, - TZ_ERR_INVALID_DATA = 202, - TZ_ERR_UNSUPPORTED = 203, - TZ_ERR_TOO_LARGE = 204, - TZ_ERR_TOO_DEEP = 205, - TZ_ERR_INVALID_STATE = 206, + /// success and non blocking, should loop again + TZ_CONTINUE = 0, /// fall through rest of current step + TZ_BREAK = 1, /// signals caller to return, errno should be CONTINUE + /// success but parsing blocked + TZ_BLO_DONE = 100, /// parsing complete + TZ_BLO_FEED_ME = 101, /// blocked on read from input + TZ_BLO_IM_FULL = 102, /// blocked on output space + /// everything below is an error + TZ_ERR_INVALID_TAG = 200, /// an invalid tag has been found + TZ_ERR_INVALID_OP + = 201, /// an invalid michelson operation has been found + TZ_ERR_INVALID_DATA = 202, /// a data has been considered as invalid + TZ_ERR_UNSUPPORTED = 203, /// a non-supported action has been triggered + TZ_ERR_TOO_LARGE = 204, /// too large data has been found + TZ_ERR_TOO_DEEP = 205, /// too deep data has been found + TZ_ERR_INVALID_STATE = 206, /// parser is in an invalid state } tz_parser_result; -#define TZ_IS_BLOCKED(code) (code >= 100) -#define TZ_IS_ERR(code) (code >= 200) +#define TZ_IS_BLOCKED(code) \ + (code >= 100) /// If the result is a blocking result +#define TZ_IS_ERR(code) (code >= 200) /// If the result is an error + +/** + * @brief Get the human readable name of a parser result + * + * @param code: parser result + * @return const char*: name of the parser result + */ const char *tz_parser_result_name(tz_parser_result code); +/** + * @brief This struct represents the parser state. + */ typedef struct { - tz_parser_regs regs; + tz_parser_regs regs; /// parser register - // common fields to communicate with caller - tz_parser_result errno; + /// common fields to communicate with caller + tz_parser_result errno; /// current parser result struct { - char field_name[TZ_FIELD_NAME_SIZE]; - bool is_field_complex; - int field_index; - } field_info; - // common singleton buffers - int ofs; + char field_name[TZ_FIELD_NAME_SIZE]; /// name of the last field + /// parsed + bool is_field_complex; /// if the last field parsed is considered + /// too complex for a common user + int field_index; /// index of the last field parsed + } field_info; /// information of the last field parsed + // common singleton buffers + int ofs; /// offset for the parser struct { - tz_num_parser_buffer num; - uint8_t capture[TZ_CAPTURE_BUFFER_SIZE]; + tz_num_parser_buffer num; /// number parser buffer + uint8_t capture[TZ_CAPTURE_BUFFER_SIZE]; /// capture buffer is used + /// to store string values } buffers; - // input type specific state - tz_micheline_state micheline; - tz_operation_state operation; + /// input type specific state + tz_micheline_state micheline; /// micheline parser state + tz_operation_state operation; /// operation parser state } tz_parser_state; +/** + * @brief Initialize a parser state + * + * @param state: parser state + */ void tz_parser_init(tz_parser_state *state); + +/** + * @brief Flush what has been parsed + * + * @param state: parser state + * @param obuf: ouput buffer + * @param olen: length of the output buffer + */ void tz_parser_flush(tz_parser_state *state, char *obuf, size_t olen); + +/** + * @brief Flush a part of what has been parsed + * + * @param state: parser state + * @param obuf: ouput buffer + * @param olen: length of the output buffer + * @param up_to: length of what we want to flush up to + */ void tz_parser_flush_up_to(tz_parser_state *state, char *obuf, size_t olen, size_t up_to); + +/** + * @brief Refill what should be parsed + * + * @param state: parser state + * @param ibuf: input buffer + * @param ilen: length of the input buffer + */ void tz_parser_refill(tz_parser_state *state, uint8_t *ibuf, size_t ilen); + +/** + * @brief Skip to next byte + * + * @param state: parser state + */ void tz_parser_skip(tz_parser_state *state); +/** + * @brief Put a character at the end of was has been parsed + * + * @param state: parser state + * @param c: character + * @return tz_parser_result: parser result + */ tz_parser_result tz_parser_put(tz_parser_state *state, char c); + +/** + * @brief Read a bytes + * + * @param state: parser state + * @param out: output character pointer + * @return tz_parser_result: parser result + */ tz_parser_result tz_parser_read(tz_parser_state *state, uint8_t *out); + +/** + * @brief Peek a bytes + * + * @param state: parser state + * @param out: output character pointer + * @return tz_parser_result: parser result + */ tz_parser_result tz_parser_peek(tz_parser_state *state, uint8_t *out); // error handling utils +/** + * @brief Set and raise a parser result + * + * @param state: parser state + * @param code: parser result to set + * @return tz_parser_result: parser result raised + */ tz_parser_result tz_parser_set_errno(tz_parser_state *state, tz_parser_result code); + +/** + * @brief Set a parser result and raise + * + * Expect a `state` variable + */ #ifdef TEZOS_DEBUG #define tz_return(e) \ do { \ @@ -115,9 +210,16 @@ tz_parser_result tz_parser_set_errno(tz_parser_state *state, #else #define tz_return(e) return tz_parser_set_errno(state, e) #endif -#define tz_raise(e) tz_return(TZ_ERR_##e) -#define tz_stop(e) tz_return(TZ_BLO_##e) -#define tz_reraise return state->errno + +#define tz_raise(e) tz_return(TZ_ERR_##e) /// Raise an parser error +#define tz_stop(e) tz_return(TZ_BLO_##e) /// Stop the parser +#define tz_reraise return state->errno /// Re-raise the parser result + +/** + * @brief Raise if the condition did not continue + * + * Usually used to ensure that the parser did not raise any error + */ #define tz_must(cond) \ do { \ tz_parser_result _err = cond; \ @@ -125,5 +227,6 @@ tz_parser_result tz_parser_set_errno(tz_parser_state *state, tz_return(_err); \ } \ } while (0) -#define tz_continue tz_return(TZ_CONTINUE) -#define tz_break tz_return(TZ_BREAK) + +#define tz_continue tz_return(TZ_CONTINUE) /// continue parsing +#define tz_break tz_return(TZ_BREAK) /// break parsing From 02818449081d2017d1de663b9c9f19dcd47d27cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Thu, 15 Feb 2024 12:04:49 +0100 Subject: [PATCH 26/38] Documentation: add documentation for number parser --- app/src/parser/num_parser.h | 45 +++++++++++++++++++++++++++++++++++-- app/src/parser/num_state.h | 19 +++++++++++----- 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/app/src/parser/num_parser.h b/app/src/parser/num_parser.h index d46bf3124..9944e5d29 100644 --- a/app/src/parser/num_parser.h +++ b/app/src/parser/num_parser.h @@ -19,14 +19,55 @@ #include "parser_state.h" -void tz_parse_num_state_init(tz_num_parser_buffer *buffers, - tz_num_parser_regs *regs); +/** + * @brief Initialize a num state buffer and a num state regs + * + * @param buffers: number parser buffers + * @param regs: number parser register + */ +void tz_parse_num_state_init(tz_num_parser_buffer *buffers, + tz_num_parser_regs *regs); + +/** + * @brief Parse one byte + * + * @param buffers: number parser buffers + * @param regs: number parser register + * @param b: byte to parse + * @param natural: if the number to read is natural + * @return tz_parser_result: parser result + */ tz_parser_result tz_parse_num_step(tz_num_parser_buffer *buffers, tz_num_parser_regs *regs, uint8_t b, bool natural); + +/** + * @brief Parse one byte to read an integer + * + * @param buffers: number parser buffers + * @param regs: number parser register + * @param b: byte to parse + * @return tz_parser_result: parser result + */ tz_parser_result tz_parse_int_step(tz_num_parser_buffer *buffers, tz_num_parser_regs *regs, uint8_t b); + +/** + * @brief Parse one byte to read a natural number + * + * @param buffers: number parser buffers + * @param regs: number parser register + * @param b: byte to parse + * @return tz_parser_result: parser result + */ tz_parser_result tz_parse_nat_step(tz_num_parser_buffer *buffers, tz_num_parser_regs *regs, uint8_t b); +/** + * @brief format a buffer to mutez number + * + * @param in: intput buffer + * @param out: output number + * @return bool: success + */ bool tz_string_to_mutez(const char *in, uint64_t *out); diff --git a/app/src/parser/num_state.h b/app/src/parser/num_state.h index 363e2ac14..60a4b0da9 100644 --- a/app/src/parser/num_state.h +++ b/app/src/parser/num_state.h @@ -18,14 +18,23 @@ #include "formatting.h" +/** + * @brief This struct represents the register for the parser of a number + * + * The parser is a one-by-one byte reader. + */ typedef struct { - uint16_t size; - uint8_t sign : 1, stop : 1; + uint16_t size; /// size of the number + uint8_t sign : 1; /// sign ot the number + uint8_t stop : 1; /// number as been fully parsed } tz_num_parser_regs; -#define TZ_NUM_BUFFER_SIZE 256 +#define TZ_NUM_BUFFER_SIZE 256 /// Size of the number buffer +/** + * @brief This struct represents the output buffers for the parser of a number + */ typedef struct { - uint8_t bytes[TZ_NUM_BUFFER_SIZE / 8]; - char decimal[TZ_DECIMAL_BUFFER_SIZE(TZ_NUM_BUFFER_SIZE / 8)]; + uint8_t bytes[TZ_NUM_BUFFER_SIZE / 8]; /// bytes + char decimal[TZ_DECIMAL_BUFFER_SIZE(TZ_NUM_BUFFER_SIZE / 8)]; /// decimal } tz_num_parser_buffer; From dc791693ed5a4285a7fbb624f7df7e0d344d5519 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Thu, 15 Feb 2024 14:02:19 +0100 Subject: [PATCH 27/38] Documentation: add documentation for micheline parser --- app/src/parser/micheline_parser.c | 41 +++++++++++++++ app/src/parser/micheline_parser.h | 14 ++++- app/src/parser/micheline_state.h | 87 ++++++++++++++++++++----------- 3 files changed, 112 insertions(+), 30 deletions(-) diff --git a/app/src/parser/micheline_parser.c b/app/src/parser/micheline_parser.c index 36be70674..a7209c77c 100644 --- a/app/src/parser/micheline_parser.c +++ b/app/src/parser/micheline_parser.c @@ -49,6 +49,13 @@ tz_micheline_parser_init(tz_parser_state *state) m->stack[0].step = TZ_MICHELINE_STEP_TAG; } +/** + * @brief Push a new frame onto the micheline parser stack + * + * @param state: parser state + * @param step: step of the new frame + * @return tz_parser_result: parser result + */ static tz_parser_result push_frame(tz_parser_state *state, tz_micheline_parser_step_kind step) { @@ -62,6 +69,12 @@ push_frame(tz_parser_state *state, tz_micheline_parser_step_kind step) tz_continue; } +/** + * @brief Pop the micheline parser stack + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result pop_frame(tz_parser_state *state) { @@ -75,6 +88,12 @@ pop_frame(tz_parser_state *state) tz_continue; } +/** + * @brief Ask to read a 4-bytes size + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result begin_sized(tz_parser_state *state) { @@ -88,6 +107,13 @@ begin_sized(tz_parser_state *state) tz_continue; } +/** + * @brief Ask to print an escape character + * + * @param state: parser state + * @param b: escape character + * @return tz_parser_result: parser result + */ static tz_parser_result print_escaped(tz_parser_state *state, uint8_t b) { @@ -112,6 +138,13 @@ print_escaped(tz_parser_state *state, uint8_t b) tz_continue; } +/** + * @brief Print a character + * + * @param state: parser state + * @param c: character + * @return tz_parser_result: parser result + */ static tz_parser_result parser_put(tz_parser_state *state, char c) { @@ -119,6 +152,14 @@ parser_put(tz_parser_state *state, char c) return tz_parser_put(state, c); } +/** + * @brief Plan the steps required to read the micheline value + * associated to the micheline tag + * + * @param state: parser state + * @param t: micheline tag + * @return tz_parser_result: parser result + */ static tz_parser_result tag_selection(tz_parser_state *state, uint8_t t) { diff --git a/app/src/parser/micheline_parser.h b/app/src/parser/micheline_parser.h index d331dcfeb..29073a014 100644 --- a/app/src/parser/micheline_parser.h +++ b/app/src/parser/micheline_parser.h @@ -18,5 +18,17 @@ #include "parser_state.h" -void tz_micheline_parser_init(tz_parser_state *state); +/** + * @brief Initialize a micheline parser state + * + * @param state: parser state + */ +void tz_micheline_parser_init(tz_parser_state *state); + +/** + * @brief Apply one step to the micheline parser + * + * @param state: parser state + * @return tz_parser_result: parser result + */ tz_parser_result tz_micheline_parser_step(tz_parser_state *state); diff --git a/app/src/parser/micheline_state.h b/app/src/parser/micheline_state.h index 50b016423..d77ddaf5a 100644 --- a/app/src/parser/micheline_state.h +++ b/app/src/parser/micheline_state.h @@ -18,8 +18,11 @@ #include "num_state.h" -#define TZ_MICHELINE_STACK_DEPTH 45 +#define TZ_MICHELINE_STACK_DEPTH 45 /// Maximum micheline depth handled +/** + * @brief Enumeration of all micheline tags + */ typedef enum { TZ_MICHELINE_TAG_INT, TZ_MICHELINE_TAG_STRING, @@ -34,6 +37,9 @@ typedef enum { TZ_MICHELINE_TAG_BYTES } tz_micheline_tag; +/** + * @brief Enumeration of all micheline parser step + */ typedef enum { TZ_MICHELINE_STEP_TAG, TZ_MICHELINE_STEP_PRIM_OP, @@ -49,6 +55,9 @@ typedef enum { TZ_MICHELINE_STEP_PRINT_CAPTURE } tz_micheline_parser_step_kind; +/** + * @brief + */ typedef enum { TZ_CAP_STREAM_ANY = 0, TZ_CAP_STREAM_BYTES = 1, @@ -59,45 +68,65 @@ typedef enum { TZ_CAP_OR = 63 } tz_micheline_capture_kind; +/** + * @brief This struct represents the frame of the parser of micheline + * + * A frame contains the next step to be performed and its + * corresponding context + */ typedef struct { - tz_micheline_parser_step_kind step : 4; - uint16_t stop; + tz_micheline_parser_step_kind step : 4; /// step + uint16_t stop; /// stop offset union { struct { - uint16_t size; - } step_size; // TZ_MICHELINE_STEP_SIZE + uint16_t size; /// size read + } step_size; /// TZ_MICHELINE_STEP_SIZE struct { - uint8_t first : 1; - } step_seq; // TZ_MICHELINE_STEP_SEQ + uint8_t first : 1; /// if read first byte + } step_seq; /// TZ_MICHELINE_STEP_SEQ struct { - uint8_t first : 1, has_rem_half : 1; - uint8_t rem_half; - } step_bytes; // TZ_MICHELINE_STEP_BYTES + uint8_t first : 1; /// if read first byte + uint8_t has_rem_half : 1; /// if half the byte remains to print + uint8_t rem_half; /// remaining half of the byte + } step_bytes; /// TZ_MICHELINE_STEP_BYTES struct { - uint8_t first : 1; - } step_string; // TZ_MICHELINE_STEP_STRING + uint8_t first : 1; /// if read first byte + } step_string; /// TZ_MICHELINE_STEP_STRING struct { - uint8_t first : 1; - } step_annot; // TZ_MICHELINE_STEP_ANNOT - tz_num_parser_regs step_int; // TZ_MICHELINE_STEP_INT, - // TZ_MICHELINE_STEP_PRINT_INT + uint8_t first : 1; /// if read first byte + } step_annot; /// TZ_MICHELINE_STEP_ANNOT + tz_num_parser_regs step_int; /// number parser register + /// TZ_MICHELINE_STEP_INT, + /// TZ_MICHELINE_STEP_PRINT_INT struct { - uint8_t op; - uint8_t ofs; - uint8_t nargs : 2, wrap : 1, spc : 1, annot : 1, first : 1; - } step_prim; // TZ_MICHELINE_STEP_PRIM_OP, - // TZ_MICHELINE_STEP_PRIM_NAME, - // TZ_MICHELINE_STEP_PRIM + uint8_t op; /// prim op + uint8_t ofs; /// offset + uint8_t nargs : 2; /// number of arguments + uint8_t wrap : 1; /// if wrap in a prim + uint8_t spc : 1; /// if has space + uint8_t annot : 1; /// if need to read an annotation + uint8_t first : 1; /// if read first byte + } step_prim; /// TZ_MICHELINE_STEP_PRIM_OP, + /// TZ_MICHELINE_STEP_PRIM_NAME, + /// TZ_MICHELINE_STEP_PRIM struct { - int ofs; - } step_capture; // TZ_MICHELINE_STEP_CAPTURE_BYTES, - // TZ_MICHELINE_STEP_PRINT_CAPTURE - tz_micheline_capture_kind - step_capturing; // TZ_MICHELINE_STEP_CAPTURING + int ofs; /// offset of the capture buffer + } step_capture; /// TZ_MICHELINE_STEP_CAPTURE_BYTES, + /// TZ_MICHELINE_STEP_PRINT_CAPTURE }; } tz_micheline_parser_frame; +/** + * @brief This struct represents the parser of micheline + * + * The parser is a one-by-one byte reader. It uses a stack + * automaton, for which each frame of the stack represents the + * reading states of the different layers of the micheline + * value read. + */ typedef struct { - tz_micheline_parser_frame stack[TZ_MICHELINE_STACK_DEPTH]; - tz_micheline_parser_frame *frame; // init == stack, NULL when done + tz_micheline_parser_frame + stack[TZ_MICHELINE_STACK_DEPTH]; /// stack of frames + tz_micheline_parser_frame *frame; /// current frame + /// init == stack, NULL when done } tz_micheline_state; From ea7fb7206b83ced322852fd52cb2009474afaedb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Thu, 15 Feb 2024 17:05:52 +0100 Subject: [PATCH 28/38] Documentation: add documentation for operations parser --- app/src/parser/operation_parser.c | 233 ++++++++++++++++++++++++++---- app/src/parser/operation_parser.h | 31 ++++ app/src/parser/operation_state.h | 182 +++++++++++++++-------- 3 files changed, 358 insertions(+), 88 deletions(-) diff --git a/app/src/parser/operation_parser.c b/app/src/parser/operation_parser.c index 1f185ff86..4139be093 100644 --- a/app/src/parser/operation_parser.c +++ b/app/src/parser/operation_parser.c @@ -52,6 +52,10 @@ const char *const tz_operation_parser_step_name[] = {"OPTION", "READ_BALLOT", "READ_PROTOS"}; +/** + * @brief Get the string format of an operations step + * + */ #define STRING_STEP(step) \ (const char *)PIC(tz_operation_parser_step_name[step]) @@ -60,12 +64,29 @@ const char *const tz_operation_parser_step_name[] = {"OPTION", // clang-format off // Default .skip=false, .complex=false + +/** + * @brief Helper to create an operation field descriptor + * + * @required name: name of the field + * @required kind: kind of the field + * + * By default .skip=false, .complex=false + */ #define TZ_OPERATION_FIELD(name_v, kind_v, ...) \ {.name=name_v, .kind=kind_v, __VA_ARGS__} -#define TZ_OPERATION_LAST_FIELD {0} +#define TZ_OPERATION_LAST_FIELD {0} /// Empty field with an END step -// Default .skip=false, .complex=false +/** + * @brief Helper to create an operation option field descriptor + * + * @required name: name of the option field + * @required field: field of the option field + * @required display_none: display if is none + * + * By default .skip=false, .complex=false + */ #define TZ_OPERATION_OPTION_FIELD(name_v, field_v, display_none, ...) \ {.name=name_v, .kind=TZ_OPERATION_FIELD_OPTION, \ .field_option={ \ @@ -74,6 +95,12 @@ const char *const tz_operation_parser_step_name[] = {"OPTION", }, \ __VA_ARGS__} +/** + * @brief Helper to create an operation tuple field descriptor + * + * @required name: name of the tuple field + * @required fields: fields of the tuple field + */ #define TZ_OPERATION_TUPLE_FIELD(name_v, ...) \ {.name=name_v, .kind=TZ_OPERATION_FIELD_TUPLE, \ .field_tuple={ \ @@ -84,6 +111,12 @@ const char *const tz_operation_parser_step_name[] = {"OPTION", } \ } +/** + * @brief Helper to create an operation descriptor + * + * @required name: name of the operation + * @required fields: fields of the operation + */ #define TZ_OPERATION_FIELDS(name, ...) \ const tz_operation_field_descriptor name[] = { __VA_ARGS__, TZ_OPERATION_LAST_FIELD} @@ -104,6 +137,9 @@ TZ_OPERATION_FIELDS(failing_noop_fields, TZ_OPERATION_FIELD("Message", TZ_OPERATION_FIELD_BINARY) ); +/** + * @brief Set of fields for manager operations + */ #define TZ_OPERATION_MANAGER_OPERATION_FIELDS \ TZ_OPERATION_FIELD("Source", TZ_OPERATION_FIELD_SOURCE), \ TZ_OPERATION_FIELD("Fee", TZ_OPERATION_FIELD_FEE), \ @@ -197,6 +233,9 @@ TZ_OPERATION_FIELDS(soru_origin_fields, TZ_OPERATION_FIELD("Parameters", TZ_OPERATION_FIELD_EXPR, .complex=true) ); +/** + * @brief Array of all handled operations + */ const tz_operation_descriptor tz_operation_descriptors[] = { {TZ_OPERATION_TAG_PROPOSALS, "Proposals", proposals_fields }, {TZ_OPERATION_TAG_BALLOT, "Ballot", ballot_fields }, @@ -217,9 +256,16 @@ const tz_operation_descriptor tz_operation_descriptors[] = { }; // clang-format on -static const char *expression_name = "Expression"; -static const char *unset_message = "Field unset"; +static const char *expression_name = "Expression"; /// title for micheline +static const char *unset_message = "Field unset"; /// title for unset field +/** + * @brief Push a new frame onto the operations parser stack + * + * @param state: parser state + * @param step: step of the new frame + * @return tz_parser_result: parser result + */ static tz_parser_result push_frame(tz_parser_state *state, tz_operation_parser_step_kind step) { @@ -233,6 +279,12 @@ push_frame(tz_parser_state *state, tz_operation_parser_step_kind step) tz_continue; } +/** + * @brief Pop the operations parser stack + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result pop_frame(tz_parser_state *state) { @@ -294,9 +346,14 @@ tz_operation_parser_init(tz_parser_state *state, uint16_t size, * the size of the buffer. This allows us to more idiomatically * check the size of buffers. */ - #define CAPTURE (state->buffers.capture) +/** + * @brief Ask to print what has been captured + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result tz_print_string(tz_parser_state *state) { @@ -311,6 +368,9 @@ tz_print_string(tz_parser_state *state) tz_continue; } +/** + * @brief Helper to assert the current step + */ #define ASSERT_STEP(state, expected_step) \ do { \ tz_operation_parser_step_kind step = (state)->operation.frame->step; \ @@ -322,7 +382,14 @@ tz_print_string(tz_parser_state *state) } \ } while (0) -/* Update the state in order to read the field if it is present */ +/** + * @brief Try to read an optionnal field + * + * If the field is present, ask to read it. + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result tz_step_option(tz_parser_state *state) { @@ -347,7 +414,12 @@ tz_step_option(tz_parser_state *state) tz_continue; } -/* Update the state in order to read the fields in a field tuple */ +/** + * @brief Ask to read remaining fields of a tuple field + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result tz_step_tuple(tz_parser_state *state) { @@ -376,6 +448,15 @@ tz_step_tuple(tz_parser_state *state) /* Update the state in order to read an operation or a micheline expression * based on a magic byte */ +/** + * @brief Read a magic byte and plan nexts steps + * + * The magic byte identifies if the data to read is a micheline + * expression or a batch of operations + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result tz_step_magic(tz_parser_state *state) { @@ -408,7 +489,12 @@ tz_step_magic(tz_parser_state *state) tz_continue; } -/* Read a 4-byte size */ +/** + * @brief Read a 4-bytes size + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result tz_step_size(tz_parser_state *state) { @@ -428,7 +514,13 @@ tz_step_size(tz_parser_state *state) tz_continue; } -/* Update the state in order to read an operation based on a tag byte */ +/** + * @brief Find the operation associated to the operation tag and ask + * to read its fields + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result tz_step_tag(tz_parser_state *state) { @@ -458,7 +550,12 @@ tz_step_tag(tz_parser_state *state) tz_raise(INVALID_TAG); } -/* Read a micheline expression */ +/** + * @brief Read a micheline expression + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result tz_step_read_micheline(tz_parser_state *state) { @@ -486,6 +583,11 @@ tz_step_read_micheline(tz_parser_state *state) tz_reraise; } +/** + * @brief Format a string as an amount + * + * @param str: string to format + */ static void tz_format_amount(char *str) { @@ -540,7 +642,12 @@ tz_format_amount(char *str) str[len] = 0; } -/* Read a number */ +/** + * @brief Read a number + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result tz_step_read_num(tz_parser_state *state) { @@ -591,7 +698,12 @@ tz_step_read_num(tz_parser_state *state) tz_continue; } -/* Read an int32 */ +/** + * @brief Read an int32 + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result tz_step_read_int32(tz_parser_state *state) { @@ -611,7 +723,12 @@ tz_step_read_int32(tz_parser_state *state) tz_continue; } -/* Read bytes */ +/** + * @brief Read bytes + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result tz_step_read_bytes(tz_parser_state *state) { @@ -688,7 +805,12 @@ tz_step_read_bytes(tz_parser_state *state) tz_continue; } -/* Update the state in order to read a batch of operations */ +/** + * @brief Plan the steps to read a batch of operations + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result tz_step_branch(tz_parser_state *state) { @@ -699,8 +821,11 @@ tz_step_branch(tz_parser_state *state) tz_continue; } -/* Update the state in order to read the next operation in a batch of - * operations +/** + * @brief Ask to read remaining operations of a batch of operations + * + * @param state: parser state + * @return tz_parser_result: parser result */ static tz_parser_result tz_step_batch(tz_parser_state *state) @@ -718,7 +843,12 @@ tz_step_batch(tz_parser_state *state) tz_continue; } -/* Read a string */ +/** + * @brief Read a string + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result tz_step_read_string(tz_parser_state *state) { @@ -736,7 +866,12 @@ tz_step_read_string(tz_parser_state *state) tz_continue; } -/* Read a binary */ +/** + * @brief Read a binary + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result tz_step_read_binary(tz_parser_state *state) { @@ -763,7 +898,12 @@ tz_step_read_binary(tz_parser_state *state) tz_continue; } -/* Read an entrypoint */ +/** + * @brief Read a smart entrypoint + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result tz_step_read_smart_entrypoint(tz_parser_state *state) { @@ -825,9 +965,14 @@ tz_step_read_smart_entrypoint(tz_parser_state *state) tz_continue; } -/* Update the state in order to read a field of an operation based on its kind - * If the field is not ignored, update the field_info with the field - * information +/** + * @brief Plan the steps required to read the current operation field + * + * Update the current field info only if the field is not + * ignored + * + * @param state: parser state + * @return tz_parser_result: parser result */ static tz_parser_result tz_step_field(tz_parser_state *state) @@ -1001,7 +1146,12 @@ tz_step_field(tz_parser_state *state) tz_continue; } -/* Read a public key */ +/** + * @brief Read a public key + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result tz_step_read_pk(tz_parser_state *state) { @@ -1031,7 +1181,12 @@ tz_step_read_pk(tz_parser_state *state) tz_continue; } -/* Read soru messages */ +/** + * @brief Read soru messages + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result tz_step_read_soru_messages(tz_parser_state *state) { @@ -1063,7 +1218,12 @@ tz_step_read_soru_messages(tz_parser_state *state) tz_continue; } -/* Read a soru kind */ +/** + * @brief Read a soru kind + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result tz_step_read_soru_kind(tz_parser_state *state) { @@ -1084,7 +1244,12 @@ tz_step_read_soru_kind(tz_parser_state *state) tz_continue; } -/* Read a ballot */ +/** + * @brief Read a ballot + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result tz_step_read_ballot(tz_parser_state *state) { @@ -1108,7 +1273,12 @@ tz_step_read_ballot(tz_parser_state *state) tz_continue; } -/* Read protocols */ +/** + * @brief Read a protocol list + * + * @param state: parser state + * @return tz_parser_result: parser result + */ static tz_parser_result tz_step_read_protos(tz_parser_state *state) { @@ -1138,8 +1308,13 @@ tz_step_read_protos(tz_parser_state *state) tz_continue; } -/* Print a string - * if partial is true, then the string is not yet complete +/** + * @brief Print a string + * + * @param state: parser state + * @param partial: If partial true, then the string is not yet + * complete + * @return tz_parser_result: parser result */ static tz_parser_result tz_step_print(tz_parser_state *state, bool partial) diff --git a/app/src/parser/operation_parser.h b/app/src/parser/operation_parser.h index 1777c3804..afe790a72 100644 --- a/app/src/parser/operation_parser.h +++ b/app/src/parser/operation_parser.h @@ -19,7 +19,38 @@ #include "parser_state.h" #define TZ_UNKNOWN_SIZE 0xFFFFu + +/** + * @brief Initialize a operations parser state + * + * As operations can be very large, the size of the data to + * parse can be unknown in that case size can be set to + * `TZ_UNKNOWN_SIZE`. The size can then be set with + * `tz_operation_parser_set_size` + * + * @param state: parser state + * @param size: size of operations + * @param skip_magic: set it to false if a magic byte needs to be + * analysed to find out whether the bytes represent + * a micheline expression or a batch of + * operations. Otherwise, it will assume that the + * bytes represent a batch of operations. + */ void tz_operation_parser_init(tz_parser_state *state, uint16_t size, bool skip_magic); + +/** + * @brief Set the operations size + * + * @param state: parser state + * @param size: size of operations + */ void tz_operation_parser_set_size(tz_parser_state *state, uint16_t size); + +/** + * @brief Apply one step to the operations parser + * + * @param state: parser state + * @return tz_parser_result: parser result + */ tz_parser_result tz_operation_parser_step(tz_parser_state *state); diff --git a/app/src/parser/operation_state.h b/app/src/parser/operation_state.h index eae58b6dd..9f7ba3467 100644 --- a/app/src/parser/operation_state.h +++ b/app/src/parser/operation_state.h @@ -19,6 +19,9 @@ #include "num_state.h" +/** + * @brief Enumeration of all operations tags + */ typedef enum { TZ_OPERATION_TAG_END = 0, TZ_OPERATION_TAG_PROPOSALS = 5, @@ -38,6 +41,9 @@ typedef enum { TZ_OPERATION_TAG_SORU_EXE_MSG = 206 } tz_operation_tag; +/** + * @brief Enumeration of all operations parser step + */ typedef enum { TZ_OPERATION_STEP_OPTION, TZ_OPERATION_STEP_TUPLE, @@ -63,6 +69,9 @@ typedef enum { TZ_OPERATION_STEP_READ_PROTOS } tz_operation_parser_step_kind; +/** + * @brief Enumeration of all operations fields + */ typedef enum { TZ_OPERATION_FIELD_END = 0, // not for use in field descriptors TZ_OPERATION_FIELD_OPTION, @@ -93,93 +102,148 @@ typedef enum { struct tz_operation_field_descriptor; +/** + * @brief This struct represents the field descriptor of an option field + */ typedef struct { - const struct tz_operation_field_descriptor *field; - uint8_t display_none : 1; + const struct tz_operation_field_descriptor *field; /// field descriptor + uint8_t display_none : 1; /// display if is none } tz_operation_option_field_descriptor; +/** + * @brief This struct represents the descriptor of field + */ typedef struct tz_operation_field_descriptor { - const char *name; - tz_operation_field_kind kind : 5; + const char *name; /// name + tz_operation_field_kind kind : 5; /// kind union { - tz_operation_option_field_descriptor field_option; + tz_operation_option_field_descriptor + field_option; /// field of the option + /// TZ_OPERATION_FIELD_OPTION + struct { - const struct tz_operation_field_descriptor *fields; - } field_tuple; + const struct tz_operation_field_descriptor + *fields; /// fields of the tuple + } field_tuple; /// TZ_OPERATION_FIELD_TUPLE }; - uint8_t skip : 1, complex : 1; + uint8_t skip : 1; /// if the field is not printed + uint8_t complex : 1; /// if the field is considered too complex for a + /// common user } tz_operation_field_descriptor; +/** + * @brief This struct represents the descriptor of operations + */ typedef struct { - tz_operation_tag tag; - const char *name; - const tz_operation_field_descriptor *fields; + tz_operation_tag tag; /// tag + const char *name; /// name + const tz_operation_field_descriptor *fields; /// fields } tz_operation_descriptor; +/** + * @brief This struct represents the frame of the parser of operations + * + * A frame contains the next step to be performed and its + * corresponding context + */ typedef struct { - tz_operation_parser_step_kind step : 5; - uint16_t stop; + tz_operation_parser_step_kind step : 5; /// step + uint16_t stop; /// stop offset union { - tz_operation_option_field_descriptor step_option; + tz_operation_option_field_descriptor + step_option; /// option field + /// TZ_OPERATION_STEP_OPTION struct { - uint8_t size_len; - uint16_t size; - } step_size; + uint8_t size_len; /// number of bytes to read + uint16_t size; /// current parsed value + } step_size; /// TZ_OPERATION_STEP_SIZE struct { - const tz_operation_field_descriptor *field; - } step_field; + const tz_operation_field_descriptor + *field; /// field that need to be read + } step_field; /// TZ_OPERATION_STEP_FIELD struct { - const tz_operation_field_descriptor *fields; - uint8_t field_index; - } step_tuple; + const tz_operation_field_descriptor + *fields; /// fields of the tuple + uint8_t field_index; /// index of the current field to read + } step_tuple; /// TZ_OPERATION_STEP_TUPLE struct { - const char *str; - } step_print; + const char *str; /// string to print + } step_print; /// TZ_OPERATION_STEP_PRINT + /// TZ_OPERATION_STEP_PARTIAL_PRINT struct { - uint16_t ofs; - uint16_t len; - tz_operation_field_kind kind : 5; - uint8_t skip : 1; - } step_read_bytes; + uint16_t ofs; /// current bytes buffer offset + uint16_t len; /// expected bytes length + tz_operation_field_kind + kind : 5; /// kind of field + /// TZ_OPERATION_FIELD_SOURCE + /// TZ_OPERATION_FIELD_PKH + /// TZ_OPERATION_FIELD_PK + /// TZ_OPERATION_FIELD_SR + /// TZ_OPERATION_FIELD_SRC + /// TZ_OPERATION_FIELD_PROTO + /// TZ_OPERATION_FIELD_DESTINATION + /// TZ_OPERATION_FIELD_OPH + /// TZ_OPERATION_FIELD_BH + uint8_t skip : 1; /// if the field is skipped + } step_read_bytes; /// TZ_OPERATION_STEP_READ_BYTES struct { - tz_num_parser_regs state; - tz_operation_field_kind kind : 5; - uint8_t skip : 1, natural : 1; - } step_read_num; + tz_num_parser_regs state; /// number parser register + tz_operation_field_kind kind : 5; /// what kind of field + /// TZ_OPERATION_FIELD_NAT + /// TZ_OPERATION_FIELD_FEE + /// TZ_OPERATION_FIELD_AMOUNT + /// TZ_OPERATION_FIELD_INT + uint8_t skip : 1; /// if the field is skipped + uint8_t natural : 1; /// if its a natural number + } step_read_num; /// TZ_OPERATION_STEP_READ_NUM struct { - int32_t value; - uint8_t skip : 1, ofs : 3; - } step_read_int32; + int32_t value; /// current value parsed + uint8_t skip : 1; /// if the field is skipped + uint8_t ofs : 3; /// number offset + } step_read_int32; /// TZ_OPERATION_STEP_READ_INT32 struct { - uint16_t ofs; - uint8_t skip : 1; - } step_read_string; + uint16_t ofs; /// current buffer string offset + uint8_t skip : 1; /// if the field is skipped + } step_read_string; /// TZ_OPERATION_STEP_READ_STRING + /// TZ_OPERATION_STEP_READ_BINARY struct { - const char *name; - uint8_t inited : 1; - uint8_t skip : 1; - } step_read_micheline; + const char *name; /// field name + uint8_t + inited : 1; /// if the parser micheline has been initialize + uint8_t skip : 1; /// if the field is skipped + } step_read_micheline; /// TZ_OPERATION_STEP_READ_MICHELINE struct { - const char *name; - uint16_t index; - uint8_t skip : 1; - } step_read_list; + const char *name; /// field name + uint16_t index; /// current index in the list + uint8_t skip : 1; /// if the field is skipped + } step_read_list; /// TZ_OPERATION_STEP_READ_PROTOS + /// TZ_OPERATION_STEP_READ_SORU_MESSAGES }; } tz_operation_parser_frame; -#define TZ_OPERATION_STACK_DEPTH 6 +#define TZ_OPERATION_STACK_DEPTH 6 /// Maximum operations depth handled +/** + * @brief This struct represents the parser of operations + * + * The parser is a one-by-one byte reader. It uses a stack + * automaton, for which each frame of the stack represents the + * reading states of the different layers of the operations + * value read. + */ typedef struct { - tz_operation_parser_frame stack[TZ_OPERATION_STACK_DEPTH]; - tz_operation_parser_frame *frame; // init == stack, NULL when done - uint8_t seen_reveal : 1; // check at most one reveal - uint8_t source[22]; // check consistent source in batch - uint8_t destination[22]; // saved for entrypoint dispatch - uint16_t batch_index; // to print a sequence number + tz_operation_parser_frame + stack[TZ_OPERATION_STACK_DEPTH]; /// stack of frames + tz_operation_parser_frame *frame; /// current frame + /// init == stack, NULL when done + uint8_t seen_reveal : 1; /// check at most one reveal + uint8_t source[22]; /// check consistent source in batch + uint8_t destination[22]; /// saved for entrypoint dispatch + uint16_t batch_index; /// to print a sequence number #ifdef HAVE_SWAP - tz_operation_tag last_tag; - uint16_t nb_reveal; - uint64_t last_fee; - uint64_t last_amount; -#endif // HAVE_SWAP + tz_operation_tag last_tag; /// last operations tag encountered + uint16_t nb_reveal; /// number of reveal encountered + uint64_t last_fee; /// last fee encountered + uint64_t last_amount; /// last amount encountered +#endif // HAVE_SWAP } tz_operation_state; From 8c4a42b7b3feee51eec980a33652349290cd9657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Fri, 16 Feb 2024 10:17:36 +0100 Subject: [PATCH 29/38] Parser: add the riscv SORU_KIND --- app/src/parser/operation_parser.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/parser/operation_parser.c b/app/src/parser/operation_parser.c index 4139be093..086a34f9a 100644 --- a/app/src/parser/operation_parser.c +++ b/app/src/parser/operation_parser.c @@ -1237,6 +1237,9 @@ tz_step_read_soru_kind(tz_parser_state *state) case 1: strlcpy((char *)CAPTURE, "wasm_2_0_0", sizeof(CAPTURE)); break; + case 2: /// Present in encoding, not activated in Oxford + strlcpy((char *)CAPTURE, "riscv", sizeof(CAPTURE)); + break; default: tz_raise(INVALID_TAG); } From d94afaf558d14c74587bb0edaeae0bb0486ed7eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Fri, 16 Feb 2024 10:22:20 +0100 Subject: [PATCH 30/38] Parser: remove the `Proof` field of soru origination fields --- app/src/parser/operation_parser.c | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/parser/operation_parser.c b/app/src/parser/operation_parser.c index 086a34f9a..c80d97667 100644 --- a/app/src/parser/operation_parser.c +++ b/app/src/parser/operation_parser.c @@ -229,7 +229,6 @@ TZ_OPERATION_FIELDS(soru_origin_fields, TZ_OPERATION_MANAGER_OPERATION_FIELDS, TZ_OPERATION_FIELD("Kind", TZ_OPERATION_FIELD_SORU_KIND), TZ_OPERATION_FIELD("Kernel", TZ_OPERATION_FIELD_BINARY, .complex=true), - TZ_OPERATION_FIELD("Proof", TZ_OPERATION_FIELD_BINARY, .complex=true), TZ_OPERATION_FIELD("Parameters", TZ_OPERATION_FIELD_EXPR, .complex=true) ); From 59cd89a5351273826515c3268a16e4f044d49a5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Fri, 16 Feb 2024 11:45:08 +0100 Subject: [PATCH 31/38] Parser: add the `Whitelist` field to soru origination fields --- app/src/parser/operation_parser.c | 57 +++++++++++++++++- app/src/parser/operation_state.h | 4 +- .../test_sign_sc_rollup_originate/00030.png | Bin 426 -> 386 bytes .../test_sign_sc_rollup_originate/00031.png | Bin 450 -> 536 bytes .../test_sign_sc_rollup_originate/00032.png | Bin 427 -> 538 bytes .../test_sign_sc_rollup_originate/00033.png | Bin 457 -> 518 bytes .../test_sign_sc_rollup_originate/00034.png | Bin 456 -> 539 bytes .../test_sign_sc_rollup_originate/00035.png | Bin 440 -> 388 bytes .../test_sign_sc_rollup_originate/00036.png | Bin 437 -> 544 bytes .../test_sign_sc_rollup_originate/00037.png | Bin 437 -> 503 bytes .../test_sign_sc_rollup_originate/00038.png | Bin 455 -> 400 bytes .../test_sign_sc_rollup_originate/00039.png | Bin 446 -> 404 bytes .../test_sign_sc_rollup_originate/00040.png | Bin 453 -> 0 bytes .../test_sign_sc_rollup_originate/00041.png | Bin 337 -> 0 bytes .../no_whitelist/00000.png | Bin 0 -> 395 bytes .../no_whitelist/00001.png | Bin 0 -> 446 bytes .../no_whitelist/00002.png | Bin 0 -> 481 bytes .../no_whitelist/00003.png | Bin 0 -> 482 bytes .../no_whitelist/00004.png | Bin 0 -> 311 bytes .../no_whitelist/00005.png | Bin 0 -> 359 bytes .../no_whitelist/00006.png | Bin 0 -> 288 bytes .../{00042.png => no_whitelist/00007.png} | Bin .../no_whitelist/00008.png | Bin 0 -> 385 bytes .../no_whitelist/00009.png | Bin 0 -> 402 bytes .../no_whitelist/00010.png | Bin 0 -> 406 bytes .../no_whitelist/00011.png | Bin 0 -> 377 bytes .../no_whitelist/00012.png | Bin 0 -> 402 bytes .../no_whitelist/00013.png | Bin 0 -> 394 bytes .../no_whitelist/00014.png | Bin 0 -> 418 bytes .../no_whitelist/00015.png | Bin 0 -> 410 bytes .../no_whitelist/00016.png | Bin 0 -> 414 bytes .../no_whitelist/00017.png | Bin 0 -> 424 bytes .../no_whitelist/00018.png | Bin 0 -> 391 bytes .../no_whitelist/00019.png | Bin 0 -> 411 bytes .../no_whitelist/00020.png | Bin 0 -> 382 bytes .../no_whitelist/00021.png | Bin 0 -> 423 bytes .../no_whitelist/00022.png | Bin 0 -> 400 bytes .../no_whitelist/00023.png | Bin 0 -> 417 bytes .../no_whitelist/00024.png | Bin 0 -> 440 bytes .../no_whitelist/00025.png | Bin 0 -> 420 bytes .../no_whitelist/00026.png | Bin 0 -> 424 bytes .../no_whitelist/00027.png | Bin 0 -> 411 bytes .../no_whitelist/00028.png | Bin 0 -> 397 bytes .../no_whitelist/00029.png | Bin 0 -> 499 bytes .../{00043.png => no_whitelist/00030.png} | Bin .../{00044.png => no_whitelist/00031.png} | Bin .../with_whitelist/00000.png | Bin 0 -> 395 bytes .../with_whitelist/00001.png | Bin 0 -> 446 bytes .../with_whitelist/00002.png | Bin 0 -> 481 bytes .../with_whitelist/00003.png | Bin 0 -> 482 bytes .../with_whitelist/00004.png | Bin 0 -> 311 bytes .../with_whitelist/00005.png | Bin 0 -> 359 bytes .../with_whitelist/00006.png | Bin 0 -> 288 bytes .../with_whitelist/00007.png | Bin 0 -> 499 bytes .../with_whitelist/00008.png | Bin 0 -> 385 bytes .../with_whitelist/00009.png | Bin 0 -> 402 bytes .../with_whitelist/00010.png | Bin 0 -> 406 bytes .../with_whitelist/00011.png | Bin 0 -> 377 bytes .../with_whitelist/00012.png | Bin 0 -> 402 bytes .../with_whitelist/00013.png | Bin 0 -> 394 bytes .../with_whitelist/00014.png | Bin 0 -> 418 bytes .../with_whitelist/00015.png | Bin 0 -> 410 bytes .../with_whitelist/00016.png | Bin 0 -> 414 bytes .../with_whitelist/00017.png | Bin 0 -> 424 bytes .../with_whitelist/00018.png | Bin 0 -> 391 bytes .../with_whitelist/00019.png | Bin 0 -> 411 bytes .../with_whitelist/00020.png | Bin 0 -> 382 bytes .../with_whitelist/00021.png | Bin 0 -> 423 bytes .../with_whitelist/00022.png | Bin 0 -> 400 bytes .../with_whitelist/00023.png | Bin 0 -> 417 bytes .../with_whitelist/00024.png | Bin 0 -> 440 bytes .../with_whitelist/00025.png | Bin 0 -> 420 bytes .../with_whitelist/00026.png | Bin 0 -> 424 bytes .../with_whitelist/00027.png | Bin 0 -> 411 bytes .../with_whitelist/00028.png | Bin 0 -> 397 bytes .../with_whitelist/00029.png | Bin 0 -> 499 bytes .../with_whitelist/00030.png | Bin 0 -> 386 bytes .../with_whitelist/00031.png | Bin 0 -> 536 bytes .../with_whitelist/00032.png | Bin 0 -> 538 bytes .../with_whitelist/00033.png | Bin 0 -> 518 bytes .../with_whitelist/00034.png | Bin 0 -> 539 bytes .../with_whitelist/00035.png | Bin 0 -> 388 bytes .../with_whitelist/00036.png | Bin 0 -> 544 bytes .../with_whitelist/00037.png | Bin 0 -> 503 bytes .../with_whitelist/00038.png | Bin 0 -> 400 bytes .../with_whitelist/00039.png | Bin 0 -> 404 bytes .../test_sign_sc_rollup_originate/00014.png | Bin 1007 -> 413 bytes .../test_sign_sc_rollup_originate/00015.png | Bin 1029 -> 793 bytes .../test_sign_sc_rollup_originate/00016.png | Bin 939 -> 841 bytes .../test_sign_sc_rollup_originate/00017.png | Bin 542 -> 828 bytes .../test_sign_sc_rollup_originate/00018.png | Bin 413 -> 459 bytes .../no_whitelist/00000.png | Bin 0 -> 463 bytes .../no_whitelist/00001.png | Bin 0 -> 485 bytes .../no_whitelist/00002.png | Bin 0 -> 728 bytes .../no_whitelist/00003.png | Bin 0 -> 330 bytes .../no_whitelist/00004.png | Bin 0 -> 387 bytes .../no_whitelist/00005.png | Bin 0 -> 316 bytes .../no_whitelist/00006.png | Bin 0 -> 542 bytes .../no_whitelist/00007.png | Bin 0 -> 805 bytes .../no_whitelist/00008.png | Bin 0 -> 838 bytes .../no_whitelist/00009.png | Bin 0 -> 845 bytes .../no_whitelist/00010.png | Bin 0 -> 847 bytes .../no_whitelist/00011.png | Bin 0 -> 923 bytes .../no_whitelist/00012.png | Bin 0 -> 424 bytes .../no_whitelist/00013.png | Bin 0 -> 542 bytes .../no_whitelist/00014.png | Bin 0 -> 413 bytes .../{00019.png => no_whitelist/00015.png} | Bin .../with_whitelist/00000.png | Bin 0 -> 463 bytes .../with_whitelist/00001.png | Bin 0 -> 485 bytes .../with_whitelist/00002.png | Bin 0 -> 728 bytes .../with_whitelist/00003.png | Bin 0 -> 330 bytes .../with_whitelist/00004.png | Bin 0 -> 387 bytes .../with_whitelist/00005.png | Bin 0 -> 316 bytes .../with_whitelist/00006.png | Bin 0 -> 542 bytes .../with_whitelist/00007.png | Bin 0 -> 805 bytes .../with_whitelist/00008.png | Bin 0 -> 838 bytes .../with_whitelist/00009.png | Bin 0 -> 845 bytes .../with_whitelist/00010.png | Bin 0 -> 847 bytes .../with_whitelist/00011.png | Bin 0 -> 923 bytes .../with_whitelist/00012.png | Bin 0 -> 424 bytes .../with_whitelist/00013.png | Bin 0 -> 542 bytes .../with_whitelist/00014.png | Bin 0 -> 413 bytes .../with_whitelist/00015.png | Bin 0 -> 793 bytes .../with_whitelist/00016.png | Bin 0 -> 841 bytes .../with_whitelist/00017.png | Bin 0 -> 828 bytes .../with_whitelist/00018.png} | Bin .../test_sign_sc_rollup_originate/00014.png | Bin 1007 -> 413 bytes .../test_sign_sc_rollup_originate/00015.png | Bin 1029 -> 793 bytes .../test_sign_sc_rollup_originate/00016.png | Bin 939 -> 841 bytes .../test_sign_sc_rollup_originate/00017.png | Bin 542 -> 828 bytes .../test_sign_sc_rollup_originate/00018.png | Bin 413 -> 459 bytes .../no_whitelist/00000.png | Bin 0 -> 463 bytes .../no_whitelist/00001.png | Bin 0 -> 485 bytes .../no_whitelist/00002.png | Bin 0 -> 728 bytes .../no_whitelist/00003.png | Bin 0 -> 330 bytes .../no_whitelist/00004.png | Bin 0 -> 387 bytes .../no_whitelist/00005.png | Bin 0 -> 316 bytes .../no_whitelist/00006.png | Bin 0 -> 542 bytes .../no_whitelist/00007.png | Bin 0 -> 805 bytes .../no_whitelist/00008.png | Bin 0 -> 838 bytes .../no_whitelist/00009.png | Bin 0 -> 845 bytes .../no_whitelist/00010.png | Bin 0 -> 847 bytes .../no_whitelist/00011.png | Bin 0 -> 923 bytes .../no_whitelist/00012.png | Bin 0 -> 424 bytes .../no_whitelist/00013.png | Bin 0 -> 542 bytes .../no_whitelist/00014.png | Bin 0 -> 413 bytes .../no_whitelist/00015.png | Bin 0 -> 459 bytes .../with_whitelist/00000.png | Bin 0 -> 463 bytes .../with_whitelist/00001.png | Bin 0 -> 485 bytes .../with_whitelist/00002.png | Bin 0 -> 728 bytes .../with_whitelist/00003.png | Bin 0 -> 330 bytes .../with_whitelist/00004.png | Bin 0 -> 387 bytes .../with_whitelist/00005.png | Bin 0 -> 316 bytes .../with_whitelist/00006.png | Bin 0 -> 542 bytes .../with_whitelist/00007.png | Bin 0 -> 805 bytes .../with_whitelist/00008.png | Bin 0 -> 838 bytes .../with_whitelist/00009.png | Bin 0 -> 845 bytes .../with_whitelist/00010.png | Bin 0 -> 847 bytes .../with_whitelist/00011.png | Bin 0 -> 923 bytes .../with_whitelist/00012.png | Bin 0 -> 424 bytes .../with_whitelist/00013.png | Bin 0 -> 542 bytes .../with_whitelist/00014.png | Bin 0 -> 413 bytes .../with_whitelist/00015.png | Bin 0 -> 793 bytes .../with_whitelist/00016.png | Bin 0 -> 841 bytes .../with_whitelist/00017.png | Bin 0 -> 828 bytes .../with_whitelist/00018.png | Bin 0 -> 459 bytes .../nano/test_sign_sc_rollup_originate.py | 41 +++++++++---- 167 files changed, 88 insertions(+), 14 deletions(-) delete mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/00040.png delete mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/00041.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00000.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00001.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00002.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00003.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00004.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00005.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00006.png rename tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/{00042.png => no_whitelist/00007.png} (100%) create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00008.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00009.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00010.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00011.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00012.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00013.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00014.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00015.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00016.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00017.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00018.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00019.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00020.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00021.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00022.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00023.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00024.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00025.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00026.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00027.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00028.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00029.png rename tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/{00043.png => no_whitelist/00030.png} (100%) rename tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/{00044.png => no_whitelist/00031.png} (100%) create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00000.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00001.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00002.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00003.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00004.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00005.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00006.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00007.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00008.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00009.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00010.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00011.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00012.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00013.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00014.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00015.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00016.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00017.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00018.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00019.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00020.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00021.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00022.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00023.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00024.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00025.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00026.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00027.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00028.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00029.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00030.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00031.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00032.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00033.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00034.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00035.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00036.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00037.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00038.png create mode 100644 tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00039.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00000.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00001.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00002.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00003.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00004.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00005.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00006.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00007.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00008.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00009.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00010.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00011.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00012.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00013.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00014.png rename tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/{00019.png => no_whitelist/00015.png} (100%) create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00000.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00001.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00002.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00003.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00004.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00005.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00006.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00007.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00008.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00009.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00010.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00011.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00012.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00013.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00014.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00015.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00016.png create mode 100644 tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00017.png rename tests/integration/nano/snapshots/{nanox/test_sign_sc_rollup_originate/00019.png => nanosp/test_sign_sc_rollup_originate/with_whitelist/00018.png} (100%) create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00000.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00001.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00002.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00003.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00004.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00005.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00006.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00007.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00008.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00009.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00010.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00011.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00012.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00013.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00014.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00015.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00000.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00001.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00002.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00003.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00004.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00005.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00006.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00007.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00008.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00009.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00010.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00011.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00012.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00013.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00014.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00015.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00016.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00017.png create mode 100644 tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00018.png diff --git a/app/src/parser/operation_parser.c b/app/src/parser/operation_parser.c index c80d97667..9703d2ca6 100644 --- a/app/src/parser/operation_parser.c +++ b/app/src/parser/operation_parser.c @@ -50,7 +50,8 @@ const char *const tz_operation_parser_step_name[] = {"OPTION", "READ_SORU_MESSAGES", "READ_SORU_KIND", "READ_BALLOT", - "READ_PROTOS"}; + "READ_PROTOS", + "READ_PKH_LIST"}; /** * @brief Get the string format of an operations step @@ -229,7 +230,10 @@ TZ_OPERATION_FIELDS(soru_origin_fields, TZ_OPERATION_MANAGER_OPERATION_FIELDS, TZ_OPERATION_FIELD("Kind", TZ_OPERATION_FIELD_SORU_KIND), TZ_OPERATION_FIELD("Kernel", TZ_OPERATION_FIELD_BINARY, .complex=true), - TZ_OPERATION_FIELD("Parameters", TZ_OPERATION_FIELD_EXPR, .complex=true) + TZ_OPERATION_FIELD("Parameters", TZ_OPERATION_FIELD_EXPR, .complex=true), + TZ_OPERATION_OPTION_FIELD("Whitelist", + TZ_OPERATION_FIELD("Whitelist", TZ_OPERATION_FIELD_PKH_LIST), + .display_none=false) ); /** @@ -1134,6 +1138,16 @@ tz_step_field(tz_parser_state *state) op->frame->step_read_string.skip = field->skip; break; } + case TZ_OPERATION_FIELD_PKH_LIST: { + op->frame->step = TZ_OPERATION_STEP_READ_PKH_LIST; + op->frame->step_read_list.name = name; + op->frame->step_read_list.index = 0; + op->frame->step_read_list.skip = field->skip; + tz_must(push_frame(state, TZ_OPERATION_STEP_SIZE)); + op->frame->step_size.size = 0; + op->frame->step_size.size_len = 4; + break; + } case TZ_OPERATION_FIELD_BALLOT: { op->frame->step = TZ_OPERATION_STEP_READ_BALLOT; op->frame->step_read_string.skip = field->skip; @@ -1180,6 +1194,42 @@ tz_step_read_pk(tz_parser_state *state) tz_continue; } +/** + * @brief Read a list of public key hash + * + * @param state: parser state + * @return tz_parser_result: parser result + */ +static tz_parser_result +tz_step_read_pkh_list(tz_parser_state *state) +{ + ASSERT_STEP(state, READ_PKH_LIST); + tz_operation_state *op = &state->operation; + tz_parser_regs *regs = &state->regs; + uint8_t skip = op->frame->step_read_list.skip; + const char *name = op->frame->step_read_list.name; + uint16_t index = op->frame->step_read_list.index; + + // Remaining content from previous public key hash - display this first. + if (regs->oofs > 0) { + tz_stop(IM_FULL); + } + + if (op->frame->stop == state->ofs) { + tz_must(pop_frame(state)); + } else { + op->frame->step_read_list.index++; + tz_must(push_frame(state, TZ_OPERATION_STEP_READ_BYTES)); + snprintf(state->field_info.field_name, TZ_FIELD_NAME_SIZE, "%s (%d)", + name, index); + op->frame->step_read_bytes.kind = TZ_OPERATION_FIELD_PKH; + op->frame->step_read_bytes.skip = skip; + op->frame->step_read_bytes.ofs = 0; + op->frame->step_read_bytes.len = 21; + } + tz_continue; +} + /** * @brief Read soru messages * @@ -1427,6 +1477,9 @@ tz_operation_parser_step(tz_parser_state *state) case TZ_OPERATION_STEP_READ_PROTOS: tz_must(tz_step_read_protos(state)); break; + case TZ_OPERATION_STEP_READ_PKH_LIST: + tz_must(tz_step_read_pkh_list(state)); + break; case TZ_OPERATION_STEP_PRINT: case TZ_OPERATION_STEP_PARTIAL_PRINT: tz_must(tz_step_print( diff --git a/app/src/parser/operation_state.h b/app/src/parser/operation_state.h index 9f7ba3467..f741f1bb9 100644 --- a/app/src/parser/operation_state.h +++ b/app/src/parser/operation_state.h @@ -66,7 +66,8 @@ typedef enum { TZ_OPERATION_STEP_READ_SORU_MESSAGES, TZ_OPERATION_STEP_READ_SORU_KIND, TZ_OPERATION_STEP_READ_BALLOT, - TZ_OPERATION_STEP_READ_PROTOS + TZ_OPERATION_STEP_READ_PROTOS, + TZ_OPERATION_STEP_READ_PKH_LIST } tz_operation_parser_step_kind; /** @@ -97,6 +98,7 @@ typedef enum { TZ_OPERATION_FIELD_BH, TZ_OPERATION_FIELD_SORU_MESSAGES, TZ_OPERATION_FIELD_SORU_KIND, + TZ_OPERATION_FIELD_PKH_LIST, TZ_OPERATION_FIELD_BALLOT } tz_operation_field_kind; diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/00030.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/00030.png index 1d7b32953660bc6deb9c7715d2c6e8f1f7efb3bd..7ba8f0d1000cede0949e0bd52e661c2647e98243 100644 GIT binary patch delta 359 zcmV-t0hs=(1A+sPB!5XsL_t(|ob8#*4ul{KMRDT%{|CF6S&%fev zD8g)EG{1wLZr|Y%AH_$xCM4^^LfwDIkT<%3_87ZjG(oKNQ7Bvt9dFS=rA=y(wxUyN zqDHR?eV^!=JLDr^j{5OY;xBMH#G6|-scI>tU~V8><(~8INq;sS5!q!UV5s`y^$ImX z?aNIe3JuFPRyzB_$H8vh=pU7^szFMPO--z8HllX*)r33bB`6ypPvXAr!g54kJedQ+ zlpIjMJ}pG8A24YvF+bB4)kcus?U;sXQ!D@g)Uhp&U%BKdS5Hx_%cmml+l#Wb3Tt&D zKJbOxnw7yKvS6(U4_I3T!RWcxv3120E)!5*4Eq+e6$c3@Z>Wt9y*ix^5}-W<)?e0`~nB(CO5DnKk_=$lZO~#Tt zIWIvlxg26+11pTf5SkP>i|}v7z!rKd^n7qjaHz}K>**`p uefHK&_bXRBgb+dqA%qY@2qA?0J#R|~4T>=^&0+um00{s|MNUMnLSTYb)xRJB diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/00031.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/00031.png index b5323069bc2c30d3c670b6336b418a1983dacdad..8644702b6cc19292c53b7e86b2e7417a7d5f5277 100644 GIT binary patch delta 510 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 iilQirq9}@@z`OzHE2>hozs~nG%D0%6C=`wN zk`L73?trk?FSOd%xK2r$yDhBKiLe5a;)BKk(X6iqY_TI&seb{!J>*sH`oCmF93RBd zWG#0i-&2qpTmeDfs2L`p3n9c|6aHU5z(kLQaR`-Q2q7e;>{Yg#K}}vF!}_;;wH6C4 znF&t%P7W1q1{3bnvASZ_xy+`1yjZHge~_S7IbyA<`Afivgzk0PvX9;CWmTBcyDt6O z%U5?GYpMCYoPXiO5m87Rw9jL#Ayf14(seaH;0Uq!+if$hNjJJxwN(jz%g?R=6_Gbp zMBc;)9FevC&A002ovPDHLkV1i``&lUgx diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/00034.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/00034.png index af0b0b8dbb90b0c32c828d30e7a915d0ca141aee..dae717760f03b98e8f1f79f4afc2c9519a88bf54 100644 GIT binary patch delta 513 zcmV+c0{;ET1DgbpB!A*bL_t(|ob8y&j>8}fK;3Hk{~z2#dq6_oF)k!%7v?`Hfk;Gqq7dhYbBO6>3x4f8coih zGRb*|9dxsB%pNbEgEFGhPG_bn%`s*N%?zrVR=_^*`zh}~?|*sSeP@-IDx^)8(i$ut zvWDWiBH&a201|-fbAO85MxX8q`=Bv+S_5k|0nMFZ0|<)ke?#q9?;+4cr(4kS7%U_a zwqcO2XV3#+bqwVDPkE%*5bLgyjRjA`ZGf#EZt+X1wu?F~A&$Tg=Yd`1A2O_fqM*oc z8$jDG8}$$R&VQ(?cQ`+N8(|qQuTm`SmNB-4;v}4~8#fkwi*QTBX?hddvE^8l6mH4y z59JS48UT<0SZ8F>1=ToBU2m~Gl^sIQNyk#oYj$IQG5v2f^XRr130S9;}WR{hokWLa6~ny%ZoY__DV z3(*8OHLY+3SoW#8wyM~z8h40X6Xhf`E!ZLPwl6fsDu8`Ushjxihir9+WEJTf$)-79 zAHQ(&h1(WZ)nbukmG3GBNy>3WQ4~c{6h%=KMR5*aT4#$u>~MiG00000NkvXXu0mjf DV*2%o delta 430 zcmV;f0a5;&1jqxBB!7=dL_t(|ob8y)5`!QNMWIvw|ASrF1v3LAxGNG+}f!Q7}FX2BFfiNj0yzjA<$9);_$RD&UekPxCbX!R^ro`t>l{&F>I<*&V4 zB`hbS-jT&AyoTb*oxk|I8`Fv@*O*T ztio}$+&nN?dw(~NmVpy{H}q8Q_=AmFR_e1ep?!Xf7X0j^{!~8=IT}y5xMieY<7kX! zp1A{Vk_!s!=<;fz4hO2hDn>4hq7YSEHsh8$Pk`uXqwWr3k%zSOnqf^)d(ksM0JhO3$H|G-{s7bFd|wO|7d%>QK{K^^MzQ>1%k9!XY)m2dh1)gpe19FUm^cf0X#vVmA`^-rY}J&7!d#f00000000000I&c*&wJqu+DtJ100000NkvXX Hu0mjfvjwT& delta 414 zcmV;P0b%}x1Goc_B!7QNL_t(|ob8#*62l+}MYWUs{|9H0E}Tgb5Q(uPo!+xbQ30qWM?kjNLQ z64iLsLTT{bKGL05>mZ)>`8u-R8ZHmC-JY$7)>zr!mfM>BTNShCX0%mfV!ju`7}Oynp+y0jDNl)LKg@Tb&A9S335W(LDfr4DQNX+FJKc#wdaN3wRD&KWxqF zRNGSce1ARQrpLn6x2>0eiFd+G)qv(N9c0u{PI;F@iS~cMbpG=M==0kA0_e4bu?VZ( zq&2idcZg>-yOenP7>uo)o;ZAECkg-n000000000002dhI4Qi_(@T_D`t^fc407*qo IM6N<$f(?4c3jhEB diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/00036.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/00036.png index 2ad0b2ec4b5e02d2e628048eac6a92dbec4d4ff9..12c797a15ac7a7aaf694b2352181eaf03cf68bb1 100644 GIT binary patch delta 518 zcmV+h0{Q*51E2(uB!A~gL_t(|ob8#xlEWYfhDoP={|D}&J-Fi_{323KHyys&LuwRI z5TZ-8iPw`}&*oYD6n)^pn4*}qLZE2b#%*9tnB##(m6r0hH?Y2)T~Iz&)03vxS{uJ) zO^}c~=w!@c2h}V-?c>qJHK9e(b{ajQG|kqz7c*KF?GD(t`hRxF+wC>3>)Q3U7Zg%D zYiWhyj->u>4!}c!h#Ci+ANy0p5`C;Hc)Sv(^}((8VvQ#1XV_1~*1w^4uGh)VlKUs0 z+193@b(tySk?Py=YS5A-yqCRX>5sIH#G!n^S@AjXPq3KQL`jP%cw{MQ(| zGkm;AybK+X{C_Hkx1&BTiO-B$JdCew5lYU42uJBgr*`|OJZoD|ju;M?YhZyP-FOfZ zbSaxvC%W0vJlYMVtL`4`3y=2gUG{*3p}Szv#Sq&Iwyeb)lKm?U`)VX;za6A@h>>z3 z{0W6?v04k%rAH05dmj9a{vm`G5M0J_L|nk^zY1F{-+vjfqIgW2O0YZTh|XB118nMA zXg|%SrkHD|5@YW}z$0@f=>GwQ^N(#OUxXBO-#(q9{|D%2SbX>euV)&1eS0O>u5~f? z5Si)#f3=+BuSDaNs=TZDU%l4GoUO zKX~+-T480BynpXNu1J>~0kBrORX3>pPHpicVU;8Hs*XN%$5f&;9chbdh~0BI0P&v# zX|TL6n<~~HgC$BtN7`cDpcqZD07zG!cav-${^xJv8w2^r)e__^e=tMr80r_t;W2dT zc;~2D`{ULvE@M>y%CjtVFW zD!?Y54|qPh|E$Q`s2y{Pa@I0|?8`Q818dS8cU@Hb(rT@aSUWqRw6DaHCg)ljzhq7{ zA%99EXAC<)v*@sod$+DZn-poM(^8ct**f-SMz5mZ0sCg(Uw`uccU;#vch>e&g|x;} zT4T5)!QRaY=u!ZH&H>l2{V8&RK9?0DUP;sY;AT~<(FAscJtG!>L+w;=kew;_Up}#| z4?)X)u#kk?hE7_mF2W!Oz-k}JVN4AS_Yljjk-$Qm(KNvNvTdpcx>XVB!-M?W7`iik zy(pp#9Z>u#M}Jq6!EQGEotH4Bs6lVej&>G;TakWb-PMpCY0q|ydxaD?;V;6Usko5g zL{GJMI$}$L_7-G;=L&pEW3>qhsxHzMF~*@lZ>^}KwI0-*KYlUN*XkG%715sP zmD9oywKE~;jfVleov8QQk3C!ml8WX4b+lLo0Z%v*7FJ>zbB*>0>=jnC=UftAJ5-wA z9vXgg9cdxCLQqAR}%Kha>-+7$LGh)q9}@@D2k#eilQirqWEE6Qh1Jy T=DaKj00000NkvXXu0mjfTvz4i delta 411 zcmV;M0c8I71GNK?B!7HKL_t(|ob8y&a>OtQL~&~T{~zpwb5NCHK}&;{iAbg2$%8#@ z1Q;!c1mwPopU1gOa9(OPU%;luzl&ADO2awM{n1B(H3_({{fw|`)PZ!dXB>HkaLh?9dj zo~)$|a@m4laRtQY26mW$DKsT+CgH!81Ka4WF%F>`3?YPw9MwCjliJ4Ww}@G=TZ?*; zGCl|1CRrdB!5>)L_t(|ob8y)62c%1MN`NA{|9$b7dQ+gfzSvogZGRJ0C)knmlW%e3vuP zguInOl|76gs+Deg+cUo=?NFqim6576$e`Z6(qU;CU~^fRs)?>wMw&dyKZa>e z_umW9ifI6_DsJ1;3Y3wVm$fj*tXzALc|FL?D+?p*HM{0RdkX?LGPeQP8_tTEWNrie z0pc}uHewL0=>CKVc%11YpoDxfNgteX4ZW4hEpy@v=vu%A0000000000001^0`sLYB T;}4sa00000NkvXXu0mjf&?u+Q delta 429 zcmV;e0aE^u1IGi9B!7-cL_t(|ob8$0lEWYfhOyJU{{!bDy>P}Vr;yZEI`e;5yNWCV z5^)P9AoTiJUS%04-6iDSdnp2MDfS`#N) ztdKg%PU5<9Dt~rcfV%6Pf08C%OTO~t=cfh*T2SXS_y>h)R`bz%;jxmpy%YschP6r^ zan{=0Jpm1;0)9eM*lU&sFqufbic7L3Y*kRtnSa~>$YnRIpGYLeQ!M;p$E5u~0Q`_E zC5Y@I9=QnmV*L|H|K!8}fgq_v){U11o^nez**ai$VXtMs)Lqy5M zjQJ-Df*=TjAeiPl={k1@;p1m_0P8@rKJk_)4|;*qGNXee&j3!>pp>vfJ9+8vik-Q`#HcZe_z0Gt$)IzVQ;v91E$I0{%u4K zcCvUD0$L2e7izz zvY=8@?>^dqt#ZlESCeCIUb)3|0%qbE?mN8eO&VdDe%B4h=oG|f!(s|9=qXWIVnL4x zZ$ke^7iDPlHq=@b$Cg}c5$4M3=TwE X+B?mmC6U&%00000NkvXXu0mjfZUnWr delta 420 zcmV;V0bBl*1HJ>0B!7iTL_t(|ob8xFlEfegMRlrk{{v@{URdQAz#o#POJ?f7RU(QA zgs8P7j5e|URYWB^I1>o4%8*0+5Kla~cv}ds@(I`5v zrEc1Wa{$tMzcE_h^STu2?y<2iC&L#|j2H|7$mV@BVVfVd$bU@mq zl3318K9?Xfxe}sdV^)}iAyg@@e!_n%2D;Ge#yq4dFoY0NN}Wo~}^j6!-L-4aPbR5XTY6sMk#31%D{xt3MN+ zcV{72Y!8&ohJUo&zqyBm0hoP{MeY3h^y7nQH($+JJl}iBmQEQ2c6Eneb(m^XBhfT?fqH)O8`7;{@y_p*H}DsD!H|> zGrN_^1)q?L;aDe_MT~N4)*EXe1?G)b1#d$MA%qY@2pu7W5JCtc5xfET>=Ts{of;tk O0000JqsOV2r&CQi4}N}4Yf=rP0QjP{x781E{u7hk z{)0q2mYQ%wo$eOw09H@1>g3e42F|?!1FF&XLg2{}+VMN!5w3mEOjQ@dpNwd!08Ur_ z6ss|g`&CQ*y;^Url=(I1*;jzCW6)!lH5a@vpNuzQ>~tTK_NKjd3>B80(+wO*u8D1*|!p_1lY5`qb9}sJ%7R|zeQBSC?57DChbEn0BrUPt@pLALy+lijWryE84wH& z8UfIT)^!{)1295?eo~)%$a^Hf?;sQi#V|Exo2~~-!Mfh17=ti%N zI6yTRLI?rkXiGJ=oE`QN%bNprmpiqDGf6b}!(eRlM{eNq7o<34`{vLM_+ZYP@m6+P z&Zd3Pf-q(S#tc}6mZZ)M)O!Cf0Z_9%!1_Oc+(`6xpg}hZVbNy{(?wXk()OqaP8UK5 jA%qY@2qAjLBIV?o|6pMvM0Kc0i0?4w_D2)Cbmn+C*#=q%5h&S84&z`lA4xMGeu zh41rKPjkFpsF{^#M@iqQ#jG~PO873r$g8M>(Q_{0sg4IVEf8`P>Oo|?qCQiImY}y;6Zo-9LI6S$_u4Ga$4n45M#%3cOOZj{ZJ$PSYF3~h+Y2L|$bV^j7`t_7_XZ?l zLJXN`3&*Z(8-fIylGe`ZM0%tTG^Q`Aa1`WBAOeCCTnAbj3L7FrYFkUZze~V4*rbkx zX-P=#{H4G}hAD^yh%apRn4Z=Xf}1fy?WCz};h;P!y&D95PfoKGoPH9z5A2evR*dQ(W62Dyqzg!Nge zm|5V#g_cQdmsI5Juk3;27s7}Z55@>!#q>tyfwg5+>qbZf=%sy%i&-kp5CT(>eyMq$ z(NmH>fhf1gJ_k&^{BXM1a3&-Ij7v;6;i2pM(VQmj2m6owsZH1$Wrx2!*(vDn2{{P| oFzaYt6h%=KMNt$*Q51zMFR$ literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00002.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..8b7980241856323a359afabb952612c53e1ab67b GIT binary patch literal 481 zcmV<70UrK|P)rCxSAdzGG?uW#eH+$K*l(v!s`4{OtpN@9oTmtm3uig!#u@&wWLPvk7QC?>!? z`XtBO7{Q_0!t=E z%&g|=evyLd31%+)R%s*FrN4?Z`Zl6FIkLzeeUa8SGO;P^C$k{$xsnpwvKovUGAQ_y zwzmcOVijL}qFl1>okBWSI!;ny|h3m|u2!=8kFx)&aHx*qv@ZJ#)OQ z6waXEc_?B!J6v%Z1D1f3+H9Am%-&}Jp}UX&AU`z$-Q%$<)5-@y5ClOG1VIo4L9miP XekfXGIc1__00000NkvXXu0mjfQvBJV literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00003.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..97eab5d99deeae5058b969d5401bab38b91bf938 GIT binary patch literal 482 zcmV<80UiE{P)a#U2H40TL`Z@#eu*>xkKKYC7Ik42f%KmnGk^3!3T|R4&ex+DR`KAXhKrHbi(`gav zA!!}L)PJ(=X<=F0eh6>hU;qGMfKs&8ho(wH%b@yJc9vt4-rLgCcSLrbYT1_)$&4CC zHG0OAua{%lNtmNiIM(VJj`dSGg1Cy9!!KYcsyf<>1nQL?EgO8fCyEettYwGQISB=# z1SCV3qPL-_%dLIOjH`bMGm%(M9beKf8Cr)$q&g89Oiz>m>AtFC%{FOm6jsa2ct)+M zvuLmOCL(mc0E3IRAWC1EG1xvnH1qAZIuejv*Cu-rjKJYf<1~4KR58 zm;a5ExUWZ}*bGk@yI=Rc8YMJbFGx%)kh__CNB!$#`>u;h7W_xzYEMfYI-aq`tM28; zC3dr06&~H=*3X%ClIz0j1AD$nIh?E(-ORORiszEcX|uK`_Ib2M?QQzS&C>racb4b} z#V3yUHd)PNu1V`S_*ie1NWXILGwnFXT>&~9Ihom}b=*69i+P#B{ZDaIx2uZezA|n# zak!`c>_WW%-Bn-Cn*Nh{pTS=6WObeEgX||cUOy-9Ic70A=dW7H^6h>MZok@>`!=*} z{cX!H{P)8a&IR{H>-)Q3AA5O1`{TT6avZ<+&+34IcLj|9-6s0$8R*FXLxRE6)z4*} HQ$iB}B3_GW literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00005.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..78b15b726690a1189cf8af3276b49e8f35fd069c GIT binary patch literal 359 zcmV-t0hs=YP)?FMG^0r2hj%3)QiO0?c%9R?OntNYU~L z6V}&JeJydE4J(k^fsU|WF3F1}nz^}Np=^eUF8&BGSXl!)s$Usc^QP84{0{!AnsP!% zx!f-D9!#Z$4rvl?F=41ntB_G1n%j~OdTv2odaxQn3$#}>iZ|D&mN2c zzS8)_zXdrbjxL~;(q~aJ09p_sgb+dqA%qY@2qA>roiE=-x0^M5;l=;}002ovPDHLk FV1nMpm@)tW literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00006.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..303483945e61b92a733b46d6df42175773978ddb GIT binary patch literal 288 zcmV+*0pI?KP)b4u57QZGorZarXkQ$Y=0FqvL2biyl7DS)l+wO}+)$ mbQh96f(8Hp00000px_C((rK|+dB8RR0000cltq9C z?9`%-Syy>zez+RiX;Q>|D)MFXL*k_8aRtH^|BG{$N zkc-p^D5&m8H!)Gy>G9`DU4pmo0Z$%2hjjInpNKk~k^<3fU;jCcj?9DR4D*(sS&(s`}pLij8pqG$!| z5dA=KMhmycaMdcw whH?*(l0MI$K86AS0000000000008Fk2VB291SG0gEdT%j07*qoM6N<$g2V8x*Z=?k literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00010.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..70bcb24d8e867442134dac65136bf87b1b51fa23 GIT binary patch literal 406 zcmV;H0crk;P)h65?%V9_27qgf;S{jlIvluj;FkT&@b!`J@L_ zZa+U^!<(2P!2kdNBdJe}j~e5&pxQa@69t|V4Yi9sir->>Wv95N6FgICw=825Yb$P# zxwbKS>i4S6S)EgJF|0f~M~$VkpbyZi9{B#EqB#r7_yf@Pf_Su`Wu&%cuO3AmTRD(| z44q&KI+b2>#cc*7wCIsgCw07*qoM6N<$f~SwJ At^fc4 literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00011.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00011.png new file mode 100644 index 0000000000000000000000000000000000000000..0720f431fdd0883d0c52124d295ab32967f7ce5f GIT binary patch literal 377 zcmV-<0fzpGP)bWsF`q=*JuhtHdcDD205dhGO-1$Z&C)cNTw z6Q+CM0=qFv)4N>{(%khlMZ$h)=8w5;Z8(wSXGS>#R*rty&)MlTplatO!-?dhgouh6 zutM|`$r&l!5yfHMa3bYA*rXTJsK&@4zue$bltC_2kkt9X!Q}TIp(1W^g69={i!sZmu=;v~a4jm4h1A-2SbR61#`Z6x7;< zs577myRxwkJ#zzMh)@4D;IYxS@mm?{D$Z)5tL2dri-$?>Z5aRn000000000005F9w XxZN)M5`$@g00000NkvXXu0mjfK}W4w literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00012.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00012.png new file mode 100644 index 0000000000000000000000000000000000000000..17c59ecff7968be07a8ebc47010789576f6ce613 GIT binary patch literal 402 zcmV;D0d4+?P)u2qB-w|bZxNAnoY&=c(!XrLSI1U5 zznpE-^ci}IeRV|3yKM)l4!ul~beu|kt9`BGLQ0&9dIs#A{dBa|sToi<_>tp6^e7RL zY6k3({Xz+5l`-6`Aw-cnHs^C@WC^(-UXDh_-wM)Odz;D&D*dyN%Ql+`11BqXu|h0} z81V{eKrj6iS2`}2ZDtGBTJJ3AG2pw7&nhEZ9di~Ww@Q$hN#|G)FJA-3JgOccWfL3N zCeoUxi(Xjwc@{99H;vs$Lhk>%1eGf6l;e5I2)z>Y0Fb&dPZ`0y0DZ`gTi#hVq822c w5x5fHI3jHZwxNU&LI@#*5JCtcgpfJ>0_!SF;E)I@X#fBK07*qoM6N<$f=wN--T(jq literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00013.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00013.png new file mode 100644 index 0000000000000000000000000000000000000000..b3219b3b23b4a7bf6aeba601ba88bd894c0732df GIT binary patch literal 394 zcmV;50d@X~P);4~#lX^LTM@AL~znx>k zG=^MYpBbg?!BTaSAF8eldLR|4iIHl|6ut`39ckVCsK% znhhs$LV^JR0EW{llY5Qvnp3q>nkqFiP-5vz>a>lk>l&!+TC&P==vH*RBx|em)h4OB zVN_PE6gLF9x1ja>@!3GU1#zm0A_(>LVrjXgqko%8I{cL>(IGV&#vEwEzOr~xd8qkH z$I@4uPG<`0Om2ei6lA$vjJklV>}wVC_W(p+#c&L*9@k2bz=@R;M1&07*qoM6N<$g6?yun*aa+ literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00014.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00014.png new file mode 100644 index 0000000000000000000000000000000000000000..5acbd69b1805491a83521edd31c83ef4985dc0ba GIT binary patch literal 418 zcmV;T0bTxyP)WZ`G+8P_p=5;6nH)A);yq zMCkoODW=!m8KYo3a3S?P*m^%KLyVEbKAkWWbtl&n)NA~o;bZ?X{hm2l11QXYkZCri z`Qv9g@JB=t7ytlZB;Bmu1Q_QdxzRRm6q-DSkC8_`VfEaM%$|BY6>_-NU%gY2yJ=&8 zZ7g&{;hsF6sBGbOkI&q@xQ{a%5$Sh9kHItO?%kG*?{mam5YI)dK7R4i_|S+5737#mAk3?NvCVb{v;m-yD0000000000003CR7wF$JBEcBwM*si- M07*qoM6N<$f?)Qx(*OVf literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00015.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00015.png new file mode 100644 index 0000000000000000000000000000000000000000..132f26c2a053caecb5a3019e768d261fb7d3c451 GIT binary patch literal 410 zcmV;L0cHM)P)WMV>hAE^l8_NG&enkNZ5~-`D3nID^4WYnNdc-%H9t<&rWPX)y8Xz6UkQz5fu@z zg7*{27|q=g!(dx+B4r$G+KXvaYvho3ceoU#lgkvOP5#H^YyUBRkDTlQw9Ge%u);L{ z{B$ec#0m)p001(A`iAX+#u-OEF|lTST0}w#?>EU9%VUpiVg9OVE-s>uxN+4&qvH1T zV{~{?VvOaPh36!}w)ZBhh)BK*qH#6cvp4+_RZVplWRFJ|LbXY2ti*PczYXhIR2h?k zn5Hc}jag?38kHz)E$vufv=MuD3eWObO9VUs@s_ls4cpr;D{0000000000005Z67pGN3&Gp@{sQ>@~07*qoM6N<$ Ef-SVP3;+NC literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00016.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00016.png new file mode 100644 index 0000000000000000000000000000000000000000..b544e3a1efd3ac52bc2dec19d0b9a199e4e590cd GIT binary patch literal 414 zcmV;P0b%}$P)3X%j1u%EWk^VmBCME znK0dh7T8T`G=11|l5*EeilqH$$sf6{RGdihlTl~D%F$1IyE-)!N;+>TPK3`ABC0ZA zh3FTGGgi1W9f$jh6RGoHvtCR?%#lML?rE;0({o?TvLy=}LtEC0)c7!_ zQ*Rlzxl3~0mPf1H5>EN!cXG5I+8Ll4d+Z+Zm@Rdul??sK>O9;&|J@(pFQb1Wp0!BT zGv8Q;Gby}y#Pl5dVz%z`kWQW~hr0y;0000000000007{5zRid{_k%U!cmMzZ07*qo IM6N<$g3a!`@c;k- literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00017.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00017.png new file mode 100644 index 0000000000000000000000000000000000000000..dc2a684395302cb32f7f6ae54f927c55426e3620 GIT binary patch literal 424 zcmV;Z0ayNsP)@3hI6Qmyu)t-^4w0vj!kcA7rYH zY5w_{HhhQ(35F0t1gTqNoQA4njz0A?ck!S2@stet0qSk;sAgF;s`H*~CgtiyOt;aE zjXy(vJS9VVKGZC&rj-L|-vzx*wv`JAp3op+w-R_YptKrHn$1T@Kaee zO;+BvHdBzkfiVor9{hG*dnWR#Hg<_K7ugBQqYA*-449y~`ppsQ6jQA?wl=f&;SN|u zsOUrGwAtumpabOPyYaG0pDvm6qYM2DiLJ+@(4*O}oDf0?A%qY@2qAN#ZSkL znXaK^*rm{D`m*IF<*KJ664t#X|KxpT$B8688TkqDZ2hnvz0+YsN#(VU6XCmrh_Vyl z!TO1$jArggMd5nKiR9;C(JH1P_Q)>p9?%uJk#iTME&gHn-v1f9M^5ela`PWV4uNU> z+3D_h6CNB4001z8T2o90RGvsO)|RiKN}54?LurE;B~3aH&Sli6nL|L$O)PIVi$oh) zRu%g;OGObOqk01TbNaL?rbRu`atCOBkv l000000000000017!57nlDGfZ9Lcst4002ovPDHLkV1hU2rr!Vn literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00019.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00019.png new file mode 100644 index 0000000000000000000000000000000000000000..2ed8f5a21585c38288816c99287cb0ebb4f06eec GIT binary patch literal 411 zcmV;M0c8G(P)GCEm4tQ0@(&D${ z#!YLeIrgYb+P-YLNxA7MM8bK^;#Xk(+`+wv2NaGA3H}4=)6sGal z&$Qr8ct|h+0Kf?CDLivkI|RmelPtisPD9U}Azec@4@v!~YYgr9l2x`*cN+&_PqjXz z%TQWK+3T9K(2!EZYrP=;l)pT+JuOP~f)bkddjhH_Hk--hM_r>yphv2wN4u=sYR3-0 zTNK(uxoBu)t*+@5H1r&4bB+=LMV2&jQS}tPi6?b+(#+B=o0S((#GR+4>4+7c(a!)) zWyDDCyiMOPH8(P+Yt_2sv^nhn0000000000004jo_yV9-K+e} z>_=iSwR9ge0&XiVBwYtv?Zz_1967J64Z0#ta$16F5C1TH?!PAQ2c12D+`NN>tT8=) z-C*JWfwEjKiU3>Rn!cjIZ>8F3-) z%=0BEodwOtsuOt9&b01DoCR@4I`K?~pU)`lP;>p>v7?LUsxO_L4(26D4jbw>?bNi| zcJBBZvBOwVf?mw^Pc6IvJ5(RK^*ulqI9cCyG7_m}Wk=T<>U>E>n>G{x0000000000 c003aYAGBB>IKM*HiU0rr07*qoM6N<$f?Bqrpa1{> literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00021.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00021.png new file mode 100644 index 0000000000000000000000000000000000000000..9f7edcff742f4be690056d0524773b3714fa5784 GIT binary patch literal 423 zcmV;Y0a*TtP)vy{(12F+)I;NpjiF#jnq(h-e?&ymaedF1UutCoUJYCB z{BpJ#ra80*_T3OI@3x(!I`zCn(s3#ErS`Rs3(0vZ$`!El=%=HuPSu36$$O3q(X&KE ziWRWK=x1^=-f*7;3CE5LDc8ZnsOx#hzKkD^R+*@Ak5f0=yl|C_u=9@YRl=0AwA zjcL5}3@a|;ga!iu02zS`l;1MKQ3308?9D~iOdjQPj`{el9@_}}XkkHP%biAd##;Tz zYTxQ{encg$v!G#oSNZq%3_Ery)madUM=?Uv=tZy89kw>(k&V$e{zs1w2$j{WcfHWv zn$@FTaX5ap#Hj^EyQzUre)X8Fx%3U+_${W uwb0a{edD)!1ONa40000000000yucT==T^DPk*`ny00005}Xm5Ljwelpq&$UOSx=&MsVp``Pc;zsx^A)+P& zGK_wuI%5s@iQ}-ZxREvwp4NwLh&gh#FB?onJIHMbvV#9IeD43uxStHx07~;8oOB!0 z^A~4X@k3-NFaQ9+DCQUEG$adISKT^E^%x~hbv*`8RhF0|5R5J^6N!ta_62ei?JQ#5 z5+@~nUH+g-IzCt}K|4dscg1C+-33i?*UEm^_8^;`5#lb$K}|r_(P66A7C+8~A`r2| zFOeL}mL0$MHOppCezwLNgDrmPh`1NA6R$;nT#-mewdfxus8&g*?1B+9C8(pzGMw?2 znBRt4MSpEWDKC&`wN$TsJF3>uPDCs2ApigX0000000000;LH30x<@+WNa1xz00000 LNkvXXu0mjfY-Y5B literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00024.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00024.png new file mode 100644 index 0000000000000000000000000000000000000000..5bd44f93ab1a1fc293a7f875bb4ad4fae113d41e GIT binary patch literal 440 zcmV;p0Z0CcP)L{z4ux(O&SSX+K3$RV%tuaE>{BbS z1Yg|9?p-&&HpVgW+ybAj$gu?*qjwf`EBH>}@9r6TGB;;If^EQYAIWRBR;^+LA@CHV z1A*Y^Bcr&-X5{ZPAD5uGpg=8(OTOuehzXM0m`}|CPtr4D5_E|g9DOHoY|1X;`7q6S z=+E4fpx$0VkUH)4d=ey+{>;7q1Ke2JXnm~Cy2|Trmi*82YUM0000GA`-!$Ap7w977+=@^*=s7)XN6^7_vC{ zJgHGhpZFha;~}*@P;cuQgnVo+ToZ zWWWy5k3?r`;XZL3_8TrF&4X9%#WIRHa>=_5Zbcg8v;@@#|6%mp|C+d;G}Zvw<{O-3 z8`JZL)7|hPb|^4}5TXdVz&yD)7X!MknQG3dYTTN0^13C#y(%@$Lt@kOHpo7@wz!pT zCtCA$`Xsnlh}oKbOVhdw0-3v}Bi25@g_t$Qx{=~8$n4n6V$&#+Xir!}ir!qW1gLWT zAJ0s>rqFzwZNo>b;W~( z4dL#3^Q2e62hi8zl=kDg++H+G03HoldHCgo zS*G96TG*|jwEVHG+aoDlTl|t;D9nG5IW?yF z=V#jRA|ezR003a5w)pf#(>xgH>UgX)wKC+fHC)X}{82eS{l-pKjQ5qNxt2qQmFWjvpnU7gVqq&?@{jQ*&)aT-xg zms!;#iQH)x1VhJAHZF#Q-5LElb5Tuu``|7?p6vTchL*~1l=xAH0i*h$lps0%J*!V5 zm%sEGGb--5E!NsQDKvD9_Rf~@p|0j=Q#jOycBA^<8vpM35IZCo003YFMOOKpu_S8cpz=Q@Qz6ffeXX^P$SJw&@%kGeKUN-zd{wzowbZv= zthJ5k?x;N;H49oTXfl1z2J=rE9*=edQ46AH+q2#kRZCSVtnso>vo%lu8zfGT2HFJ3 z%E>K>S_reWEDCG#rp;P+iQl7vHUV9zOhcl`j1RL%Uu&~G4x0cEMLu~LufEn+dX#69 zONsp5R|^1@l0bv5)0$Ivv`5(n00000000000000mlOOcWT(aM@jo<(P002ovPDHLk FV1ly6vfcmy literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00028.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00028.png new file mode 100644 index 0000000000000000000000000000000000000000..fb6611ffe2787485f77fecc945d8ed169f4aef41 GIT binary patch literal 397 zcmV;80doF{P)Lk}o&}i@v!)yO%@}9Za11QWp$TSDj z{IRp_coPv87ytlZq-hW3&(4%Z8Z8H2m#<3l*OiL?N`Uy1>t1pO)`;a(i8 zk<&>IQes|ZwRvad*npM+PK(fvl5Lz8*{|qJ0eXf*wTY|St~?UA{Q|az_p1VT5w*z3 z&sNg!19V7H*sm~$qD+=h>kz&N>^-$}^|4y80g5ub4`FsTJTZ@;egPI~GI|---PIU2 zIHk3Uh++Of=pN9j+-8nGrpXYS(3b*&YSQ#Dc8FERAKjhK{cRos@5M2_N>b3zv8Dkq zEbo6-9~L$Mlp_Ca_19B9_#_9ILdriM5|g{)0uFE=Hr8V0)XsuScw|SvJS$$ZHjQ0VG z55;1!u_8qDE#{h6Q)QnQGA>8xJMFwxuZA*4(06`ANnan|`dQGu;Rus-4dHm4svt0;=1D2k%+@Bq*KU0yYTz|jBz002ovPDHLkV1f}m=$ill literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/00043.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00030.png similarity index 100% rename from tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/00043.png rename to tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00030.png diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/00044.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00031.png similarity index 100% rename from tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/00044.png rename to tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/no_whitelist/00031.png diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00000.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..053fc534be7eed4c1cf588f2d2252826fd4eae15 GIT binary patch literal 395 zcmV;60d)R}P)jLBIV?o|6pMvM0Kc0i0?4w_D2)Cbmn+C*#=q%5h&S84&z`lA4xMGeu zh41rKPjkFpsF{^#M@iqQ#jG~PO873r$g8M>(Q_{0sg4IVEf8`P>Oo|?qCQiImY}y;6Zo-9LI6S$_u4Ga$4n45M#%3cOOZj{ZJ$PSYF3~h+Y2L|$bV^j7`t_7_XZ?l zLJXN`3&*Z(8-fIylGe`ZM0%tTG^Q`Aa1`WBAOeCCTnAbj3L7FrYFkUZze~V4*rbkx zX-P=#{H4G}hAD^yh%apRn4Z=Xf}1fy?WCz};h;P!y&D95PfoKGoPH9z5A2evR*dQ(W62Dyqzg!Nge zm|5V#g_cQdmsI5Juk3;27s7}Z55@>!#q>tyfwg5+>qbZf=%sy%i&-kp5CT(>eyMq$ z(NmH>fhf1gJ_k&^{BXM1a3&-Ij7v;6;i2pM(VQmj2m6owsZH1$Wrx2!*(vDn2{{P| oFzaYt6h%=KMNt$*Q51zMFR$ literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00002.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..8b7980241856323a359afabb952612c53e1ab67b GIT binary patch literal 481 zcmV<70UrK|P)rCxSAdzGG?uW#eH+$K*l(v!s`4{OtpN@9oTmtm3uig!#u@&wWLPvk7QC?>!? z`XtBO7{Q_0!t=E z%&g|=evyLd31%+)R%s*FrN4?Z`Zl6FIkLzeeUa8SGO;P^C$k{$xsnpwvKovUGAQ_y zwzmcOVijL}qFl1>okBWSI!;ny|h3m|u2!=8kFx)&aHx*qv@ZJ#)OQ z6waXEc_?B!J6v%Z1D1f3+H9Am%-&}Jp}UX&AU`z$-Q%$<)5-@y5ClOG1VIo4L9miP XekfXGIc1__00000NkvXXu0mjfQvBJV literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00003.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..97eab5d99deeae5058b969d5401bab38b91bf938 GIT binary patch literal 482 zcmV<80UiE{P)a#U2H40TL`Z@#eu*>xkKKYC7Ik42f%KmnGk^3!3T|R4&ex+DR`KAXhKrHbi(`gav zA!!}L)PJ(=X<=F0eh6>hU;qGMfKs&8ho(wH%b@yJc9vt4-rLgCcSLrbYT1_)$&4CC zHG0OAua{%lNtmNiIM(VJj`dSGg1Cy9!!KYcsyf<>1nQL?EgO8fCyEettYwGQISB=# z1SCV3qPL-_%dLIOjH`bMGm%(M9beKf8Cr)$q&g89Oiz>m>AtFC%{FOm6jsa2ct)+M zvuLmOCL(mc0E3IRAWC1EG1xvnH1qAZIuejv*Cu-rjKJYf<1~4KR58 zm;a5ExUWZ}*bGk@yI=Rc8YMJbFGx%)kh__CNB!$#`>u;h7W_xzYEMfYI-aq`tM28; zC3dr06&~H=*3X%ClIz0j1AD$nIh?E(-ORORiszEcX|uK`_Ib2M?QQzS&C>racb4b} z#V3yUHd)PNu1V`S_*ie1NWXILGwnFXT>&~9Ihom}b=*69i+P#B{ZDaIx2uZezA|n# zak!`c>_WW%-Bn-Cn*Nh{pTS=6WObeEgX||cUOy-9Ic70A=dW7H^6h>MZok@>`!=*} z{cX!H{P)8a&IR{H>-)Q3AA5O1`{TT6avZ<+&+34IcLj|9-6s0$8R*FXLxRE6)z4*} HQ$iB}B3_GW literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00005.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..78b15b726690a1189cf8af3276b49e8f35fd069c GIT binary patch literal 359 zcmV-t0hs=YP)?FMG^0r2hj%3)QiO0?c%9R?OntNYU~L z6V}&JeJydE4J(k^fsU|WF3F1}nz^}Np=^eUF8&BGSXl!)s$Usc^QP84{0{!AnsP!% zx!f-D9!#Z$4rvl?F=41ntB_G1n%j~OdTv2odaxQn3$#}>iZ|D&mN2c zzS8)_zXdrbjxL~;(q~aJ09p_sgb+dqA%qY@2qA>roiE=-x0^M5;l=;}002ovPDHLk FV1nMpm@)tW literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00006.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..303483945e61b92a733b46d6df42175773978ddb GIT binary patch literal 288 zcmV+*0pI?KP)b4u57QZGorZarXkQ$Y=0FqvL2biyl7DS)l+wO}+)$ mbQh96f(8Hp00000px_C((rK|+dB8RR0000H2m#<3l*OiL?N`Uy1>t1pO)`;a(i8 zk<&>IQes|ZwRvad*npM+PK(fvl5Lz8*{|qJ0eXf*wTY|St~?UA{Q|az_p1VT5w*z3 z&sNg!19V7H*sm~$qD+=h>kz&N>^-$}^|4y80g5ub4`FsTJTZ@;egPI~GI|---PIU2 zIHk3Uh++Of=pN9j+-8nGrpXYS(3b*&YSQ#Dc8FERAKjhK{cRos@5M2_N>b3zv8Dkq zEbo6-9~L$Mlp_Ca_19B9_#_9ILdriM5|g{)0uFE=Hr8V0)XsuScw|SvJS$$ZHjQ0VG z55;1!u_8qDE#{h6Q)QnQGA>8xJMFwxuZA*4(06`ANnan|`dQGu;Rus-4dHm4svt0;=1D2k%+@Bq*KU0yYTz|jBz002ovPDHLkV1f}m=$ill literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00008.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00008.png new file mode 100644 index 0000000000000000000000000000000000000000..1d1b09a149fcb631c5c38870911b98cd58fd5fd0 GIT binary patch literal 385 zcmV-{0e=38P)cltq9C z?9`%-Syy>zez+RiX;Q>|D)MFXL*k_8aRtH^|BG{$N zkc-p^D5&m8H!)Gy>G9`DU4pmo0Z$%2hjjInpNKk~k^<3fU;jCcj?9DR4D*(sS&(s`}pLij8pqG$!| z5dA=KMhmycaMdcw whH?*(l0MI$K86AS0000000000008Fk2VB291SG0gEdT%j07*qoM6N<$g2V8x*Z=?k literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00010.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00010.png new file mode 100644 index 0000000000000000000000000000000000000000..70bcb24d8e867442134dac65136bf87b1b51fa23 GIT binary patch literal 406 zcmV;H0crk;P)h65?%V9_27qgf;S{jlIvluj;FkT&@b!`J@L_ zZa+U^!<(2P!2kdNBdJe}j~e5&pxQa@69t|V4Yi9sir->>Wv95N6FgICw=825Yb$P# zxwbKS>i4S6S)EgJF|0f~M~$VkpbyZi9{B#EqB#r7_yf@Pf_Su`Wu&%cuO3AmTRD(| z44q&KI+b2>#cc*7wCIsgCw07*qoM6N<$f~SwJ At^fc4 literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00011.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00011.png new file mode 100644 index 0000000000000000000000000000000000000000..0720f431fdd0883d0c52124d295ab32967f7ce5f GIT binary patch literal 377 zcmV-<0fzpGP)bWsF`q=*JuhtHdcDD205dhGO-1$Z&C)cNTw z6Q+CM0=qFv)4N>{(%khlMZ$h)=8w5;Z8(wSXGS>#R*rty&)MlTplatO!-?dhgouh6 zutM|`$r&l!5yfHMa3bYA*rXTJsK&@4zue$bltC_2kkt9X!Q}TIp(1W^g69={i!sZmu=;v~a4jm4h1A-2SbR61#`Z6x7;< zs577myRxwkJ#zzMh)@4D;IYxS@mm?{D$Z)5tL2dri-$?>Z5aRn000000000005F9w XxZN)M5`$@g00000NkvXXu0mjfK}W4w literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00012.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00012.png new file mode 100644 index 0000000000000000000000000000000000000000..17c59ecff7968be07a8ebc47010789576f6ce613 GIT binary patch literal 402 zcmV;D0d4+?P)u2qB-w|bZxNAnoY&=c(!XrLSI1U5 zznpE-^ci}IeRV|3yKM)l4!ul~beu|kt9`BGLQ0&9dIs#A{dBa|sToi<_>tp6^e7RL zY6k3({Xz+5l`-6`Aw-cnHs^C@WC^(-UXDh_-wM)Odz;D&D*dyN%Ql+`11BqXu|h0} z81V{eKrj6iS2`}2ZDtGBTJJ3AG2pw7&nhEZ9di~Ww@Q$hN#|G)FJA-3JgOccWfL3N zCeoUxi(Xjwc@{99H;vs$Lhk>%1eGf6l;e5I2)z>Y0Fb&dPZ`0y0DZ`gTi#hVq822c w5x5fHI3jHZwxNU&LI@#*5JCtcgpfJ>0_!SF;E)I@X#fBK07*qoM6N<$f=wN--T(jq literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00013.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00013.png new file mode 100644 index 0000000000000000000000000000000000000000..b3219b3b23b4a7bf6aeba601ba88bd894c0732df GIT binary patch literal 394 zcmV;50d@X~P);4~#lX^LTM@AL~znx>k zG=^MYpBbg?!BTaSAF8eldLR|4iIHl|6ut`39ckVCsK% znhhs$LV^JR0EW{llY5Qvnp3q>nkqFiP-5vz>a>lk>l&!+TC&P==vH*RBx|em)h4OB zVN_PE6gLF9x1ja>@!3GU1#zm0A_(>LVrjXgqko%8I{cL>(IGV&#vEwEzOr~xd8qkH z$I@4uPG<`0Om2ei6lA$vjJklV>}wVC_W(p+#c&L*9@k2bz=@R;M1&07*qoM6N<$g6?yun*aa+ literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00014.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00014.png new file mode 100644 index 0000000000000000000000000000000000000000..5acbd69b1805491a83521edd31c83ef4985dc0ba GIT binary patch literal 418 zcmV;T0bTxyP)WZ`G+8P_p=5;6nH)A);yq zMCkoODW=!m8KYo3a3S?P*m^%KLyVEbKAkWWbtl&n)NA~o;bZ?X{hm2l11QXYkZCri z`Qv9g@JB=t7ytlZB;Bmu1Q_QdxzRRm6q-DSkC8_`VfEaM%$|BY6>_-NU%gY2yJ=&8 zZ7g&{;hsF6sBGbOkI&q@xQ{a%5$Sh9kHItO?%kG*?{mam5YI)dK7R4i_|S+5737#mAk3?NvCVb{v;m-yD0000000000003CR7wF$JBEcBwM*si- M07*qoM6N<$f?)Qx(*OVf literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00015.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00015.png new file mode 100644 index 0000000000000000000000000000000000000000..132f26c2a053caecb5a3019e768d261fb7d3c451 GIT binary patch literal 410 zcmV;L0cHM)P)WMV>hAE^l8_NG&enkNZ5~-`D3nID^4WYnNdc-%H9t<&rWPX)y8Xz6UkQz5fu@z zg7*{27|q=g!(dx+B4r$G+KXvaYvho3ceoU#lgkvOP5#H^YyUBRkDTlQw9Ge%u);L{ z{B$ec#0m)p001(A`iAX+#u-OEF|lTST0}w#?>EU9%VUpiVg9OVE-s>uxN+4&qvH1T zV{~{?VvOaPh36!}w)ZBhh)BK*qH#6cvp4+_RZVplWRFJ|LbXY2ti*PczYXhIR2h?k zn5Hc}jag?38kHz)E$vufv=MuD3eWObO9VUs@s_ls4cpr;D{0000000000005Z67pGN3&Gp@{sQ>@~07*qoM6N<$ Ef-SVP3;+NC literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00016.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00016.png new file mode 100644 index 0000000000000000000000000000000000000000..b544e3a1efd3ac52bc2dec19d0b9a199e4e590cd GIT binary patch literal 414 zcmV;P0b%}$P)3X%j1u%EWk^VmBCME znK0dh7T8T`G=11|l5*EeilqH$$sf6{RGdihlTl~D%F$1IyE-)!N;+>TPK3`ABC0ZA zh3FTGGgi1W9f$jh6RGoHvtCR?%#lML?rE;0({o?TvLy=}LtEC0)c7!_ zQ*Rlzxl3~0mPf1H5>EN!cXG5I+8Ll4d+Z+Zm@Rdul??sK>O9;&|J@(pFQb1Wp0!BT zGv8Q;Gby}y#Pl5dVz%z`kWQW~hr0y;0000000000007{5zRid{_k%U!cmMzZ07*qo IM6N<$g3a!`@c;k- literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00017.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00017.png new file mode 100644 index 0000000000000000000000000000000000000000..dc2a684395302cb32f7f6ae54f927c55426e3620 GIT binary patch literal 424 zcmV;Z0ayNsP)@3hI6Qmyu)t-^4w0vj!kcA7rYH zY5w_{HhhQ(35F0t1gTqNoQA4njz0A?ck!S2@stet0qSk;sAgF;s`H*~CgtiyOt;aE zjXy(vJS9VVKGZC&rj-L|-vzx*wv`JAp3op+w-R_YptKrHn$1T@Kaee zO;+BvHdBzkfiVor9{hG*dnWR#Hg<_K7ugBQqYA*-449y~`ppsQ6jQA?wl=f&;SN|u zsOUrGwAtumpabOPyYaG0pDvm6qYM2DiLJ+@(4*O}oDf0?A%qY@2qAN#ZSkL znXaK^*rm{D`m*IF<*KJ664t#X|KxpT$B8688TkqDZ2hnvz0+YsN#(VU6XCmrh_Vyl z!TO1$jArggMd5nKiR9;C(JH1P_Q)>p9?%uJk#iTME&gHn-v1f9M^5ela`PWV4uNU> z+3D_h6CNB4001z8T2o90RGvsO)|RiKN}54?LurE;B~3aH&Sli6nL|L$O)PIVi$oh) zRu%g;OGObOqk01TbNaL?rbRu`atCOBkv l000000000000017!57nlDGfZ9Lcst4002ovPDHLkV1hU2rr!Vn literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00019.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00019.png new file mode 100644 index 0000000000000000000000000000000000000000..2ed8f5a21585c38288816c99287cb0ebb4f06eec GIT binary patch literal 411 zcmV;M0c8G(P)GCEm4tQ0@(&D${ z#!YLeIrgYb+P-YLNxA7MM8bK^;#Xk(+`+wv2NaGA3H}4=)6sGal z&$Qr8ct|h+0Kf?CDLivkI|RmelPtisPD9U}Azec@4@v!~YYgr9l2x`*cN+&_PqjXz z%TQWK+3T9K(2!EZYrP=;l)pT+JuOP~f)bkddjhH_Hk--hM_r>yphv2wN4u=sYR3-0 zTNK(uxoBu)t*+@5H1r&4bB+=LMV2&jQS}tPi6?b+(#+B=o0S((#GR+4>4+7c(a!)) zWyDDCyiMOPH8(P+Yt_2sv^nhn0000000000004jo_yV9-K+e} z>_=iSwR9ge0&XiVBwYtv?Zz_1967J64Z0#ta$16F5C1TH?!PAQ2c12D+`NN>tT8=) z-C*JWfwEjKiU3>Rn!cjIZ>8F3-) z%=0BEodwOtsuOt9&b01DoCR@4I`K?~pU)`lP;>p>v7?LUsxO_L4(26D4jbw>?bNi| zcJBBZvBOwVf?mw^Pc6IvJ5(RK^*ulqI9cCyG7_m}Wk=T<>U>E>n>G{x0000000000 c003aYAGBB>IKM*HiU0rr07*qoM6N<$f?Bqrpa1{> literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00021.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00021.png new file mode 100644 index 0000000000000000000000000000000000000000..9f7edcff742f4be690056d0524773b3714fa5784 GIT binary patch literal 423 zcmV;Y0a*TtP)vy{(12F+)I;NpjiF#jnq(h-e?&ymaedF1UutCoUJYCB z{BpJ#ra80*_T3OI@3x(!I`zCn(s3#ErS`Rs3(0vZ$`!El=%=HuPSu36$$O3q(X&KE ziWRWK=x1^=-f*7;3CE5LDc8ZnsOx#hzKkD^R+*@Ak5f0=yl|C_u=9@YRl=0AwA zjcL5}3@a|;ga!iu02zS`l;1MKQ3308?9D~iOdjQPj`{el9@_}}XkkHP%biAd##;Tz zYTxQ{encg$v!G#oSNZq%3_Ery)madUM=?Uv=tZy89kw>(k&V$e{zs1w2$j{WcfHWv zn$@FTaX5ap#Hj^EyQzUre)X8Fx%3U+_${W uwb0a{edD)!1ONa40000000000yucT==T^DPk*`ny00005}Xm5Ljwelpq&$UOSx=&MsVp``Pc;zsx^A)+P& zGK_wuI%5s@iQ}-ZxREvwp4NwLh&gh#FB?onJIHMbvV#9IeD43uxStHx07~;8oOB!0 z^A~4X@k3-NFaQ9+DCQUEG$adISKT^E^%x~hbv*`8RhF0|5R5J^6N!ta_62ei?JQ#5 z5+@~nUH+g-IzCt}K|4dscg1C+-33i?*UEm^_8^;`5#lb$K}|r_(P66A7C+8~A`r2| zFOeL}mL0$MHOppCezwLNgDrmPh`1NA6R$;nT#-mewdfxus8&g*?1B+9C8(pzGMw?2 znBRt4MSpEWDKC&`wN$TsJF3>uPDCs2ApigX0000000000;LH30x<@+WNa1xz00000 LNkvXXu0mjfY-Y5B literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00024.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00024.png new file mode 100644 index 0000000000000000000000000000000000000000..5bd44f93ab1a1fc293a7f875bb4ad4fae113d41e GIT binary patch literal 440 zcmV;p0Z0CcP)L{z4ux(O&SSX+K3$RV%tuaE>{BbS z1Yg|9?p-&&HpVgW+ybAj$gu?*qjwf`EBH>}@9r6TGB;;If^EQYAIWRBR;^+LA@CHV z1A*Y^Bcr&-X5{ZPAD5uGpg=8(OTOuehzXM0m`}|CPtr4D5_E|g9DOHoY|1X;`7q6S z=+E4fpx$0VkUH)4d=ey+{>;7q1Ke2JXnm~Cy2|Trmi*82YUM0000GA`-!$Ap7w977+=@^*=s7)XN6^7_vC{ zJgHGhpZFha;~}*@P;cuQgnVo+ToZ zWWWy5k3?r`;XZL3_8TrF&4X9%#WIRHa>=_5Zbcg8v;@@#|6%mp|C+d;G}Zvw<{O-3 z8`JZL)7|hPb|^4}5TXdVz&yD)7X!MknQG3dYTTN0^13C#y(%@$Lt@kOHpo7@wz!pT zCtCA$`Xsnlh}oKbOVhdw0-3v}Bi25@g_t$Qx{=~8$n4n6V$&#+Xir!}ir!qW1gLWT zAJ0s>rqFzwZNo>b;W~( z4dL#3^Q2e62hi8zl=kDg++H+G03HoldHCgo zS*G96TG*|jwEVHG+aoDlTl|t;D9nG5IW?yF z=V#jRA|ezR003a5w)pf#(>xgH>UgX)wKC+fHC)X}{82eS{l-pKjQ5qNxt2qQmFWjvpnU7gVqq&?@{jQ*&)aT-xg zms!;#iQH)x1VhJAHZF#Q-5LElb5Tuu``|7?p6vTchL*~1l=xAH0i*h$lps0%J*!V5 zm%sEGGb--5E!NsQDKvD9_Rf~@p|0j=Q#jOycBA^<8vpM35IZCo003YFMOOKpu_S8cpz=Q@Qz6ffeXX^P$SJw&@%kGeKUN-zd{wzowbZv= zthJ5k?x;N;H49oTXfl1z2J=rE9*=edQ46AH+q2#kRZCSVtnso>vo%lu8zfGT2HFJ3 z%E>K>S_reWEDCG#rp;P+iQl7vHUV9zOhcl`j1RL%Uu&~G4x0cEMLu~LufEn+dX#69 zONsp5R|^1@l0bv5)0$Ivv`5(n00000000000000mlOOcWT(aM@jo<(P002ovPDHLk FV1ly6vfcmy literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00028.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00028.png new file mode 100644 index 0000000000000000000000000000000000000000..fb6611ffe2787485f77fecc945d8ed169f4aef41 GIT binary patch literal 397 zcmV;80doF{P)Lk}o&}i@v!)yO%@}9Za11QWp$TSDj z{IRp_coPv87ytlZq-hW3&(4%Z8Z8H2m#<3l*OiL?N`Uy1>t1pO)`;a(i8 zk<&>IQes|ZwRvad*npM+PK(fvl5Lz8*{|qJ0eXf*wTY|St~?UA{Q|az_p1VT5w*z3 z&sNg!19V7H*sm~$qD+=h>kz&N>^-$}^|4y80g5ub4`FsTJTZ@;egPI~GI|---PIU2 zIHk3Uh++Of=pN9j+-8nGrpXYS(3b*&YSQ#Dc8FERAKjhK{cRos@5M2_N>b3zv8Dkq zEbo6-9~L$Mlp_Ca_19B9_#_9ILdriM5|g{)0uFE=Hr8V0)XsuScw|SvJS$$ZHjQ0VG z55;1!u_8qDE#{h6Q)QnQGA>8xJMFwxuZA*4(06`ANnan|`dQGu;Rus-4dHm4svt0;=1D2k%+@Bq*KU0yYTz|jBz002ovPDHLkV1f}m=$ill literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00030.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00030.png new file mode 100644 index 0000000000000000000000000000000000000000..7ba8f0d1000cede0949e0bd52e661c2647e98243 GIT binary patch literal 386 zcmV-|0e$|7P)J`TPVV8VKl#koo?UZ5g)}zxh5p*!b07D z$B;L=fc6->Vl+Xl^ie2W3>|OLL8VPzYNAH334NdFnLFeoV2=9nQQ|LfImDY= zHmPbUq+o6!T;-ng?nyQs5!q!UV5s`y^$ImX?aNIe3JuFPRyzB_$H8vh=pU7^szFMP zO--z8HllX*)r33bB`6ypPvXAr!g54kJedQ+lpIjMJ}pG8A24YvF+bB4)kcus?U;sX zQ!D@g)Uhp&U%BKdS5Hx_%cmml+l#Wb3Tt&DKJbOxnw7yKvaJXYSX%|b=(*Ohb;T1d z6Hs0Z`xdkn2MH)|sErQ2I-L#@ph|FU6QT(R>IeP*fH&Yn{orB*s7$Cr_!0#G00000 g000000N_>p0a(ew_nPD$kN^Mx07*qoM6N<$g2Ah!wg3PC literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00031.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00031.png new file mode 100644 index 0000000000000000000000000000000000000000..8644702b6cc19292c53b7e86b2e7417a7d5f5277 GIT binary patch literal 536 zcmV+z0_XjSP)aYSvOwv_Ui<*`P(()HBJ(V79#*_LL>G?}#RiK5XWV_OH*0BIHYGbegvX?EEN7 zG8M^-MoUrJ^;AoG?R^HEH2ZeQ+s|1%is5MpuZ>4(70@5JM#Q9E4spQ6u|EY3VSFNH zi`X^vKKN)a0@M_x!Y+z!KUX`|`yBc}?@Lgu4+1&hHrGkF;H&{9)Cc4Er)H$(5L;c5 z!a|$TWq|e7Hp(nnqn7R`7x~-3-I<&P;(#PkVCgv-Y^-6(QPxfPm&}_k|arzBuSFw aN`3+S1CVQMJ=Yfi0000jgU^ZjoIF`y&51o|F;4RDnckp=w037H4ck<_PHZr1O%#mLg z8>w0~T5Jjn%;qHrbPBTJ^UU$A+>f;0T$2wA@CITCt`FH zTSHrem-fR1H=yjW7tPjB*E{yR5A8&6x1hN-m`I>(-6B0g=L~?UHQ?hP%1B*9*(HjlYb0P}kMp!RYbFev`Yg}JWNJ9+uCwX|!l zW}gpa`fIal^ol1tUxsC)U`CF*x|(EH*Dm1*tQ8SM>tXSSnmTV7#O@w;x?`<6uB+K0 z_Z&wCdIfNX&XfL8T8!Kvznn=u6IUdfQ)gdO?9uvrqT)b!FfF|TaQ8Jk+Gw5DMj>~0 z9?z&XaTL`{?A6a$0Sc40Ac%IX$UZ(a@(pi?yav6r%qu_)GG79(%J4)bj8F$xr27o$ z`XG{GOCx+3lHHllvhqahqi6@IXr~)q5i`buEpM?*w+LcWq<={!3&{c`Ns=TR literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00033.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00033.png new file mode 100644 index 0000000000000000000000000000000000000000..c00d3c06c2615657ed1427e05cfb7d9abb691cb0 GIT binary patch literal 518 zcmV+h0{Q)kP)AI01|-nbAO1rLO;DK?1RSO zW;LwQ1T=TT1t2N5|3d9p??s@APD{}87%XHWY+;bjCs+eubqwVD4|$}|A-1|^3JdOr zmjO05Eb&WbZ5MU5gt!ELI4`)0{2<{BD1MbA)l2S`@MaZ&+=gXtv=quJER|v$+Z;KW zRw-Xz56Zcde&L>|_0e{8fdp0B5-g?IBTF{ut<`9aVsQ9<)kmSXjE@`b4I3zYS%yN+|#cL&&H0gbRLK;oZpEAjLhaGgYaLgVro`W)?(oSclD$Oxw z2h9wsnpVI*@B1n5Kks?neP@-IDx^)8(i$utvWDWiBH&a201|-fbAO85MxX8q`=Bv+ zS_5k|0nMFZ0|<)ke?#q9?;+4cr(4kS7%U_awqcO2XV3#+bqwVDPkE%*5bLgyjRjA` zZGf#EZt+X1wu?F~A&$Tg=Yd`1A2O_fqM*oc8$jDG8}$$R&Zw$)I6r+GVHq#4QY`J3 zF}8)`B%H7tHx_)0a7)8!dK22QG9*m1ZsJ@3jzI5Yob!ZQ5<9uaBvbbHcjE%)AM) zaOi7Q^1}32YaPo!Q7FN|_kz|$cDh5f)aYa!SMNt$* dQ4~dS4qsYli$LsffiVC8002ovPDHLkV1j7#_UZrt literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00035.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00035.png new file mode 100644 index 0000000000000000000000000000000000000000..9ee582fe8049a575885999b330725b4d4fd294d4 GIT binary patch literal 388 zcmV-~0ek+5P){K^^MzQ>^F?8L>s!5` zC3wq;Vg(17-7%+`laBw>$9_UJ<7Pv2fnLW789-KFA^%eWJVBt9zk+Y3FF`995dZ)H i0000000000umC^Ld*KV(Ofdcc0000PO_<|>MU|HFwl}c8on25qR@0NF*IFCDWKEEeJLqK0VF%SLKJDYt#5JKs(RLa= zp)}3bxfe5973~h#xB7O-+wC>3>)Q3U7Zg%DYiWhyj->u>4!}c!h#Ci+ANy0p5`C;H zc)Sv(^}((8VvQ#1XV_1~*1w^4uGh)VlKUs0+193@b(tySk?Py=YS5A-yq zCRX>5sIH#G!n^S@AjXPq3KQL`jP%cw{MQ(|Gkm;AybK+X{3?gHqdqQ)&x~3;jIV4F zO3s7`N9jhVcKfJ2YgCW{VNUoY9wgC9i(=Mk#ZsY359F1S_{;rM-8=m9{i2|A%qqXT*h%k zT)^zV3R^7S8L*;wOqxotJLZVaSf&GP>RM<&&8DW9Yo`)p??b>Nb0_Hk0fqCAZ6{xZ z6m{P|oudB-=x11b_ywYzqK*nE3M#-Ro)36Fy8o=m+Nd3KigMO6f$YmR zZUbx59Cuw*`_gKyj#xW8p|r2Wk|yU`8oy*tG$DUVBWDadK(pwuk9)VSL7Nn5r_)lE zCfPdnW=5}~-vRq(-(T|ncU;#vch>e&g|x;}T4T5)!QRaY=u!ZH&H>l2{V8&RK9?0D zUP;sY;AT~<(FAscJtG!>L+w;=kew;_Up}#|4?)X)u#kk?hE7_mF2W!Oz-k}JVN4AS z_Yljjk-$Qm(KNvNvTdpcx>XVB!-M?W7`iiky(pp#9Z>u#M^}=;ZZ`a#moTNML2u5E zb{2wLk$z;|)sP)&&vuM^g%mg8FT$UxxRBvQPqlYCVoQSd7G#0v3VcdqwFwETH2Ghi zQm!E}#-TuOt*E259@LyaelgP5>KG9f(Vpm))4~w7Ga=}WhXK5usQ25CJzNKpisk@y zv{(fJPdE}5Vi|Ld_6Y11RJq002ovPDHLkV1l@5=Oh3C literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00038.png b/tests/integration/nano/snapshots/nanos/test_sign_sc_rollup_originate/with_whitelist/00038.png new file mode 100644 index 0000000000000000000000000000000000000000..a5ec6594fc9abfdb25b47343987939ca905b5f12 GIT binary patch literal 400 zcmV;B0dM|^P)^u9(#;6m03;DEV0$Iy2 zUWPVqwp|w$T0(DWV(h(opy^ymNt!%sseG3+(S*E}L6tp>AgYyad)qU=Chbt9o|TcR zG|AAt2Q~5~@(37r`gNDDw@1H@XIBa@RY({tr3K80q;fPnNL_)5G6UT2`e`Z6(qU;CU~^fRs)?>wMw&dyKZa>e_umW9ifI6_D%;Zvl#!X2wJ^u5Tzimt zJ;=-}3nS|_yXHfC3j#MXw*lB2&Wf32ZUg)Q;x%+OVi2t8{)7m4oarN=gnTkdADnRw uy_L!>bK(o=TEGSX000000000005%``<=If<51W+$0000vY=8@?>^dqt;x<;lVfgPxy5t>X5tv` zJG|>n8ey4!*A2($6vSu4VhS$kDN$KsL5~P;LjOk>WoYy^)LIqCmRxHQ=E~~lRE6BB yD~qbCQ(uI=%6L3!$Jq_wb@a1{1O!14{9oSMJI$dbk=C;S0000ep>KB@(8(i6LOx7z-Z_}vLMz5X&L3nPAosKk26mYsA;?cuxN zesYz}q%(1of0Zvxz5L)M-;ChD1zL^P(+~go6w|YAR$iEv1pAC-^^c}KJ{_E7WwiJ8 z7g>WXztpl5eLUh$`)YErPfISkd$UAp`kC4fC*Qu97dowYabuWp@Z{HVJ(9bBT{~h@ zA=UIq`iW!R`rVx}g}QMz%y*{PO?dsQNFl4X@uK_8=bLjpk4aSJAJ3cdt%H?;K{PJ= za(LaB>G$Q&y!NWR`sDBT>yz%(*tldXKNG%g68$-MPuJX@+m3mg&ZMrpbEhcpbXeJ& zhEF9Ip0Va`-N$??_|)QH{rBg-%1+QZxHof$nsvy1)&GLO*=L8`e_Oz=;w#ZwAq=zy bD>(m|_3VB5?!T5+r$F+au6{1-oD!MO1MdfrBYy+7Nkl{vMfrIg1VHF0=fN;#WR zUJ%tpox1#u{u;BRH{6n8J@uw$>I{=ysBdWo=tH0@7JAPfK=jUv)-T);x#%3 z;GFoDoRHi%kit*gel1o16jFM5NLE|AT4x-{+>L?W7l#4+kR_A7pWeR)jK#i~Pc~sx z=6gT22H;%l!1SlTQjJZ!CHv@q{Ab$`D)X-NAOe%&EG%HMQ541B{ zE$KnHys0RAoI)v76i@>gK@^q+Q^2~B~1LenrqA^VkAA{RudI80l?eRf@7ZO z@_JKWk1ok}nCRnzbS6^U22Ii#V=aDG0C^3QWHO!W28!96T2No30zO*^&;gBu700)ar_1%DTGz`aw}yIC5j!$=J$%*51DS)8|QT01g*4pGNPNh*RgBU8IM?fIS( z8vz1zO@6gEa2!W#t@l1Yi?6-+S;lO5%@E#pRx(-*Z)a7rz;=F2hZdEJ&`+qq-5!PQuz?-5UmwfzO z)T3FRf$~#WYdZn+fm=je5_qrS0c~pzbpJ~c8DmJSuE@kPi_Ob`Xy|Q}#bDjFbU%5L{}^~W z@A2n<1WCX>o_`QR$oC=EsOpS)Ob8A7)p#qcct-X5X&Nf|nTn-el?fD?;V5ZNm5a~8 z2Soq+mL_gq&91zR^E8_3%)`#u?TQa#7d*ZO8cKNjktX^mFl6EzR!?m6mS0Cdm;sPd zjmyM*>petF$6vwj;O>=1nDKi+3Ygxr>KAKa%)F+Ojek`JMh)ps={6ysfobT4lbA)V{!fR*;OqZ&D z;^W|(0C#~asx}VFl&7x&Gx0qBrF>HY(iJk55yFI!Cv&{gfFm)k(0r?fbz9JSaM+Fy zxA8I9>wgH+s!V*!zhEhjSD-maSh|x*ldUDwws8tge?0aq!n0Mqm2SZLssF!rZO;>j z``R6!ZtLj@&X``4Bmto7I_R@2@gYthRm}4X;)!Q8u%+!bC)Vka%It`CMvx>xn;+5f zdJAept<8 delta 1008 zcmV3_na4vcXvIF!S{e;!mSosLBQxGKSEPrbLysO2+Tx&^3q0{1rV2O!v z^dn3lIrj>MLZMJ7ycQlAr$H_m#T%bo0{N_f!xQ+t7<3+b2)B)0GCG_v>OL?VTCvF@ zA9pAOOVYaF2?oF2*UazjeaT=Sz^uweBhNygk6gnWsTaQzuRnWjC4wR~Q|c^EN;m4e zq(Yr0$bVizF~>CHaM*5X6CQ>m4}u*5;}Gu;Uo*qvK}s&|Tkj(z&lvg^bik|^i1s6) z`61Q_rgDlcMhQ5cJ{^CPZX=`iMgU~5a$K7b2p`FDUVaD`a&Jy1509)w3xz_VP$eq?xi1cPA)QqM53|!|DGHW z2xO#c+vac_$8j9=n%y!P^}{hkW8OMC2NcHnX?iopzVE84@}#`AKCEwh14_S@SlVRt zeSu+AJs&CLv|$F-Et<1^-&r4&8I^uIlBzbxnHdx}nCa69n12_2zsvj2Yrn3svxb+d zqzFrG1(pvvhT^s&(5_JUpMd-OeivgC{qU+V50--;>qUyC?c8^o3qVk9rD>hoT?E$A zPg78O4iXtiTQf=b(^vzx>>SAUcSWR*A-1|kCKf72mjU)+bBa$HwN=$>9byUmbS}7x zd?C#d0001A$$!6ykgOKaa?M6I36X`qcQYXOA<`(7cYJg7MBYmM^14^ghsrgp0!2ox zY4{pcZ7EnrX+%;iI-RV`1e5$!6`Qf*4|s1C!e~U8)AHe4cFk#iM#`|Prs&_Qp9C+) zY)NmW!Y;K<$E*-Jde}jdm!qkoD+BEj*le3S1+j5luYY^>>r+s~{Ik)oQ<-1cZl0Tb zJ~dnt7if4sD$ z&X8S|L?-6!KCY0y6s=CySiG*}kCGKTGGGKJd{&^X%H^7L zlp>a5g_B1LFGzq|ak8R+@rZjrSAP$f4L!3U<7R1zrE{3|CXNqdi-5bTCPctUv;Y7A07*qoM6N<$g4AS!bpQYW delta 917 zcmV;G18V%q2CD~-IXzr0}?%6;?o#Vt?=(fYnA{oUr>i@=M|b ze|*Y|5dXi(g>_=Ejwf>=gZ#1uiIZzVcx=QSX2B5hDNY~4e=7!jqvwU|u+#=q6h%=K z|DF%+!k7zb&u&rVB1wq$=r?l}X9ZkG^oO+4Dl~S|26n{ToFf8yvQi=jaLquh4=i&r zC+8toiu|4cAAh2!ZgBNWyMV1|AqA7Yv4q{Mmafo-0}WnD6BF}GL~lGbnnQ#Es{t<* zVp*Jzn#QS3-aeptqV+;VR!w$wdU%jr0S90QJi}pdw9FkKbv*l(zb0uyS~=~QVyu zM!PGDq9}^u7HlyNJm{VIGDtkc%poD(0dGS&iI&@#?v3?9^9&(P3N%mmVqV2H{ceM{ zP6s^l2_be45WCzzfMh&66DJ-oOcF-4Ci~ov9>NVNqFHARzBc(91YgBoJnMamT0o3A zk7=TNX@7rE0Qi7jp#@Ep^ThoZ*AXva1#m8Bx1e?4)A=aZ>X7f|>35=ncCx0kP(6r6V|#p_p7SP> z@sKH}f|k?Tnl%ID0AK}8{K*3E%oG~a;#W?n5s!pZ-coRvG{KHr$Vd@fwBn{cW26bF z9tS*yIUOw&U4Hw~JDR2iT_KeEyK{;MBYp+#jMirICSqIyzk+r~YcuhRaZb@nt3OtY zrhlQtva>tjKx0oGai>mbZMaj-W>FMHQ563fBC|M4qGoS9ru;F;Ne7g)$RMVry*pXr zAjY%fkObY};R81*e!*gnIi1CFumvr$8kSfAv*00___Mo1KIqZ1iS{2BYy(}Nkl&!I6BA%bH2-6v&8 z0%44nGKYQN_kE|&?3I;KE9MmCtYrdONgqobUoxE; z>W&hzs%wp%(M%a=@EqVnH(q9IVs*-Sw`*;*4gwLG^H9Es9n2f)4mU>w4|R{Uw4!_w zlh5kTLqBl@+aUYb+H(E9F2}sJMU_1J5OI||NBUG=+>jTWPWT(GcrkDQ02ep~ja&s)yN zma^D2A%|vBYy$qNkl5xVz)Zm*Sx(;7EA8YU$lXVmb5JTKcVlPZgBz zPq>GpTrJ_pVfG!cx@za@YqiM)ILhT*guAsth?bysfv%ZV8ArK{`%q%K#wn?FL?ZR4 z%)A36%2IRuGJidqk5=C@m{hZ>M=(QOWqmlD>D*`YEwFN&zDknOzvGz%l*{mbX7tO0 z2`EmGKQ{W$Lk|9uH>g6+KcC7bcf~9+nT8`ks2#jML3Ezm3&4 zHpIs1j%gnv`c<>fI^Ugj>BA`ZH)0xbMYex>Y;|DttbTId`vkX38000000000py!YOF?N-dWYd7FD=0YF*NCIN?opZV^nPn*ftr^B{^u<;Jf-DE7 zqc64+5JMb;Zaw-Ua?@_Wv~m`*8-1}g0)i~urlW6|#VtPo0DpV?x7D?>4ORUA9djY)L3AOU`QfpfbF-6>MFN_LoFmNIdquy-B(V@LpC#dUMK;%dPZr0mhJa*gV>PuQrH z+r+{1ZMA;flFq()4Yd*AUgSLrNr6uV_#RqS`+7=_=tZHc=?|xCe?*}>w zXq|FD&}V-0ssI200000 b0CYS76s$DUVDrbc00000NkvXXu0mjfPjt`+ delta 386 zcmX@jJePTbN_~o_i(^Q|oVPb4g_;$38WL~4^xgA+;tp^587Gfy;Fxyy<$v3qE=kRc zE=`v{Q@uXC|FOi}kCFF2ss(S-6T5b|+WwLF-3d0m{xT*DBYuUb#CphZd(E9h_ukwDSwLA*;6WqWjF}n{zymNmS(@&zteBgO!0nG%ovc zc-@!j_vO#L_Nu)4Tfna3E74jZ473F+ aIRBaT?0xy}zm`^~K=PihelF{r5}E)fUbm|N diff --git a/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00000.png b/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..9fa51df290f85860c685b43831f20f559eca45c8 GIT binary patch literal 463 zcmV;=0WkiFP)F^nHG&Ol`S5r1^o^|y$IUFw_Pd~Lz8jw=Xjq3)L<=#r&dQ}r6#DO4*H>AE-UhooQ{HOwN^$l+pw5K}_2zX-r#vr3)CJ8A z*UP6bT%k`*Mbslh^UYOg>ihJ%&LvNu%uz0=$q10qnF5(Q1RYG>G)IqVPoHe|9AKo< znp1+2(kU-Ea^8OWqs3Y{UdvZD^nv&Q000000001<;TM*+Ki`d0xJ&>5002ovPDHLk FV1mAB&o2M~ literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00001.png b/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..36cf8c9ff2466860c385759cdc6412a4fe0b9515 GIT binary patch literal 485 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|?M1>EaktG3V{g=t<2A0uC2d zrq12*Uv=m7pBuWA{yGHgHk?_#PbtZn=e>jTu& zYQ#VO;)fcmGG2b3ME8_e-?d58f&H=w8{_nY1+*HPTY1Yvvb3e2m zuXl8>zGzhC@H}HN&~^43+>V>%+uf);F@ILeV$-xAzaJaqZCWz7V9V-l*MPBu1#EcF XpPJKIws-31pCDOJS3j3^P6 z8y$ZMTFVp{lb;GSEv|Fp$rQiYOwWM05ogOj9mF{??Wk~h&e@rp6&suf(HS7Fch}Ri zxonoeF}MMuNm)C0xZ$5q@DzAO)Wk{Yvily;W3S_1$~OhT-67pJq%iV{qcLX_?zQrx zbP4RAec94`Hhbo=-92{4$NOq>j2ctx;shXQI(K?+ie1F@M4P9JsQGD%| zRN_FmF$5<7Tz&J7Hrk-HNPFIw2Y9U7)J74!6tZQuH<4jZs{_XVb4k|m)X1mpb@Sjc zaNV-F5X=6ABKEyM5{9YS85!LJTpgsPco#Ul8IskRXW7ASUR}Lnwnlb-_X4r9zw9k$ z3nO-As!oWk4;_Bk84 zt?m^}-h6HAHf65lTW>#z=zsQm$@2H%!L;i|Pd?my{wBvh$fn2po$Eop|4QXzrITWR z=2mn3f9Wo+;Q7=4{uTz^<<)(gKc&?FTE_aI_~BE}9rre`=G2|N{oz+WU_c;)1EzNv XU7w!SY@Q^Y3KI8p^>bP0l+XkKqjQme literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00004.png b/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..908600200d45a13b6992c9edeaa2393b0861e45e GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{s}ba4!+nDh2#>^dezp0-4j zcP)SQGrv7zop@z^!{@^dD({O;3pZS0lC^y<_-c8seF_?~)R`1e_fGkV^^&kc_nKe2Ci;Xa$I%_*{c^5!6)e{)29 zm26b^_g($2+GqGHEFoLHbjrtX)ApXY*wuVn^43v}zKkE#FzsNY5Gxh(T zJCBYVE0jbr-{!qkvu!oY_1(2BlJPz7r`{q)_#9?Etbho@b5$RU8^@vO`qSq zo+ZVt-qe2XWwpBHrw@L;*eY}K@+0Y8ops?&hl&kuZhzA9_O#D`fxfc`A1#$x!mG09 z1T%xWQO$YJ>YqQwcZDusuKu*@^hMcgTe~ HDWM4f9D9lr literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00006.png b/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..59fce75cd1321a13bc8840b9bc6f48f87485d7c2 GIT binary patch literal 542 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@Xe>EaktG3V{fz@iodj<(Bw z`H%kgKZ*VIfT!8hA*ti;+q(O~A)ne=kMd3f=|TqHKR)Td|6RwkEqC(aRyG0K+=idJEc8z{!vY;Sy?Y&K!ZXCBlwc4W# z*M|A7uh}3Y9r|tZ_qQ>h1^Kr`PwkCad+gTQS9=!cOa73HTXlEG?#HL5KU%2%z@uV! z*2}vtNtT~)MEzRZ=r20uo&S#Z#WA`Mk0*YU-LNa``K#=$Cs`~`J&kGEz16W}+Jdsi zbu&XH-FNo<4oKQ{Omk(ai_+KSXZA3woC+%bV`Mw4KkUBIjF8Q%+zp&#Q)?~eyu6eC zS$9LxoPA!CF7AIklV!^34|Qo@PB(LE_)V}k`*q%#@82Zz6;9{u=but5KdNI|zffgy zDogUml&j|!z5d{8{cB#;)t<{|P51X+H8VSM>}6l3ywb1G&F8J|&nu;WmemiwSKvUdj@u**QKfk3SLZ?7@Or(7D5aEt&c7~-vI9S@ zDPR2M?6XWEbQkv74!ZoZ+ncmZJ#UeeQXX0UTFz}JUP#WfG`{VComW4lRGm)M4b>(; zns_1QU2^ch19n*bOipIB+y_j;{KN~X_Q7-X!Bw>PNVc0D`Z5ZpTI9DQXms%>Q{MZx zS@(m4AK@dEz2=IA8z(008jEWAs5+4r4@uw)-RIwzrZ$}LUXHu)7C6ZoLzUw7^c8euB0JS-*DK}Kr zRoYGr;h2zEqXB#@W}+&Vey2AnCs*kUQlP*t%QRrWb! z*~&+!r8Po>0{{R3_G4HD9h9Y&S?bbyBVWZr<9f;F*_n^M8SXZRRc0#7v?FCQky|9K zvdwe2g_uSxwuL#fA^I%(Qp9MzrmfJ(qVh({My485zOtzD+>KQwZ(f1vRdg{di# zptaaCKf4SC0002MLhS#Nl&D}HZ7wQetEs6x3!ST8mzyK(;;N6d4X0n5W12fvGPYSx zjql)^w<4nYsT)+*!$wTL0S&L1ovF>4uf@}Lxs*8S?L^7md=-qw@UFBGC4Ow4Z9hn& zS16>2DUw&rs#E)Z+K!gUKY)Z-ZSDq4%24O)Y$0Xn)En=|>{)V}hiH5N0002Ef>qxS z$VQvWCehT^jZs~Nc74>?+C|2XO~Z=v96QF`%x7-?6{U4V)%Cissmir5ewaZ3h^q`$6=$u{sq3w? jNHWZJC~*J)0F3+sD_C*m9RV=200000NkvXXu0mjfvY&e%b+u7$dh0r~*U()IJ!bb}KQ3zjX^LU07+y=Xsjww4euo^o{d8 zO|(Bi{WlYCSy?u$7NnjLxFS8ZgaCi718eF(fcW}CYY8&) z`h4)?T92XzM+hN=Y)pR&TGXec#WzkUc@P~CsTrvU)D!EE!UiGVp3sy>@lo<1QBvcJ z(gF1f!E6Uxh;b)@Ty(J$x??9e6ysL(DQQ9SSe37Ip$-UE*v*NkfkPJcDI|~2N4`B< z2b@-@H>d};pskdjvX&@|N|$Fo8FxMI=jQr9fNXG4&&MHAh>rw$Le2LS8&V;jjSxZz zA$u_VOEOBLa!7B|Vv^ouRQO|YHPhX=XAp{#sE|CSjkL+4e3xmLi%V~&st)=);i#eY z*~4$hR@|@?_DNKDo@DHJ4k-|2qEN$Z?lMuTxX3z QTmS$707*qoM6N<$f|xjnrvLx| literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00009.png b/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..659efc67dd7c30ced3b30909e95d7081f8dc59c1 GIT binary patch literal 845 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 literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00012.png b/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00012.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f1700dc5145fc099930fe17c1e3e95abe9d465 GIT binary patch literal 424 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|`Jmba4!+nDh2#;G|{+o`%F- zmuDCJSFW61n=orBi&BC}+VlVOqGl;5DP0P`ajZ~Au|;BW&9wFAvZ?I$yFC2rcGm7X z>AE%fzE#H0%-4>y%wzK=N-TDH7XLYB?v4ptjP?KQVlI34S0dTaT9nz#eBaa^0d`)K z_FE^k-xI$yBdlEAt@-Vd)~??V?*2*?wRKxkv+Gc{Zc$jtr|TkDtbVpXP5yuXOLfsF z9*)~F%}XL?sQrC;xzqe+ViO|+gZ%o7ERRd;SGb6OJHoQn#&px2*BiHU%#VBWqV;Y- z=SDq~q##ez@bsP67bkz3v~y}+s(DFzob#FT6>*ZkpXOye|9I%8<(K0(68{>;9iP-t zv;C^YwN2Nx_exrdBWdwm`maFt30Q@vtDnm{ Hr-UW|bELez literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00013.png b/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00013.png new file mode 100644 index 0000000000000000000000000000000000000000..59fce75cd1321a13bc8840b9bc6f48f87485d7c2 GIT binary patch literal 542 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@Xe>EaktG3V{fz@iodj<(Bw z`H%kgKZ*VIfT!8hA*ti;+q(O~A)ne=kMd3f=|TqHKR)Td|6RwkEqC(aRyG0K+=idJEc8z{!vY;Sy?Y&K!ZXCBlwc4W# z*M|A7uh}3Y9r|tZ_qQ>h1^Kr`PwkCad+gTQS9=!cOa73HTXlEG?#HL5KU%2%z@uV! z*2}vtNtT~)MEzRZ=r20uo&S#Z#WA`Mk0*YU-LNa``K#=$Cs`~`J&kGEz16W}+Jdsi zbu&XH-FNo<4oKQ{Omk(ai_+KSXZA3woC+%bV`Mw4KkUBIjF8Q%+zp&#Q)?~eyu6eC zS$9LxoPA!CF7AIklV!^34|Qo@PB(LE_)V}k`*q%#@82Zz6;9{u=but5KdNI|zffgy zDogUml&j|!z5d{8{cB#;)t<{|P51X+H8VSM>}6l3ywb1G&F8J|&nu;WmemiwSKvUdj@u**QKfk3w~ba4!+nDh2#q)@X0PebCZ zm%e-cPu$@xKjY+)4IIgOjX`_P+iiYp~^)T6Ut3N8D*&O)mCn$whZ>mPk!MQ~TlM z+ZXdfrxh=53=Id(-f##w(&`jQ-qY33Wt~$(69B9yx!C{! literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/00019.png b/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00015.png similarity index 100% rename from tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/00019.png rename to tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/no_whitelist/00015.png diff --git a/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00000.png b/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..9fa51df290f85860c685b43831f20f559eca45c8 GIT binary patch literal 463 zcmV;=0WkiFP)F^nHG&Ol`S5r1^o^|y$IUFw_Pd~Lz8jw=Xjq3)L<=#r&dQ}r6#DO4*H>AE-UhooQ{HOwN^$l+pw5K}_2zX-r#vr3)CJ8A z*UP6bT%k`*Mbslh^UYOg>ihJ%&LvNu%uz0=$q10qnF5(Q1RYG>G)IqVPoHe|9AKo< znp1+2(kU-Ea^8OWqs3Y{UdvZD^nv&Q000000001<;TM*+Ki`d0xJ&>5002ovPDHLk FV1mAB&o2M~ literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00001.png b/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..36cf8c9ff2466860c385759cdc6412a4fe0b9515 GIT binary patch literal 485 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|?M1>EaktG3V{g=t<2A0uC2d zrq12*Uv=m7pBuWA{yGHgHk?_#PbtZn=e>jTu& zYQ#VO;)fcmGG2b3ME8_e-?d58f&H=w8{_nY1+*HPTY1Yvvb3e2m zuXl8>zGzhC@H}HN&~^43+>V>%+uf);F@ILeV$-xAzaJaqZCWz7V9V-l*MPBu1#EcF XpPJKIws-31pCDOJS3j3^P6 z8y$ZMTFVp{lb;GSEv|Fp$rQiYOwWM05ogOj9mF{??Wk~h&e@rp6&suf(HS7Fch}Ri zxonoeF}MMuNm)C0xZ$5q@DzAO)Wk{Yvily;W3S_1$~OhT-67pJq%iV{qcLX_?zQrx zbP4RAec94`Hhbo=-92{4$NOq>j2ctx;shXQI(K?+ie1F@M4P9JsQGD%| zRN_FmF$5<7Tz&J7Hrk-HNPFIw2Y9U7)J74!6tZQuH<4jZs{_XVb4k|m)X1mpb@Sjc zaNV-F5X=6ABKEyM5{9YS85!LJTpgsPco#Ul8IskRXW7ASUR}Lnwnlb-_X4r9zw9k$ z3nO-As!oWk4;_Bk84 zt?m^}-h6HAHf65lTW>#z=zsQm$@2H%!L;i|Pd?my{wBvh$fn2po$Eop|4QXzrITWR z=2mn3f9Wo+;Q7=4{uTz^<<)(gKc&?FTE_aI_~BE}9rre`=G2|N{oz+WU_c;)1EzNv XU7w!SY@Q^Y3KI8p^>bP0l+XkKqjQme literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00004.png b/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..908600200d45a13b6992c9edeaa2393b0861e45e GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{s}ba4!+nDh2#>^dezp0-4j zcP)SQGrv7zop@z^!{@^dD({O;3pZS0lC^y<_-c8seF_?~)R`1e_fGkV^^&kc_nKe2Ci;Xa$I%_*{c^5!6)e{)29 zm26b^_g($2+GqGHEFoLHbjrtX)ApXY*wuVn^43v}zKkE#FzsNY5Gxh(T zJCBYVE0jbr-{!qkvu!oY_1(2BlJPz7r`{q)_#9?Etbho@b5$RU8^@vO`qSq zo+ZVt-qe2XWwpBHrw@L;*eY}K@+0Y8ops?&hl&kuZhzA9_O#D`fxfc`A1#$x!mG09 z1T%xWQO$YJ>YqQwcZDusuKu*@^hMcgTe~ HDWM4f9D9lr literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00006.png b/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..59fce75cd1321a13bc8840b9bc6f48f87485d7c2 GIT binary patch literal 542 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@Xe>EaktG3V{fz@iodj<(Bw z`H%kgKZ*VIfT!8hA*ti;+q(O~A)ne=kMd3f=|TqHKR)Td|6RwkEqC(aRyG0K+=idJEc8z{!vY;Sy?Y&K!ZXCBlwc4W# z*M|A7uh}3Y9r|tZ_qQ>h1^Kr`PwkCad+gTQS9=!cOa73HTXlEG?#HL5KU%2%z@uV! z*2}vtNtT~)MEzRZ=r20uo&S#Z#WA`Mk0*YU-LNa``K#=$Cs`~`J&kGEz16W}+Jdsi zbu&XH-FNo<4oKQ{Omk(ai_+KSXZA3woC+%bV`Mw4KkUBIjF8Q%+zp&#Q)?~eyu6eC zS$9LxoPA!CF7AIklV!^34|Qo@PB(LE_)V}k`*q%#@82Zz6;9{u=but5KdNI|zffgy zDogUml&j|!z5d{8{cB#;)t<{|P51X+H8VSM>}6l3ywb1G&F8J|&nu;WmemiwSKvUdj@u**QKfk3SLZ?7@Or(7D5aEt&c7~-vI9S@ zDPR2M?6XWEbQkv74!ZoZ+ncmZJ#UeeQXX0UTFz}JUP#WfG`{VComW4lRGm)M4b>(; zns_1QU2^ch19n*bOipIB+y_j;{KN~X_Q7-X!Bw>PNVc0D`Z5ZpTI9DQXms%>Q{MZx zS@(m4AK@dEz2=IA8z(008jEWAs5+4r4@uw)-RIwzrZ$}LUXHu)7C6ZoLzUw7^c8euB0JS-*DK}Kr zRoYGr;h2zEqXB#@W}+&Vey2AnCs*kUQlP*t%QRrWb! z*~&+!r8Po>0{{R3_G4HD9h9Y&S?bbyBVWZr<9f;F*_n^M8SXZRRc0#7v?FCQky|9K zvdwe2g_uSxwuL#fA^I%(Qp9MzrmfJ(qVh({My485zOtzD+>KQwZ(f1vRdg{di# zptaaCKf4SC0002MLhS#Nl&D}HZ7wQetEs6x3!ST8mzyK(;;N6d4X0n5W12fvGPYSx zjql)^w<4nYsT)+*!$wTL0S&L1ovF>4uf@}Lxs*8S?L^7md=-qw@UFBGC4Ow4Z9hn& zS16>2DUw&rs#E)Z+K!gUKY)Z-ZSDq4%24O)Y$0Xn)En=|>{)V}hiH5N0002Ef>qxS z$VQvWCehT^jZs~Nc74>?+C|2XO~Z=v96QF`%x7-?6{U4V)%Cissmir5ewaZ3h^q`$6=$u{sq3w? jNHWZJC~*J)0F3+sD_C*m9RV=200000NkvXXu0mjfvY&e%b+u7$dh0r~*U()IJ!bb}KQ3zjX^LU07+y=Xsjww4euo^o{d8 zO|(Bi{WlYCSy?u$7NnjLxFS8ZgaCi718eF(fcW}CYY8&) z`h4)?T92XzM+hN=Y)pR&TGXec#WzkUc@P~CsTrvU)D!EE!UiGVp3sy>@lo<1QBvcJ z(gF1f!E6Uxh;b)@Ty(J$x??9e6ysL(DQQ9SSe37Ip$-UE*v*NkfkPJcDI|~2N4`B< z2b@-@H>d};pskdjvX&@|N|$Fo8FxMI=jQr9fNXG4&&MHAh>rw$Le2LS8&V;jjSxZz zA$u_VOEOBLa!7B|Vv^ouRQO|YHPhX=XAp{#sE|CSjkL+4e3xmLi%V~&st)=);i#eY z*~4$hR@|@?_DNKDo@DHJ4k-|2qEN$Z?lMuTxX3z QTmS$707*qoM6N<$f|xjnrvLx| literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00009.png b/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..659efc67dd7c30ced3b30909e95d7081f8dc59c1 GIT binary patch literal 845 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 literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00012.png b/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00012.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f1700dc5145fc099930fe17c1e3e95abe9d465 GIT binary patch literal 424 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|`Jmba4!+nDh2#;G|{+o`%F- zmuDCJSFW61n=orBi&BC}+VlVOqGl;5DP0P`ajZ~Au|;BW&9wFAvZ?I$yFC2rcGm7X z>AE%fzE#H0%-4>y%wzK=N-TDH7XLYB?v4ptjP?KQVlI34S0dTaT9nz#eBaa^0d`)K z_FE^k-xI$yBdlEAt@-Vd)~??V?*2*?wRKxkv+Gc{Zc$jtr|TkDtbVpXP5yuXOLfsF z9*)~F%}XL?sQrC;xzqe+ViO|+gZ%o7ERRd;SGb6OJHoQn#&px2*BiHU%#VBWqV;Y- z=SDq~q##ez@bsP67bkz3v~y}+s(DFzob#FT6>*ZkpXOye|9I%8<(K0(68{>;9iP-t zv;C^YwN2Nx_exrdBWdwm`maFt30Q@vtDnm{ Hr-UW|bELez literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00013.png b/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00013.png new file mode 100644 index 0000000000000000000000000000000000000000..59fce75cd1321a13bc8840b9bc6f48f87485d7c2 GIT binary patch literal 542 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@Xe>EaktG3V{fz@iodj<(Bw z`H%kgKZ*VIfT!8hA*ti;+q(O~A)ne=kMd3f=|TqHKR)Td|6RwkEqC(aRyG0K+=idJEc8z{!vY;Sy?Y&K!ZXCBlwc4W# z*M|A7uh}3Y9r|tZ_qQ>h1^Kr`PwkCad+gTQS9=!cOa73HTXlEG?#HL5KU%2%z@uV! z*2}vtNtT~)MEzRZ=r20uo&S#Z#WA`Mk0*YU-LNa``K#=$Cs`~`J&kGEz16W}+Jdsi zbu&XH-FNo<4oKQ{Omk(ai_+KSXZA3woC+%bV`Mw4KkUBIjF8Q%+zp&#Q)?~eyu6eC zS$9LxoPA!CF7AIklV!^34|Qo@PB(LE_)V}k`*q%#@82Zz6;9{u=but5KdNI|zffgy zDogUml&j|!z5d{8{cB#;)t<{|P51X+H8VSM>}6l3ywb1G&F8J|&nu;WmemiwSKvUdj@u**QKfk3w~ba4!+nDh2#q)@X0PebCZ zm%e-cPu$@xKjY+)4IIgOjX`_P+iiYp~^)T6Ut3N8D*&O)mCn$whZ>mPk!MQ~TlM z+ZXdfrxh=53=Id(-f##w(&`jQ-qY33Wt~$(69B9yx!C{! literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00015.png b/tests/integration/nano/snapshots/nanosp/test_sign_sc_rollup_originate/with_whitelist/00015.png new file mode 100644 index 0000000000000000000000000000000000000000..7e7736a36f8656e124d9926a12e22feaf0e9f788 GIT binary patch literal 793 zcmV+!1LpjRP)IM?fIS(8vz1zO@6gEa2!W#t@l1Yi?6-+S;lO5 z%@E#pRx(-*Z)a7rz;=F2hZdEJ&`#C)k)?Y@zo1!0=eEeM0qgkGT@>5uAI|1{7TSQzEdj2Nh=GreY zmoOfP>Lhj#A_qU-i*+;2nPC^z4pQs0-RB?*{bdT;n}dy9NL!kukC3bZZEFs6|4R`W zV@Ry7$iy;>&C7sj=xvn6VBNKJKY5b>70kh`Y14D;u}^^Z1a|1M?aVWkW!7y#C+>LL`=tD!S3Mhl}4EHdq4`9-m~f# zYhld1rjm_S21X6(PU$uwpMpNimJoYCzzHj9aPeX?ul`NSBLH{el$^`K9248N3d>_I zuH33xa2%i`z?|>a%X5Tmm%?jk2TYf$e&XZcn*eu#E2=gQ%9N+C0W(kSBAz(tsl|uF!m|g>_rddT`i|54Z6#*y{+=s!V*!zhEhjSD-maSh|x*ldUDw zws8tge?0aq!n0Mqm2SZLssF!rZO;>j``R6!ZtLj@&X``4Bmto7I_R@2@gYthRm}4X z;)!Q8u%+!bC)Vka%It`CMvx>xn;+5fdJAep-M2@kcQ>M2eIl;C}!LHGZDC29g*l7klGNE=3U_B#Zb)7y2=i9^P1W< zs}))K(+k8|^CO1oBb<0DSAG#A8({(nA%qY@2qA;9LI4S^qSo=8TG?4Lu1}L zItLWS`DuDH#=h^Ws`8|~wLYwGdjm?pl~~$j^nHP0R6QRlqUyC?c8^o3qVk9rD>hoT?E$APg78O4iXtiTQf=b(^vzx>>SAUcSWR* zA-1|kCKf72mjU)+bBa$HwN=$>9byUmbS}7xd?C#d0001A$-jt@tQOF6%|wJK$~CJ3MMkY@_!?AgDOg5nL{cm|ovh0Qll)W_o3Y{# zcyATLXhfLP^5I){&1rr{%CM}a=-;ZJ1TV&HNpGdXF11a^tPnYR*g=w)qp6}R1MLym zY@0g;v2k3ld-dy6P{jPR(XUgPU)gS+n|wXaTdQcH<{;v2LHR{&6XCWD&@%c!hRRou zr?v|<$5#qyrxBpebS(3;gVoy-tMTzZm_ob@-WEv!0002Yz&RPp^C#P-&?o*|)oxRM zY)9xg&z?K2vz&1}j2^@szuC!9eSRB@hP^ zCT_b)Z>^$AHe;=7PVD}Ep^0*74UogiuUIub>m5?+MBLGU^M{WtTG0_;`Ilatl196< z(b+OrGqXYi5?}VE#n1>~dnt7if4sD$&X8S|L?-6!KCY0y6s=CySiG*}kCGKTGGGKJd{&^X%H^7Llp>a5g_B1LFGzq|ak8R+@rZjrSAP$f4L!3U<7R1zrE{3|CXNqdi-5b&!I6BA%bH2-6v&80%44nGKYQN_kE|&?3I;KE9MmCtYrdO zNwSO7`{{LD*S@o+mn!5aETtVZXJoNwa{@XP4t^bQ|Jd&$ zx6tQyg@{+uFduwd8ACJ`dxgCsw$jv2^#+-`I2FzFvSRO$Xd&2><}x$yczP3>dJ3 zHoL5{iZr}K#Rg9W{?Vl-2DSU~qF&o9Ijp+XW2XA1iSnUn2L^eb>(wY#IMO289i^iJ zaDLQ}=6+bVT2mbh>WE9jW|*2Xme7zqTT;&VBtJfwvELt|{`jKhnX4l+K$XK3F?E)- zruN7~JTYFSXg$Wm(X2hxd+O>x5MMH#8S0J_v8rp0ozYAgXz(21LpNS#YhrcEdADnA zv@xLx%W7KT|$?l11Hu-Q`Fdlyw<5VK32;wub%X* zJ7fML_Beh|#f3CGx~sfXv6iIi=0!}x0y2K|CMZFbCZDa4(QFcJYzp+oiXY69c32P1 za9FdhRWTweqCHV7r-dPNJC>ja&s)yNma^)1d0R9uv zKjZGF8P`)|Ud=2JrG|;rlt_R?W-UlZFb>RMX$M5E@^5Ep2mA+C{~)tYWNi|d0S~kK z46ty1vU9S)6r5A$$_LOt1$+Pi000000000000000IQ#$_bIf*ep>KB@(8(i6LOx7z-Z_}vLMz5X&L3nPAosKk26mYsA;?cuxN zesYz}q%(1of0Zvxz5L)M-;ChD1zL^P(+~go6w|YAR$iEv1pAC-^^c}KJ{_E7WwiJ8 z7g>WXztpl5eLUh$`)YErPfISkd$UAp`kC4fC*Qu97dowYabuWp@Z{HVJ(9bBT{~h@ zA=UIq`iW!R`rVx}g}QMz%y*{PO?dsQNFl4X@uK_8=bLjpk4aSJAJ3cdt%H?;K{PJ= za(LaB>G$Q&y!NWR`sDBT>yz%(*tldXKNG%g68$-MPuJX@+m3mg&ZMrpbEhcpbXeJ& zhEF9Ip0Va`-N$??_|)QH{rBg-%1+QZxHof$nsvy1)&GLO*=L8`e_Oz=;w#ZwAq=zy bD>(m|_3VB5?!T5+r$F+au6{1-oD!MO1MdfrBYy+7Nkl{vMfrIg1VHF0=fN;#WR zUJ%tpox1#u{u;BRH{6n8J@uw$>I{=ysBdWo=tH0@7JAPfK=jUv)-T);x#%3 z;GFoDoRHi%kit*gel1o16jFM5NLE|AT4x-{+>L?W7l#4+kR_A7pWeR)jK#i~Pc~sx z=6gT22H;%l!1SlTQjJZ!CHv@q{Ab$`D)X-NAOe%&EG%HMQ541B{ zE$KnHys0RAoI)v76i@>gK@^q+Q^2~B~1LenrqA^VkAA{RudI80l?eRf@7ZO z@_JKWk1ok}nCRnzbS6^U22Ii#V=aDG0C^3QWHO!W28!96T2No30zO*^&;gBu700)ar_1%DTGz`aw}yIC5j!$=J$%*51DS)8|QT01g*4pGNPNh*RgBU8IM?fIS( z8vz1zO@6gEa2!W#t@l1Yi?6-+S;lO5%@E#pRx(-*Z)a7rz;=F2hZdEJ&`+qq-5!PQuz?-5UmwfzO z)T3FRf$~#WYdZn+fm=je5_qrS0c~pzbpJ~c8DmJSuE@kPi_Ob`Xy|Q}#bDjFbU%5L{}^~W z@A2n<1WCX>o_`QR$oC=EsOpS)Ob8A7)p#qcct-X5X&Nf|nTn-el?fD?;V5ZNm5a~8 z2Soq+mL_gq&91zR^E8_3%)`#u?TQa#7d*ZO8cKNjktX^mFl6EzR!?m6mS0Cdm;sPd zjmyM*>petF$6vwj;O>=1nDKi+3Ygxr>KAKa%)F+Ojek`JMh)ps={6ysfobT4lbA)V{!fR*;OqZ&D z;^W|(0C#~asx}VFl&7x&Gx0qBrF>HY(iJk55yFI!Cv&{gfFm)k(0r?fbz9JSaM+Fy zxA8I9>wgH+s!V*!zhEhjSD-maSh|x*ldUDwws8tge?0aq!n0Mqm2SZLssF!rZO;>j z``R6!ZtLj@&X``4Bmto7I_R@2@gYthRm}4X;)!Q8u%+!bC)Vka%It`CMvx>xn;+5f zdJAept<8 delta 1008 zcmV3_na4vcXvIF!S{e;!mSosLBQxGKSEPrbLysO2+Tx&^3q0{1rV2O!v z^dn3lIrj>MLZMJ7ycQlAr$H_m#T%bo0{N_f!xQ+t7<3+b2)B)0GCG_v>OL?VTCvF@ zA9pAOOVYaF2?oF2*UazjeaT=Sz^uweBhNygk6gnWsTaQzuRnWjC4wR~Q|c^EN;m4e zq(Yr0$bVizF~>CHaM*5X6CQ>m4}u*5;}Gu;Uo*qvK}s&|Tkj(z&lvg^bik|^i1s6) z`61Q_rgDlcMhQ5cJ{^CPZX=`iMgU~5a$K7b2p`FDUVaD`a&Jy1509)w3xz_VP$eq?xi1cPA)QqM53|!|DGHW z2xO#c+vac_$8j9=n%y!P^}{hkW8OMC2NcHnX?iopzVE84@}#`AKCEwh14_S@SlVRt zeSu+AJs&CLv|$F-Et<1^-&r4&8I^uIlBzbxnHdx}nCa69n12_2zsvj2Yrn3svxb+d zqzFrG1(pvvhT^s&(5_JUpMd-OeivgC{qU+V50--;>qUyC?c8^o3qVk9rD>hoT?E$A zPg78O4iXtiTQf=b(^vzx>>SAUcSWR*A-1|kCKf72mjU)+bBa$HwN=$>9byUmbS}7x zd?C#d0001A$$!6ykgOKaa?M6I36X`qcQYXOA<`(7cYJg7MBYmM^14^ghsrgp0!2ox zY4{pcZ7EnrX+%;iI-RV`1e5$!6`Qf*4|s1C!e~U8)AHe4cFk#iM#`|Prs&_Qp9C+) zY)NmW!Y;K<$E*-Jde}jdm!qkoD+BEj*le3S1+j5luYY^>>r+s~{Ik)oQ<-1cZl0Tb zJ~dnt7if4sD$ z&X8S|L?-6!KCY0y6s=CySiG*}kCGKTGGGKJd{&^X%H^7L zlp>a5g_B1LFGzq|ak8R+@rZjrSAP$f4L!3U<7R1zrE{3|CXNqdi-5bTCPctUv;Y7A07*qoM6N<$g4AS!bpQYW delta 917 zcmV;G18V%q2CD~-IXzr0}?%6;?o#Vt?=(fYnA{oUr>i@=M|b ze|*Y|5dXi(g>_=Ejwf>=gZ#1uiIZzVcx=QSX2B5hDNY~4e=7!jqvwU|u+#=q6h%=K z|DF%+!k7zb&u&rVB1wq$=r?l}X9ZkG^oO+4Dl~S|26n{ToFf8yvQi=jaLquh4=i&r zC+8toiu|4cAAh2!ZgBNWyMV1|AqA7Yv4q{Mmafo-0}WnD6BF}GL~lGbnnQ#Es{t<* zVp*Jzn#QS3-aeptqV+;VR!w$wdU%jr0S90QJi}pdw9FkKbv*l(zb0uyS~=~QVyu zM!PGDq9}^u7HlyNJm{VIGDtkc%poD(0dGS&iI&@#?v3?9^9&(P3N%mmVqV2H{ceM{ zP6s^l2_be45WCzzfMh&66DJ-oOcF-4Ci~ov9>NVNqFHARzBc(91YgBoJnMamT0o3A zk7=TNX@7rE0Qi7jp#@Ep^ThoZ*AXva1#m8Bx1e?4)A=aZ>X7f|>35=ncCx0kP(6r6V|#p_p7SP> z@sKH}f|k?Tnl%ID0AK}8{K*3E%oG~a;#W?n5s!pZ-coRvG{KHr$Vd@fwBn{cW26bF z9tS*yIUOw&U4Hw~JDR2iT_KeEyK{;MBYp+#jMirICSqIyzk+r~YcuhRaZb@nt3OtY zrhlQtva>tjKx0oGai>mbZMaj-W>FMHQ563fBC|M4qGoS9ru;F;Ne7g)$RMVry*pXr zAjY%fkObY};R81*e!*gnIi1CFumvr$8kSfAv*00___Mo1KIqZ1iS{2BYy(}Nkl&!I6BA%bH2-6v&8 z0%44nGKYQN_kE|&?3I;KE9MmCtYrdONgqobUoxE; z>W&hzs%wp%(M%a=@EqVnH(q9IVs*-Sw`*;*4gwLG^H9Es9n2f)4mU>w4|R{Uw4!_w zlh5kTLqBl@+aUYb+H(E9F2}sJMU_1J5OI||NBUG=+>jTWPWT(GcrkDQ02ep~ja&s)yN zma^D2A%|vBYy$qNkl5xVz)Zm*Sx(;7EA8YU$lXVmb5JTKcVlPZgBz zPq>GpTrJ_pVfG!cx@za@YqiM)ILhT*guAsth?bysfv%ZV8ArK{`%q%K#wn?FL?ZR4 z%)A36%2IRuGJidqk5=C@m{hZ>M=(QOWqmlD>D*`YEwFN&zDknOzvGz%l*{mbX7tO0 z2`EmGKQ{W$Lk|9uH>g6+KcC7bcf~9+nT8`ks2#jML3Ezm3&4 zHpIs1j%gnv`c<>fI^Ugj>BA`ZH)0xbMYex>Y;|DttbTId`vkX38000000000py!YOF?N-dWYd7FD=0YF*NCIN?opZV^nPn*ftr^B{^u<;Jf-DE7 zqc64+5JMb;Zaw-Ua?@_Wv~m`*8-1}g0)i~urlW6|#VtPo0DpV?x7D?>4ORUA9djY)L3AOU`QfpfbF-6>MFN_LoFmNIdquy-B(V@LpC#dUMK;%dPZr0mhJa*gV>PuQrH z+r+{1ZMA;flFq()4Yd*AUgSLrNr6uV_#RqS`+7=_=tZHc=?|xCe?*}>w zXq|FD&}V-0ssI200000 b0CYS76s$DUVDrbc00000NkvXXu0mjfPjt`+ delta 386 zcmX@jJePTbN_~o_i(^Q|oVPb4g_;$38WL~4^xgA+;tp^587Gfy;Fxyy<$v3qE=kRc zE=`v{Q@uXC|FOi}kCFF2ss(S-6T5b|+WwLF-3d0m{xT*DBYuUb#CphZd(E9h_ukwDSwLA*;6WqWjF}n{zymNmS(@&zteBgO!0nG%ovc zc-@!j_vO#L_Nu)4Tfna3E74jZ473F+ aIRBaT?0xy}zm`^~K=PihelF{r5}E)fUbm|N diff --git a/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00000.png b/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..9fa51df290f85860c685b43831f20f559eca45c8 GIT binary patch literal 463 zcmV;=0WkiFP)F^nHG&Ol`S5r1^o^|y$IUFw_Pd~Lz8jw=Xjq3)L<=#r&dQ}r6#DO4*H>AE-UhooQ{HOwN^$l+pw5K}_2zX-r#vr3)CJ8A z*UP6bT%k`*Mbslh^UYOg>ihJ%&LvNu%uz0=$q10qnF5(Q1RYG>G)IqVPoHe|9AKo< znp1+2(kU-Ea^8OWqs3Y{UdvZD^nv&Q000000001<;TM*+Ki`d0xJ&>5002ovPDHLk FV1mAB&o2M~ literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00001.png b/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..36cf8c9ff2466860c385759cdc6412a4fe0b9515 GIT binary patch literal 485 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|?M1>EaktG3V{g=t<2A0uC2d zrq12*Uv=m7pBuWA{yGHgHk?_#PbtZn=e>jTu& zYQ#VO;)fcmGG2b3ME8_e-?d58f&H=w8{_nY1+*HPTY1Yvvb3e2m zuXl8>zGzhC@H}HN&~^43+>V>%+uf);F@ILeV$-xAzaJaqZCWz7V9V-l*MPBu1#EcF XpPJKIws-31pCDOJS3j3^P6 z8y$ZMTFVp{lb;GSEv|Fp$rQiYOwWM05ogOj9mF{??Wk~h&e@rp6&suf(HS7Fch}Ri zxonoeF}MMuNm)C0xZ$5q@DzAO)Wk{Yvily;W3S_1$~OhT-67pJq%iV{qcLX_?zQrx zbP4RAec94`Hhbo=-92{4$NOq>j2ctx;shXQI(K?+ie1F@M4P9JsQGD%| zRN_FmF$5<7Tz&J7Hrk-HNPFIw2Y9U7)J74!6tZQuH<4jZs{_XVb4k|m)X1mpb@Sjc zaNV-F5X=6ABKEyM5{9YS85!LJTpgsPco#Ul8IskRXW7ASUR}Lnwnlb-_X4r9zw9k$ z3nO-As!oWk4;_Bk84 zt?m^}-h6HAHf65lTW>#z=zsQm$@2H%!L;i|Pd?my{wBvh$fn2po$Eop|4QXzrITWR z=2mn3f9Wo+;Q7=4{uTz^<<)(gKc&?FTE_aI_~BE}9rre`=G2|N{oz+WU_c;)1EzNv XU7w!SY@Q^Y3KI8p^>bP0l+XkKqjQme literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00004.png b/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..908600200d45a13b6992c9edeaa2393b0861e45e GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{s}ba4!+nDh2#>^dezp0-4j zcP)SQGrv7zop@z^!{@^dD({O;3pZS0lC^y<_-c8seF_?~)R`1e_fGkV^^&kc_nKe2Ci;Xa$I%_*{c^5!6)e{)29 zm26b^_g($2+GqGHEFoLHbjrtX)ApXY*wuVn^43v}zKkE#FzsNY5Gxh(T zJCBYVE0jbr-{!qkvu!oY_1(2BlJPz7r`{q)_#9?Etbho@b5$RU8^@vO`qSq zo+ZVt-qe2XWwpBHrw@L;*eY}K@+0Y8ops?&hl&kuZhzA9_O#D`fxfc`A1#$x!mG09 z1T%xWQO$YJ>YqQwcZDusuKu*@^hMcgTe~ HDWM4f9D9lr literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00006.png b/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..59fce75cd1321a13bc8840b9bc6f48f87485d7c2 GIT binary patch literal 542 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@Xe>EaktG3V{fz@iodj<(Bw z`H%kgKZ*VIfT!8hA*ti;+q(O~A)ne=kMd3f=|TqHKR)Td|6RwkEqC(aRyG0K+=idJEc8z{!vY;Sy?Y&K!ZXCBlwc4W# z*M|A7uh}3Y9r|tZ_qQ>h1^Kr`PwkCad+gTQS9=!cOa73HTXlEG?#HL5KU%2%z@uV! z*2}vtNtT~)MEzRZ=r20uo&S#Z#WA`Mk0*YU-LNa``K#=$Cs`~`J&kGEz16W}+Jdsi zbu&XH-FNo<4oKQ{Omk(ai_+KSXZA3woC+%bV`Mw4KkUBIjF8Q%+zp&#Q)?~eyu6eC zS$9LxoPA!CF7AIklV!^34|Qo@PB(LE_)V}k`*q%#@82Zz6;9{u=but5KdNI|zffgy zDogUml&j|!z5d{8{cB#;)t<{|P51X+H8VSM>}6l3ywb1G&F8J|&nu;WmemiwSKvUdj@u**QKfk3SLZ?7@Or(7D5aEt&c7~-vI9S@ zDPR2M?6XWEbQkv74!ZoZ+ncmZJ#UeeQXX0UTFz}JUP#WfG`{VComW4lRGm)M4b>(; zns_1QU2^ch19n*bOipIB+y_j;{KN~X_Q7-X!Bw>PNVc0D`Z5ZpTI9DQXms%>Q{MZx zS@(m4AK@dEz2=IA8z(008jEWAs5+4r4@uw)-RIwzrZ$}LUXHu)7C6ZoLzUw7^c8euB0JS-*DK}Kr zRoYGr;h2zEqXB#@W}+&Vey2AnCs*kUQlP*t%QRrWb! z*~&+!r8Po>0{{R3_G4HD9h9Y&S?bbyBVWZr<9f;F*_n^M8SXZRRc0#7v?FCQky|9K zvdwe2g_uSxwuL#fA^I%(Qp9MzrmfJ(qVh({My485zOtzD+>KQwZ(f1vRdg{di# zptaaCKf4SC0002MLhS#Nl&D}HZ7wQetEs6x3!ST8mzyK(;;N6d4X0n5W12fvGPYSx zjql)^w<4nYsT)+*!$wTL0S&L1ovF>4uf@}Lxs*8S?L^7md=-qw@UFBGC4Ow4Z9hn& zS16>2DUw&rs#E)Z+K!gUKY)Z-ZSDq4%24O)Y$0Xn)En=|>{)V}hiH5N0002Ef>qxS z$VQvWCehT^jZs~Nc74>?+C|2XO~Z=v96QF`%x7-?6{U4V)%Cissmir5ewaZ3h^q`$6=$u{sq3w? jNHWZJC~*J)0F3+sD_C*m9RV=200000NkvXXu0mjfvY&e%b+u7$dh0r~*U()IJ!bb}KQ3zjX^LU07+y=Xsjww4euo^o{d8 zO|(Bi{WlYCSy?u$7NnjLxFS8ZgaCi718eF(fcW}CYY8&) z`h4)?T92XzM+hN=Y)pR&TGXec#WzkUc@P~CsTrvU)D!EE!UiGVp3sy>@lo<1QBvcJ z(gF1f!E6Uxh;b)@Ty(J$x??9e6ysL(DQQ9SSe37Ip$-UE*v*NkfkPJcDI|~2N4`B< z2b@-@H>d};pskdjvX&@|N|$Fo8FxMI=jQr9fNXG4&&MHAh>rw$Le2LS8&V;jjSxZz zA$u_VOEOBLa!7B|Vv^ouRQO|YHPhX=XAp{#sE|CSjkL+4e3xmLi%V~&st)=);i#eY z*~4$hR@|@?_DNKDo@DHJ4k-|2qEN$Z?lMuTxX3z QTmS$707*qoM6N<$f|xjnrvLx| literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00009.png b/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..659efc67dd7c30ced3b30909e95d7081f8dc59c1 GIT binary patch literal 845 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 literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00012.png b/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00012.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f1700dc5145fc099930fe17c1e3e95abe9d465 GIT binary patch literal 424 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|`Jmba4!+nDh2#;G|{+o`%F- zmuDCJSFW61n=orBi&BC}+VlVOqGl;5DP0P`ajZ~Au|;BW&9wFAvZ?I$yFC2rcGm7X z>AE%fzE#H0%-4>y%wzK=N-TDH7XLYB?v4ptjP?KQVlI34S0dTaT9nz#eBaa^0d`)K z_FE^k-xI$yBdlEAt@-Vd)~??V?*2*?wRKxkv+Gc{Zc$jtr|TkDtbVpXP5yuXOLfsF z9*)~F%}XL?sQrC;xzqe+ViO|+gZ%o7ERRd;SGb6OJHoQn#&px2*BiHU%#VBWqV;Y- z=SDq~q##ez@bsP67bkz3v~y}+s(DFzob#FT6>*ZkpXOye|9I%8<(K0(68{>;9iP-t zv;C^YwN2Nx_exrdBWdwm`maFt30Q@vtDnm{ Hr-UW|bELez literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00013.png b/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00013.png new file mode 100644 index 0000000000000000000000000000000000000000..59fce75cd1321a13bc8840b9bc6f48f87485d7c2 GIT binary patch literal 542 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@Xe>EaktG3V{fz@iodj<(Bw z`H%kgKZ*VIfT!8hA*ti;+q(O~A)ne=kMd3f=|TqHKR)Td|6RwkEqC(aRyG0K+=idJEc8z{!vY;Sy?Y&K!ZXCBlwc4W# z*M|A7uh}3Y9r|tZ_qQ>h1^Kr`PwkCad+gTQS9=!cOa73HTXlEG?#HL5KU%2%z@uV! z*2}vtNtT~)MEzRZ=r20uo&S#Z#WA`Mk0*YU-LNa``K#=$Cs`~`J&kGEz16W}+Jdsi zbu&XH-FNo<4oKQ{Omk(ai_+KSXZA3woC+%bV`Mw4KkUBIjF8Q%+zp&#Q)?~eyu6eC zS$9LxoPA!CF7AIklV!^34|Qo@PB(LE_)V}k`*q%#@82Zz6;9{u=but5KdNI|zffgy zDogUml&j|!z5d{8{cB#;)t<{|P51X+H8VSM>}6l3ywb1G&F8J|&nu;WmemiwSKvUdj@u**QKfk3w~ba4!+nDh2#q)@X0PebCZ zm%e-cPu$@xKjY+)4IIgOjX`_P+iiYp~^)T6Ut3N8D*&O)mCn$whZ>mPk!MQ~TlM z+ZXdfrxh=53=Id(-f##w(&`jQ-qY33Wt~$(69B9yx!C{! literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00015.png b/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/no_whitelist/00015.png new file mode 100644 index 0000000000000000000000000000000000000000..471324463647c42b2de74c282e34caf0e801955d GIT binary patch literal 459 zcmV;+0W|)JP)0000000000GrafSd+k=txobDz zH0DAd{73>~^qq6MEtzF00j(LvZuG@g0)i|DrlT*m5)eZigKj4ORUA9djY)L3A zOU`QfpfbF-uEn`L=Qc9>w6GI6A^ zcOCs>NC05Pb#uDnYQYqw?9s1sjq0^e*r=7;#KH4zwSL@^&c1mKwGrT6F^nHG&Ol`S5r1^o^|y$IUFw_Pd~Lz8jw=Xjq3)L<=#r&dQ}r6#DO4*H>AE-UhooQ{HOwN^$l+pw5K}_2zX-r#vr3)CJ8A z*UP6bT%k`*Mbslh^UYOg>ihJ%&LvNu%uz0=$q10qnF5(Q1RYG>G)IqVPoHe|9AKo< znp1+2(kU-Ea^8OWqs3Y{UdvZD^nv&Q000000001<;TM*+Ki`d0xJ&>5002ovPDHLk FV1mAB&o2M~ literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00001.png b/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..36cf8c9ff2466860c385759cdc6412a4fe0b9515 GIT binary patch literal 485 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|?M1>EaktG3V{g=t<2A0uC2d zrq12*Uv=m7pBuWA{yGHgHk?_#PbtZn=e>jTu& zYQ#VO;)fcmGG2b3ME8_e-?d58f&H=w8{_nY1+*HPTY1Yvvb3e2m zuXl8>zGzhC@H}HN&~^43+>V>%+uf);F@ILeV$-xAzaJaqZCWz7V9V-l*MPBu1#EcF XpPJKIws-31pCDOJS3j3^P6 z8y$ZMTFVp{lb;GSEv|Fp$rQiYOwWM05ogOj9mF{??Wk~h&e@rp6&suf(HS7Fch}Ri zxonoeF}MMuNm)C0xZ$5q@DzAO)Wk{Yvily;W3S_1$~OhT-67pJq%iV{qcLX_?zQrx zbP4RAec94`Hhbo=-92{4$NOq>j2ctx;shXQI(K?+ie1F@M4P9JsQGD%| zRN_FmF$5<7Tz&J7Hrk-HNPFIw2Y9U7)J74!6tZQuH<4jZs{_XVb4k|m)X1mpb@Sjc zaNV-F5X=6ABKEyM5{9YS85!LJTpgsPco#Ul8IskRXW7ASUR}Lnwnlb-_X4r9zw9k$ z3nO-As!oWk4;_Bk84 zt?m^}-h6HAHf65lTW>#z=zsQm$@2H%!L;i|Pd?my{wBvh$fn2po$Eop|4QXzrITWR z=2mn3f9Wo+;Q7=4{uTz^<<)(gKc&?FTE_aI_~BE}9rre`=G2|N{oz+WU_c;)1EzNv XU7w!SY@Q^Y3KI8p^>bP0l+XkKqjQme literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00004.png b/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..908600200d45a13b6992c9edeaa2393b0861e45e GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{s}ba4!+nDh2#>^dezp0-4j zcP)SQGrv7zop@z^!{@^dD({O;3pZS0lC^y<_-c8seF_?~)R`1e_fGkV^^&kc_nKe2Ci;Xa$I%_*{c^5!6)e{)29 zm26b^_g($2+GqGHEFoLHbjrtX)ApXY*wuVn^43v}zKkE#FzsNY5Gxh(T zJCBYVE0jbr-{!qkvu!oY_1(2BlJPz7r`{q)_#9?Etbho@b5$RU8^@vO`qSq zo+ZVt-qe2XWwpBHrw@L;*eY}K@+0Y8ops?&hl&kuZhzA9_O#D`fxfc`A1#$x!mG09 z1T%xWQO$YJ>YqQwcZDusuKu*@^hMcgTe~ HDWM4f9D9lr literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00006.png b/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..59fce75cd1321a13bc8840b9bc6f48f87485d7c2 GIT binary patch literal 542 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@Xe>EaktG3V{fz@iodj<(Bw z`H%kgKZ*VIfT!8hA*ti;+q(O~A)ne=kMd3f=|TqHKR)Td|6RwkEqC(aRyG0K+=idJEc8z{!vY;Sy?Y&K!ZXCBlwc4W# z*M|A7uh}3Y9r|tZ_qQ>h1^Kr`PwkCad+gTQS9=!cOa73HTXlEG?#HL5KU%2%z@uV! z*2}vtNtT~)MEzRZ=r20uo&S#Z#WA`Mk0*YU-LNa``K#=$Cs`~`J&kGEz16W}+Jdsi zbu&XH-FNo<4oKQ{Omk(ai_+KSXZA3woC+%bV`Mw4KkUBIjF8Q%+zp&#Q)?~eyu6eC zS$9LxoPA!CF7AIklV!^34|Qo@PB(LE_)V}k`*q%#@82Zz6;9{u=but5KdNI|zffgy zDogUml&j|!z5d{8{cB#;)t<{|P51X+H8VSM>}6l3ywb1G&F8J|&nu;WmemiwSKvUdj@u**QKfk3SLZ?7@Or(7D5aEt&c7~-vI9S@ zDPR2M?6XWEbQkv74!ZoZ+ncmZJ#UeeQXX0UTFz}JUP#WfG`{VComW4lRGm)M4b>(; zns_1QU2^ch19n*bOipIB+y_j;{KN~X_Q7-X!Bw>PNVc0D`Z5ZpTI9DQXms%>Q{MZx zS@(m4AK@dEz2=IA8z(008jEWAs5+4r4@uw)-RIwzrZ$}LUXHu)7C6ZoLzUw7^c8euB0JS-*DK}Kr zRoYGr;h2zEqXB#@W}+&Vey2AnCs*kUQlP*t%QRrWb! z*~&+!r8Po>0{{R3_G4HD9h9Y&S?bbyBVWZr<9f;F*_n^M8SXZRRc0#7v?FCQky|9K zvdwe2g_uSxwuL#fA^I%(Qp9MzrmfJ(qVh({My485zOtzD+>KQwZ(f1vRdg{di# zptaaCKf4SC0002MLhS#Nl&D}HZ7wQetEs6x3!ST8mzyK(;;N6d4X0n5W12fvGPYSx zjql)^w<4nYsT)+*!$wTL0S&L1ovF>4uf@}Lxs*8S?L^7md=-qw@UFBGC4Ow4Z9hn& zS16>2DUw&rs#E)Z+K!gUKY)Z-ZSDq4%24O)Y$0Xn)En=|>{)V}hiH5N0002Ef>qxS z$VQvWCehT^jZs~Nc74>?+C|2XO~Z=v96QF`%x7-?6{U4V)%Cissmir5ewaZ3h^q`$6=$u{sq3w? jNHWZJC~*J)0F3+sD_C*m9RV=200000NkvXXu0mjfvY&e%b+u7$dh0r~*U()IJ!bb}KQ3zjX^LU07+y=Xsjww4euo^o{d8 zO|(Bi{WlYCSy?u$7NnjLxFS8ZgaCi718eF(fcW}CYY8&) z`h4)?T92XzM+hN=Y)pR&TGXec#WzkUc@P~CsTrvU)D!EE!UiGVp3sy>@lo<1QBvcJ z(gF1f!E6Uxh;b)@Ty(J$x??9e6ysL(DQQ9SSe37Ip$-UE*v*NkfkPJcDI|~2N4`B< z2b@-@H>d};pskdjvX&@|N|$Fo8FxMI=jQr9fNXG4&&MHAh>rw$Le2LS8&V;jjSxZz zA$u_VOEOBLa!7B|Vv^ouRQO|YHPhX=XAp{#sE|CSjkL+4e3xmLi%V~&st)=);i#eY z*~4$hR@|@?_DNKDo@DHJ4k-|2qEN$Z?lMuTxX3z QTmS$707*qoM6N<$f|xjnrvLx| literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00009.png b/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..659efc67dd7c30ced3b30909e95d7081f8dc59c1 GIT binary patch literal 845 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 literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00012.png b/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00012.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f1700dc5145fc099930fe17c1e3e95abe9d465 GIT binary patch literal 424 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|`Jmba4!+nDh2#;G|{+o`%F- zmuDCJSFW61n=orBi&BC}+VlVOqGl;5DP0P`ajZ~Au|;BW&9wFAvZ?I$yFC2rcGm7X z>AE%fzE#H0%-4>y%wzK=N-TDH7XLYB?v4ptjP?KQVlI34S0dTaT9nz#eBaa^0d`)K z_FE^k-xI$yBdlEAt@-Vd)~??V?*2*?wRKxkv+Gc{Zc$jtr|TkDtbVpXP5yuXOLfsF z9*)~F%}XL?sQrC;xzqe+ViO|+gZ%o7ERRd;SGb6OJHoQn#&px2*BiHU%#VBWqV;Y- z=SDq~q##ez@bsP67bkz3v~y}+s(DFzob#FT6>*ZkpXOye|9I%8<(K0(68{>;9iP-t zv;C^YwN2Nx_exrdBWdwm`maFt30Q@vtDnm{ Hr-UW|bELez literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00013.png b/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00013.png new file mode 100644 index 0000000000000000000000000000000000000000..59fce75cd1321a13bc8840b9bc6f48f87485d7c2 GIT binary patch literal 542 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@Xe>EaktG3V{fz@iodj<(Bw z`H%kgKZ*VIfT!8hA*ti;+q(O~A)ne=kMd3f=|TqHKR)Td|6RwkEqC(aRyG0K+=idJEc8z{!vY;Sy?Y&K!ZXCBlwc4W# z*M|A7uh}3Y9r|tZ_qQ>h1^Kr`PwkCad+gTQS9=!cOa73HTXlEG?#HL5KU%2%z@uV! z*2}vtNtT~)MEzRZ=r20uo&S#Z#WA`Mk0*YU-LNa``K#=$Cs`~`J&kGEz16W}+Jdsi zbu&XH-FNo<4oKQ{Omk(ai_+KSXZA3woC+%bV`Mw4KkUBIjF8Q%+zp&#Q)?~eyu6eC zS$9LxoPA!CF7AIklV!^34|Qo@PB(LE_)V}k`*q%#@82Zz6;9{u=but5KdNI|zffgy zDogUml&j|!z5d{8{cB#;)t<{|P51X+H8VSM>}6l3ywb1G&F8J|&nu;WmemiwSKvUdj@u**QKfk3w~ba4!+nDh2#q)@X0PebCZ zm%e-cPu$@xKjY+)4IIgOjX`_P+iiYp~^)T6Ut3N8D*&O)mCn$whZ>mPk!MQ~TlM z+ZXdfrxh=53=Id(-f##w(&`jQ-qY33Wt~$(69B9yx!C{! literal 0 HcmV?d00001 diff --git a/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00015.png b/tests/integration/nano/snapshots/nanox/test_sign_sc_rollup_originate/with_whitelist/00015.png new file mode 100644 index 0000000000000000000000000000000000000000..7e7736a36f8656e124d9926a12e22feaf0e9f788 GIT binary patch literal 793 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 Date: Tue, 20 Feb 2024 10:48:58 +0100 Subject: [PATCH 32/38] Michelson: adding missing operations --- app/src/parser/formatting.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/parser/formatting.c b/app/src/parser/formatting.c index d3de8c62d..3c63adf5b 100644 --- a/app/src/parser/formatting.c +++ b/app/src/parser/formatting.c @@ -182,7 +182,9 @@ const char *const tz_michelson_op_names_ordered[TZ_LAST_MICHELSON_OPCODE + 1] "EMIT", // 151 "Lambda_rec", // 152 "LAMBDA_REC", // 153 - "TICKET" // 154 + "TICKET", // 154 + "BYTES", // 155 + "NAT", // 156 }; const char * From 46de0bd0e9f7f3bc348edb5c4088424641bcb142 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Fri, 16 Feb 2024 12:05:50 +0100 Subject: [PATCH 33/38] Tests: update the version of test generation to Oxford --- app/src/parser/formatting.h | 2 +- docker/Dockerfile.ocaml | 25 ++++++++------- tests/generate/dune | 4 +-- tests/generate/gen_integration.ml | 32 +++++++++++-------- tests/generate/gen_micheline.ml | 4 +-- tests/generate/gen_operations.ml | 24 +++++++------- tests/generate/gen_utils.ml | 2 +- tests/unit/ctest/tests_parser.c | 12 +++---- tests/unit/parser/dune | 4 +-- tests/unit/parser/test_c_parser.ml | 2 +- tests/unit/parser/test_micheline_c_parser.ml | 2 +- tests/unit/parser/test_operations_c_parser.ml | 27 ++++++++++------ 12 files changed, 76 insertions(+), 64 deletions(-) diff --git a/app/src/parser/formatting.h b/app/src/parser/formatting.h index 0436ca1e9..6e4306897 100644 --- a/app/src/parser/formatting.h +++ b/app/src/parser/formatting.h @@ -23,7 +23,7 @@ * * Should be kept in sync with the last protocol update. */ -#define TZ_LAST_MICHELSON_OPCODE 154 +#define TZ_LAST_MICHELSON_OPCODE 157 /** * @brief Get the human readable name of a Michelson op_code if valid diff --git a/docker/Dockerfile.ocaml b/docker/Dockerfile.ocaml index aa875a141..162ecbb57 100644 --- a/docker/Dockerfile.ocaml +++ b/docker/Dockerfile.ocaml @@ -1,21 +1,22 @@ -FROM ocaml/opam:alpine-3.17-ocaml-4.14 +FROM ocaml/opam:alpine-3.18-ocaml-4.14 RUN sudo cp /usr/bin/opam-2.1 /usr/bin/opam; \ - OCTEZ_VERSION=17.1; \ + opam remote add opam https://opam.ocaml.org; \ + RUSTUP_TOOLCHAIN=1.71.1; \ + OCTEZ_VERSION=19.1; \ OCTEZ_REPO=https://gitlab.com/tezos/tezos.git; \ OCTEZ_COMMIT=`git ls-remote $OCTEZ_REPO v$OCTEZ_VERSION | cut -f 1`; \ OCTEZ_URL=$OCTEZ_REPO#$OCTEZ_COMMIT; \ + wget https://sh.rustup.rs/rustup-init.sh; \ + chmod +x rustup-init.sh; \ + ./rustup-init.sh --profile minimal --default-toolchain $RUSTUP_TOOLCHAIN -y; \ + source "$HOME/.cargo/env"; \ opam install \ - tezos-client-017-PtNairob.$OCTEZ_VERSION \ - terminal_size \ - octez-codec.$OCTEZ_VERSION \ - tezos-test-helpers.$OCTEZ_VERSION; \ - opam pin tezos-benchmark.$OCTEZ_VERSION $OCTEZ_URL; \ + octez-protocol-018-Proxford-libs.$OCTEZ_VERSION \ + terminal_size; \ opam pin tezos-micheline-rewriting.$OCTEZ_VERSION $OCTEZ_URL; \ - opam pin tezos-benchmark-type-inference-017-PtNairob.$OCTEZ_VERSION $OCTEZ_URL; \ - opam pin tezos-017-PtNairob-test-helpers.$OCTEZ_VERSION $OCTEZ_URL; \ - opam pin tezos-benchmark-017-PtNairob.$OCTEZ_VERSION $OCTEZ_URL; \ - opam pin tezos-shell-benchmarks.$OCTEZ_VERSION $OCTEZ_URL; \ - opam pin tezos-benchmarks-proto-017-PtNairob.$OCTEZ_VERSION $OCTEZ_URL; \ + opam pin tezos-benchmark-type-inference-018-Proxford.$OCTEZ_VERSION $OCTEZ_URL; \ + opam pin tezos-benchmark-018-Proxford.$OCTEZ_VERSION $OCTEZ_URL; \ + opam pin tezos-benchmarks-proto-018-Proxford.$OCTEZ_VERSION $OCTEZ_URL; \ rm -rf opam-repository .opam/download-cache .opam/repo \ .opam/4.14/.opam-switch/build .opam/4.14/.opam-switch/sources; diff --git a/tests/generate/dune b/tests/generate/dune index edc9b1f7e..e50684696 100644 --- a/tests/generate/dune +++ b/tests/generate/dune @@ -1,4 +1,4 @@ (executable (name generate) - (libraries "tezos-protocol-017-PtNairob" - "tezos-benchmarks-proto-017-PtNairob")) + (libraries "octez-protocol-018-Proxford-libs.client" + "tezos-benchmarks-proto-018-Proxford")) diff --git a/tests/generate/gen_integration.ml b/tests/generate/gen_integration.ml index cf0113820..fb04e776e 100644 --- a/tests/generate/gen_integration.ml +++ b/tests/generate/gen_integration.ml @@ -144,7 +144,7 @@ let sign ppf ~signer:Apdu.Signer.({ sk; pk; _ } as signer) ~watermark bin = in send_async_apdus ppf async_apdus -open Tezos_protocol_017_PtNairob +open Tezos_protocol_018_Proxford open Tezos_micheline let rec pp_node ~wrap ppf (node : Protocol.Script_repr.node) = @@ -317,25 +317,29 @@ let operation_to_screens { rollup; cemented_commitment; output_proof } -> aux ~kind:"SR: execute outbox message" [ - make_screen ~title:"Rollup" "%a" Sc_rollup_repr.Address.pp rollup; + make_screen ~title:"Rollup" "%a" Sc_rollup.Address.pp rollup; make_screen ~title:"Commitment" "%a" Sc_rollup.Commitment.Hash.pp cemented_commitment; need_expert_mode_screen "Output proof"; make_screen ~title:"Output proof" "%a" pp_string_binary output_proof; ] - | Sc_rollup_originate - { kind; boot_sector; origination_proof; parameters_ty } -> + | Sc_rollup_originate { kind; boot_sector; parameters_ty; whitelist } -> + let whitelist = + match whitelist with + | None | Some [] -> [] + | Some whitelist -> + make_screens ~title:"Whitelist" + Tezos_crypto.Signature.Public_key_hash.pp whitelist + in aux ~kind:"SR: originate" - [ - make_screen ~title:"Kind" "%a" Sc_rollup.Kind.pp kind; - need_expert_mode_screen "Kernel"; - make_screen ~title:"Kernel" "%a" pp_string_binary boot_sector; - need_expert_mode_screen "Proof"; - make_screen ~title:"Proof" "%a" pp_serialized_proof - origination_proof; - need_expert_mode_screen "Parameters"; - make_screen ~title:"Parameters" "%a" pp_lazy_expr parameters_ty; - ] + ([ + make_screen ~title:"Kind" "%a" Sc_rollup.Kind.pp kind; + need_expert_mode_screen "Kernel"; + make_screen ~title:"Kernel" "%a" pp_string_binary boot_sector; + need_expert_mode_screen "Parameters"; + make_screen ~title:"Parameters" "%a" pp_lazy_expr parameters_ty; + ] + @ whitelist) | _ -> assert false in let screen_of_operation (type t) (operation : t contents) = diff --git a/tests/generate/gen_micheline.ml b/tests/generate/gen_micheline.ml index e7e246ba2..78ce92206 100644 --- a/tests/generate/gen_micheline.ml +++ b/tests/generate/gen_micheline.ml @@ -13,9 +13,9 @@ See the License for the specific language governing permissions and limitations under the License. *) -open Tezos_protocol_017_PtNairob +open Tezos_protocol_018_Proxford open Tezos_micheline -open Tezos_benchmarks_proto_017_PtNairob +open Tezos_benchmarks_proto_018_Proxford let config = { diff --git a/tests/generate/gen_operations.ml b/tests/generate/gen_operations.ml index 3da80c54f..ac6c52e9c 100644 --- a/tests/generate/gen_operations.ml +++ b/tests/generate/gen_operations.ml @@ -13,7 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. *) -open Tezos_protocol_017_PtNairob +open Tezos_protocol_018_Proxford let gen_lazy_expr = let open QCheck2.Gen in @@ -144,7 +144,7 @@ let some_sc_rollup_hash = let gen_sc_rollup_hash = let open QCheck2.Gen in let+ sc_h = oneofl some_sc_rollup_hash in - Protocol.Alpha_context.Sc_rollup_repr.Address.of_b58check_exn sc_h + Protocol.Alpha_context.Sc_rollup.Address.of_b58check_exn sc_h let some_sc_rollup_commiment_hash = [ @@ -175,6 +175,7 @@ let some_protocol_hash = "PtLimaPtLMwfNinJi9rCfDPWea8dFgTZ1MeJ9f1m2SRic6ayiwW"; "PtMumbai2TmsJHNGRkD8v8YDbtao7BLUC3wjASn1inAKLFCjaH1"; "PtNairobiyssHuh87hEhfVBGCVrK3WnS8Z2FT4ymB5tAa4r1nQf"; + "ProxfordYmVfjWnRcgjWH36fW6PArwqykTFzotUxRs6gmTcZDuH"; "ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK"; "ProtoALphaALphaALphaALphaALphaALphaALpha61322gcLUGH"; "ProtoALphaALphaALphaALphaALphaALphaALphabc2a7ebx6WB"; @@ -279,6 +280,10 @@ let gen_entrypoint = set_delegate; remove_delegate; deposit; + stake; + unstake; + finalize_unstake; + set_delegate_parameters; of_string_strict_exn "jean_bob"; ] @@ -367,18 +372,13 @@ let gen_sc_rollup_execute_outbox_message = let gen_sc_rollup_originate = let open Protocol.Alpha_context in let open QCheck2.Gen in - let* kind = oneofl Sc_rollup.Kind.[ Example_arith; Wasm_2_0_0 ] in + let* kind = oneofl Sc_rollup.Kind.[ Example_arith; Wasm_2_0_0; Riscv ] in let* boot_sector = string_size small_nat in - let* origination_proof = string_size small_nat in - let origination_proof = - Data_encoding.( - origination_proof - |> Binary.to_bytes_exn (string' Hex) - |> Binary.of_bytes_exn Sc_rollup.Proof.serialized_encoding) - in let* parameters_ty = gen_lazy_expr in - return - (Sc_rollup_originate { kind; boot_sector; origination_proof; parameters_ty }) + let* whitelist = + QCheck2.Gen.option @@ list_size small_nat gen_public_key_hash + in + return (Sc_rollup_originate { kind; boot_sector; parameters_ty; whitelist }) let gen_proposals = let open Protocol.Alpha_context in diff --git a/tests/generate/gen_utils.ml b/tests/generate/gen_utils.ml index 64649fbf5..fdbe402e8 100644 --- a/tests/generate/gen_utils.ml +++ b/tests/generate/gen_utils.ml @@ -13,7 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. *) -open Tezos_protocol_017_PtNairob +open Tezos_protocol_018_Proxford open Tezos_micheline let random_state = diff --git a/tests/unit/ctest/tests_parser.c b/tests/unit/ctest/tests_parser.c index 4721255c2..3b80a084f 100644 --- a/tests/unit/ctest/tests_parser.c +++ b/tests/unit/ctest/tests_parser.c @@ -457,18 +457,18 @@ CTEST2(operation_parser, check_sc_rollup_originate_complexity) "396333333439653539633133623930383166316331316234343061633464333435" "356465646265346565306465313561386166363230643463383632343764396431" "333264653162623664613233643566663964386466666461323262613961383400" - "00006c030002104135165622d08b0c6eac951c9d4fd65109585907bc30ef0617f6" - "c26853c6ba724af04dd3e4b5861efae3166ebc12ef5781df9715c20943e8d0b7bc" - "06068a6f8106737461747573c87a31b1c8e3af61756b336bcfc3b0c292c89b40cc" - "8a5080ba99c45463d110ce8b0000000a07070100000001310002"; + "00000a07070100000001310002ff0000003f00ffdd6102321bc251e4a5190ad5b1" + "2b251069d9b401f6552df4f5ff51c3d13347cab045cfdb8b9bd8030278eb8b6ab9" + "a768579cd5146b480789650c83f28e"; const tz_fields_check fields_check[] = { {"Source", false, 1}, {"Fee", false, 2}, {"Storage limit", false, 3}, {"Kind", false, 4}, {"Kernel", true, 5}, - {"Proof", true, 6}, - {"Parameters", true, 7}, + {"Parameters", true, 6}, + // {"Option", _, 7}, + {"Whitelist", false, 8}, }; check_field_complexity(data, str, fields_check, sizeof(fields_check)); } diff --git a/tests/unit/parser/dune b/tests/unit/parser/dune index 2db7ec927..d1237bf3f 100644 --- a/tests/unit/parser/dune +++ b/tests/unit/parser/dune @@ -1,8 +1,8 @@ (executable (name test_c_parser) (modules test_c_parser_utils test_micheline_c_parser test_operations_c_parser test_c_parser) - (libraries "tezos-protocol-017-PtNairob" - "tezos-benchmarks-proto-017-PtNairob" + (libraries "octez-protocol-018-Proxford-libs.client" + "tezos-benchmarks-proto-018-Proxford" "terminal_size") (foreign_stubs (language c) diff --git a/tests/unit/parser/test_c_parser.ml b/tests/unit/parser/test_c_parser.ml index 29fde2eaf..cbfbc2cb2 100644 --- a/tests/unit/parser/test_c_parser.ml +++ b/tests/unit/parser/test_c_parser.ml @@ -13,7 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. *) -open Tezos_protocol_017_PtNairob +open Tezos_protocol_018_Proxford open Test_c_parser_utils let read_hex_file ~encoding path = diff --git a/tests/unit/parser/test_micheline_c_parser.ml b/tests/unit/parser/test_micheline_c_parser.ml index 5f6568181..ccacef4df 100644 --- a/tests/unit/parser/test_micheline_c_parser.ml +++ b/tests/unit/parser/test_micheline_c_parser.ml @@ -13,7 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. *) -open Tezos_protocol_017_PtNairob +open Tezos_protocol_018_Proxford open Tezos_micheline open Test_c_parser_utils diff --git a/tests/unit/parser/test_operations_c_parser.ml b/tests/unit/parser/test_operations_c_parser.ml index e00c03f51..d0f1ed0fe 100644 --- a/tests/unit/parser/test_operations_c_parser.ml +++ b/tests/unit/parser/test_operations_c_parser.ml @@ -12,7 +12,7 @@ See the License for the specific language governing permissions and limitations under the License. *) -open Tezos_protocol_017_PtNairob +open Tezos_protocol_018_Proxford open Test_c_parser_utils let pp_opt_field pp ppf = function @@ -124,20 +124,27 @@ let to_string { rollup; cemented_commitment; output_proof } -> aux ~kind:"SR: execute outbox message" [ - Format.asprintf "%a" Sc_rollup_repr.Address.pp rollup; + Format.asprintf "%a" Sc_rollup.Address.pp rollup; Format.asprintf "%a" Sc_rollup.Commitment.Hash.pp cemented_commitment; Format.asprintf "%a" pp_string_binary output_proof; ] - | Sc_rollup_originate - { kind; boot_sector; origination_proof; parameters_ty } -> + | Sc_rollup_originate { kind; boot_sector; parameters_ty; whitelist } -> + let whitelist = + match whitelist with + | None -> [] + | Some whitelist -> + List.map + (Format.asprintf "%a" Tezos_crypto.Signature.Public_key_hash.pp) + whitelist + in aux ~kind:"SR: originate" - [ - Format.asprintf "%a" Sc_rollup.Kind.pp kind; - Format.asprintf "%a" pp_string_binary boot_sector; - Format.asprintf "%a" pp_serialized_proof origination_proof; - Format.asprintf "%a" pp_lazy_expr parameters_ty; - ] + ([ + Format.asprintf "%a" Sc_rollup.Kind.pp kind; + Format.asprintf "%a" pp_string_binary boot_sector; + Format.asprintf "%a" pp_lazy_expr parameters_ty; + ] + @ whitelist) | _ -> assert false in let operation_to_string (type t) (operation : t contents) = From fe39fcd7e9559ee151edd2876015e3efd9240f5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Palmer?= Date: Fri, 16 Feb 2024 12:06:43 +0100 Subject: [PATCH 34/38] Test: fix unit-test parser for transaction --- tests/unit/parser/test_operations_c_parser.ml | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/tests/unit/parser/test_operations_c_parser.ml b/tests/unit/parser/test_operations_c_parser.ml index d0f1ed0fe..f0f0d8bff 100644 --- a/tests/unit/parser/test_operations_c_parser.ml +++ b/tests/unit/parser/test_operations_c_parser.ml @@ -91,13 +91,23 @@ let to_string aux ~kind:"Set deposit limit" [ Format.asprintf "%a" (pp_opt_field pp_tz) tez_opt ] | Transaction { amount; entrypoint; destination; parameters } -> + let parameters = + if + Protocol.Script_repr.is_unit_parameter parameters + && Entrypoint.is_default entrypoint + then [] + else + [ + Format.asprintf "%a" Entrypoint.pp entrypoint; + Format.asprintf "%a" pp_lazy_expr parameters; + ] + in aux ~kind:"Transaction" - [ - Format.asprintf "%a" pp_tz amount; - Format.asprintf "%a" Contract.pp destination; - Format.asprintf "%a" Entrypoint.pp entrypoint; - Format.asprintf "%a" pp_lazy_expr parameters; - ] + ([ + Format.asprintf "%a" pp_tz amount; + Format.asprintf "%a" Contract.pp destination; + ] + @ parameters) | Transfer_ticket { contents; ty; ticketer; amount; destination; entrypoint } -> aux ~kind:"Transfer ticket" From f412b07ee38cf1c2ac4a34e78f44adb5bd5ef3ea Mon Sep 17 00:00:00 2001 From: Ajinkya Rajandekar Date: Wed, 14 Feb 2024 16:44:25 +0000 Subject: [PATCH 35/38] Add documentation for ui_stream and ui_string files. --- app/src/globals.h | 11 +-- app/src/handle_swap.h | 5 ++ app/src/keys.h | 30 +++++++- app/src/ui_commons.h | 5 +- app/src/ui_home.c | 4 ++ app/src/ui_home.h | 5 ++ app/src/ui_settings.h | 7 ++ app/src/ui_stream.h | 162 +++++++++++++++++++++++++++++++++--------- app/src/ui_strings.c | 9 --- app/src/ui_strings.h | 109 +++++++++++++++++++--------- 10 files changed, 265 insertions(+), 82 deletions(-) diff --git a/app/src/globals.h b/app/src/globals.h index dc38e1e61..2ca386f82 100644 --- a/app/src/globals.h +++ b/app/src/globals.h @@ -44,15 +44,16 @@ #include "utils.h" #include "parser/parser_state.h" - -// Zeros out all application-specific globals and SDK-specific -// UI/exchange buffers. +/** + * @brief Zeros out all application-specific globals and SDK-specific + * UI/exchange buffers. + */ void init_globals(void); -// Toggles the persisted expert_mode setting +/// Toggles the persisted expert_mode setting void toggle_expert_mode(void); -// Toggles the persisted blindsigning setting +/// Toggles the persisted blindsigning setting void toggle_blindsigning(void); #define MAX_APDU_SIZE 235 diff --git a/app/src/handle_swap.h b/app/src/handle_swap.h index f20a3a041..c49c2c945 100644 --- a/app/src/handle_swap.h +++ b/app/src/handle_swap.h @@ -22,4 +22,9 @@ #pragma once +/** + * @brief Called to check the validity of swap params previously communicated + * by swap_copy_transaction_parameters which is called from Ledger SDK. + * + */ void swap_check_validity(void); diff --git a/app/src/keys.h b/app/src/keys.h index e5e587d66..f4e73e193 100644 --- a/app/src/keys.h +++ b/app/src/keys.h @@ -32,8 +32,11 @@ #define MAX_BIP32_LEN 10 #define SIGN_HASH_SIZE 32 -/* The values in the following enum are from the on-the-wire protocol */ - +/** + * @brief The derivation type values in the following enum are from the + * on-the-wire protocol + * + */ typedef enum { DERIVATION_TYPE_ED25519 = 0, DERIVATION_TYPE_SECP256K1 = 1, @@ -53,15 +56,38 @@ typedef struct { } bip32_path_with_curve_t; tz_exc read_bip32_path(bip32_path_t *out, const uint8_t *in, size_t in_size); + +/** + * @brief Derive public key for given derivation type address. + * + * @param public_key Public key derived is stored in this struct. + * @param derivation_type Derivation type to be used + * @param bip32_path path to derive public key from + * @return tz_exc return success/failure using error code + */ tz_exc derive_pk(cx_ecfp_public_key_t *public_key, derivation_type_t derivation_type, const bip32_path_t *bip32_path); +/** + * @brief Derive hash of public key for given derivation type address. + * + * @param hash The hash of public key, output is stored in this buffer. + * @param derivation_type Derivation type to be used. + * @param bip32_path Path to derive public key from. + * @return tz_exc return Error code + */ tz_exc derive_pkh(cx_ecfp_public_key_t *pubkey, derivation_type_t derivation_type, char *buffer, size_t len); void sign(derivation_type_t derivation_type, const bip32_path_t *path, const uint8_t *hash, size_t hashlen, uint8_t *sig, size_t *siglen); +/** + * @brief Check if derivation type is valid enum + * + * @param code Derivation type to check. + * @return validity result + */ static inline bool check_derivation_type(derivation_type_t code) { diff --git a/app/src/ui_commons.h b/app/src/ui_commons.h index 9279e6ac7..72d446c1e 100644 --- a/app/src/ui_commons.h +++ b/app/src/ui_commons.h @@ -25,7 +25,10 @@ #include #include #include - +/** + * @brief Macro to display navigation icons and set associated callback. + * + */ #define DISPLAY(elts, cb, len) \ memcpy(global.ux.bagls, elts, len * sizeof(bagl_element_t)); \ G_ux.stack[0].element_arrays[0].element_array = global.ux.bagls; \ diff --git a/app/src/ui_home.c b/app/src/ui_home.c index 0b3d60240..490af5b98 100644 --- a/app/src/ui_home.c +++ b/app/src/ui_home.c @@ -28,6 +28,10 @@ static void cb(tz_ui_cb_type_t cb_type); +/** + * @brief Callback for home screen stream. + * + * @param cb_type one of the 4 home screens (HOME, VERSION, SETTINGS, QUIT) */ static void cb(tz_ui_cb_type_t cb_type) { diff --git a/app/src/ui_home.h b/app/src/ui_home.h index 33d60b4a6..e81865094 100644 --- a/app/src/ui_home.h +++ b/app/src/ui_home.h @@ -20,4 +20,9 @@ #pragma once +/** + * @brief Initialize home screen with the screen format of ledger. + * Internally call multiple initialization functions for Settings screen and + * other relevant display buffers. + */ void ui_home_init(void); diff --git a/app/src/ui_settings.h b/app/src/ui_settings.h index 11cab28dd..ba971aae5 100644 --- a/app/src/ui_settings.h +++ b/app/src/ui_settings.h @@ -7,4 +7,11 @@ #define SETTINGS_HOME_PAGE 0 #define SETTINGS_BLINDSIGNING_PAGE 1 +/** + * @brief Initialize settings screen for nano devices. Displays status of + * Expert-mode and Blind Signing. + * + * @param page Current page to display among all the pages available under + * Settings. + */ void ui_settings_init(int16_t page); diff --git a/app/src/ui_stream.h b/app/src/ui_stream.h index 564a47f44..24acd3a2c 100644 --- a/app/src/ui_stream.h +++ b/app/src/ui_stream.h @@ -46,9 +46,11 @@ #include "ui_strings.h" #ifdef TARGET_NANOS -#define TZ_UI_STREAM_HISTORY_SCREENS 5 +#define TZ_UI_STREAM_HISTORY_SCREENS \ + 5 /// Max number of screens in history for nanos #else -#define TZ_UI_STREAM_HISTORY_SCREENS 8 +#define TZ_UI_STREAM_HISTORY_SCREENS \ + 8 /// Max number of screens in history for nanos2/nanox. #endif // TARGET_NANOS #define TZ_UI_STREAM_TITLE_WIDTH TZ_SCREEN_WITDH_BETWEEN_ICONS_BOLD_11PX @@ -64,10 +66,10 @@ #define TZ_UI_STREAM_CONTENTS_SIZE \ (TZ_UI_STREAM_CONTENTS_WIDTH * TZ_UI_STREAM_CONTENTS_LINES) -/* - * In the following structure, "cb_type" is passed to our callback and - * it can be used to determine which screen was displayed when both - * buttons were pressed. +/** + * @brief Following #define's specify different "cb_types" which are passed to + * our callback and it can be used to determine which screen was displayed + * when both buttons were pressed. * * If TZ_UI_STREAM_SCREEN_NOCB is specified, no callback will be called * when both buttons are pressed. @@ -90,8 +92,9 @@ typedef uint8_t tz_ui_cb_type_t; #define TZ_UI_STREAM_CB_ACCEPT 0xFFu #define TZ_UI_LAYOUT_HOME_MASK 0x80u + /** - * Layout type: + * @brief Layout type enum * BNP - refers to Bold Title, normal text/picture below the title. * BP - refers to Bold tile and picture below the title(optional). * NP - Normal text and picture below the text(optional) @@ -111,10 +114,9 @@ typedef enum : uint8_t { TZ_UI_LAYOUT_HOME_NP = (0x07 | TZ_UI_LAYOUT_HOME_MASK) } tz_ui_layout_type_t; -/* - * The icons we used are generalised to allow for seamless Stax support +/** + * @brief The icons we used are generalised to allow for seamless Stax support */ - typedef uint8_t tz_ui_icon_t; #define TZ_UI_ICON_NONE 0x00 #define TZ_UI_ICON_TICK 0x01 @@ -124,61 +126,155 @@ typedef uint8_t tz_ui_icon_t; #define TZ_UI_ICON_BACK 0x05 #define TZ_UI_ICON_EYE 0x06 +/** + * @brief Represents a single screen's content and formatting for a ledger + * device. + * + */ typedef struct { - tz_ui_cb_type_t cb_type; + tz_ui_cb_type_t + cb_type; /// call back type for actions taken on this screen. #ifdef HAVE_BAGL - tz_ui_icon_t icon; - tz_ui_layout_type_t layout_type; - char *title; - char *body[TZ_UI_STREAM_CONTENTS_LINES]; + tz_ui_icon_t icon; /// Icon to display on the screen. + tz_ui_layout_type_t + layout_type; /// Layout type for the screen. CAN BP, BNP, NP, PB or + /// HOME_X where X can be one of the BP, BNP, PB. + char *title; /// Title to display on the screen. + char *body[TZ_UI_STREAM_CONTENTS_LINES]; /// Body to display on the + /// screen (Below title). #else - nbgl_layoutTagValue_t pairs[NB_MAX_DISPLAYED_PAIRS_IN_REVIEW]; - uint8_t nb_pairs; + nbgl_layoutTagValue_t + pairs[NB_MAX_DISPLAYED_PAIRS_IN_REVIEW]; /// Title-value pairs to be + /// displayed on stax + /// screen, Max 4 pairs can + /// be displayed on one + /// screen in stax. + uint8_t nb_pairs; /// Number of pairs to be displayed on the stax screen. #endif } tz_ui_stream_screen_t; #ifdef HAVE_NBGL +/** + * @brief Holds list of title-value pairs for the current screen on stax. + * + */ typedef struct { nbgl_layoutTagValueList_t list; } tz_ui_stream_display_t; #endif // HAVE_NBGL +/** + * @brief Holds data for current and all the history screens. + * + */ typedef struct { void (*cb)(tz_ui_cb_type_t cb_type); - tz_ui_stream_screen_t screens[TZ_UI_STREAM_HISTORY_SCREENS]; - tz_ui_strings_t strings; - int16_t current; - int16_t total; - int16_t last; - bool full; - bool pressed_right; + tz_ui_stream_screen_t + screens[TZ_UI_STREAM_HISTORY_SCREENS]; // array containing info of + // all screens. + tz_ui_strings_t strings; // Ring buffer containing text data to be + // displayed on screen. + int16_t current; // index of current screen. + int16_t total; // total number of screens. + int16_t last; // index of last screen. + bool full; // true if history is full. + bool pressed_right; // true if right button was pressed. #ifdef HAVE_NBGL - tz_ui_stream_display_t current_screen; - char verify_address[TZ_BASE58CHECK_BUFFER_SIZE(20, 3)]; - nbgl_callback_t stream_cb; -#endif // HAVE_NBGL + tz_ui_stream_display_t + current_screen; // current screen's title-value pairs. + char verify_address[TZ_BASE58CHECK_BUFFER_SIZE( + 20, 3)]; // Holds the public key.. + nbgl_callback_t + stream_cb; // callback to be called when new screen is needed. +#endif // HAVE_NBGL } tz_ui_stream_t; void tz_ui_stream_init(void (*cb)(tz_ui_cb_type_t cb_type)); -/* Push title & content to screen - * + +/** + * @brief Push title & content to a single screen * content may not always fit on screen entirely - returns total * bytes of content written. + * + * @param cb_type callback type for the screen being pushed. + * @param title title to be displayed + * @param value text to be displayed. + * @param layout_type Layout type, can be one of BP, BNP, NP, HOME_PB, ... and + * so on. + * @param icon icon to be displayed on the screen. + * @return size_t size of content written on the screen.(for ex. when value + * is too large to fit on one screen, only part of it is written and rest is + * displayed on next screen.) */ size_t tz_ui_stream_push(tz_ui_cb_type_t cb_type, const char *title, const char *value, tz_ui_layout_type_t layout_type, tz_ui_icon_t icon); + +/** + * @brief internal implementation of tz_ui_stream_push, implemented + * differently for stax and nano* devices. + * + * @param cb_type callback type for the screen being pushed. + * @param title title to be displayed + * @param value text to be displayed. + * @param max max chars of value to be displayed. (default: -1) + * @param layout_type Layout type, can be one of BP, BNP, NP, HOME_PB, ... and + * so on. + * @param icon icon to be displayed on the screen. + * @return size_t size of content written on the screen.(for ex. when value + * is too large to fit on one screen, only part of it is written and rest is + * displayed on next screen.) + */ size_t tz_ui_stream_pushl(tz_ui_cb_type_t cb_type, const char *title, const char *value, ssize_t max, tz_ui_layout_type_t layout_type, tz_ui_icon_t icon); + +/** + * @brief Push title- value pair, internally calls tz_ui_stream_push multiple + * times so that entire value is pushed, even if it takes multiple screens. + * + * @param cb_type callback type + * @param title Title to be displayed on the screen + * @param value text to be displayed on the screen + * @param layout_type Layout type + * @param icon Icon to be displayed on the screen + * @return size_t returns total number of characters written on the screen. + */ size_t tz_ui_stream_push_all(tz_ui_cb_type_t cb_type, const char *title, const char *value, tz_ui_layout_type_t layout_type, tz_ui_icon_t icon); -void tz_ui_stream_close(void); -void tz_ui_stream(void); -void tz_ui_stream_start(void); + +/** + * @brief Indicates the stream is closed. Can not close it again. + * + */ +void tz_ui_stream_close(void); + +/** + * @brief Redisplay the screen, called when additional data is pushed to the + * screen or when user presses buttons. + * + */ +void tz_ui_stream(void); + +/** + * @brief Start display of contents stored in ring buffer. + * + */ +void tz_ui_stream_start(void); + +/** + * @brief Get the callback type for current screen. + * + * @return tz_ui_cb_type_t + */ tz_ui_cb_type_t tz_ui_stream_get_cb_type(void); + #ifdef HAVE_NBGL +/** + * @brief Reject confirmation screen. + * + */ void tz_reject_ui(void); #endif diff --git a/app/src/ui_strings.c b/app/src/ui_strings.c index 11bd52f68..fcf14986d 100644 --- a/app/src/ui_strings.c +++ b/app/src/ui_strings.c @@ -134,10 +134,6 @@ ui_strings_can_fit(size_t len, bool *can_fit) TZ_POSTAMBLE; } -/* @param in: ptr to char[] to copy into the buffer - @param in_len: number of of chars to copy. in_len <= strlen(in) - @param out: will be set to the start of the char[] in the buffer -*/ void ui_strings_push(const char *in, size_t len, char **out) { @@ -265,11 +261,6 @@ ui_strings_drop_last(char **in) PRINT_STRINGS; } -/* Append as much as possible from str to the last string in the buffer. - * This WILL NOT move `last` in the buffer. - * - * @param out: the start of the copied chars in the buffer. - */ size_t ui_strings_append_last(const char *str, size_t max, char **out) { diff --git a/app/src/ui_strings.h b/app/src/ui_strings.h index 6f309a44b..c29205ff5 100644 --- a/app/src/ui_strings.h +++ b/app/src/ui_strings.h @@ -1,4 +1,4 @@ -/* Tezos Ledger application - Dynamic UI to display a stream of pages +/** Tezos Ledger application - Dynamic UI to display a stream of pages Copyright 2023 TriliTech @@ -16,44 +16,89 @@ #pragma once -/* This implements a multi-page screen, allowing to display a - potentially infinite number of screens, keeping a bounded history. - The user can query new screens using the right button, and go back - a few screens using the left button (until history limit is - reached). - - When a new page is needed, the display will call the `refill` - callback, which in turn can call `tz_ui_stream_push` to add a new - page. When the last page is reached, `tz_ui_stream_close` should be - called, and the two final special pages to `accept` and `reject` - the operation are pushed. The user can trigger the `accept` and - `reject` callbacks by pressing both buttons while there pages are - displayed. - - It is also possible to use this display engine for non streamed - data by pushing a precomputed series of pages with - `tz_ui_stream_push`, calling `tz_ui_stream_close`, and launching - with a `refill` callback set to NULL. */ +/** + * @brief This file implements ring buffer to store the strings to be + * displayed on the ledger screen. The ring buffer is fixed in size and + * implemented as fixed size C char array. The ring properties are implemented + * logically using push, drop etc. When a new element is added after checking + * that enough space in buffer is present, otherwise the oldest element in the + * buffer is removed. (We can also remove the newest element if desired.) + * + */ #ifdef TARGET_NANOS -#define BUFF_LEN 128 +#define BUFF_LEN 128 /// Ring buffer length of nanos #elif defined(HAVE_BAGL) -#define BUFF_LEN 256 +#define BUFF_LEN 256 /// Ring buffer length for nanos2/nanox #else -#define BUFF_LEN 512 +#define BUFF_LEN 512 /// Ring buffer length for stax #endif +/** + * @brief This struct represents the ring buffer to store title-value pairs to + * be displayed on the ledger device screens. + * + * + */ typedef struct { - char buffer[BUFF_LEN]; - char *start; - char *end; - char *internal_end; - size_t count; + char buffer[BUFF_LEN]; /// Stores title-value pairs + char *start; /// Logical start of the buffer. This is the oldest element + /// in the buffer and first character of that string. + char + *end; /// Logical end of the buffer. This is at the end of the newest + /// element in the buffer, after the null terminator character. + char *internal_end; /// Actual end of the buffer after which no data is + /// present. 0 <= internal_end < BUFF_LEN + size_t count; /// Number of strings stored in the buffer } tz_ui_strings_t; -void ui_strings_init(void); -void ui_strings_push(const char *str, size_t len, char **out); -void ui_strings_drop(char **str); -void ui_strings_drop_last(char **str); -void ui_strings_can_fit(size_t len, bool *can_fit); +/** + * @brief Resets ring buffer and set start and end to BUFF_START + */ +void ui_strings_init(void); + +/** + * @brief Push a new string to the ring buffer. + * Throws error if len can not be accomodated in the empty space of + * ring buffer. Therefore, it is important to call ui_strings_can_fit before + * pushing the string on the buffer. + * + * @param str: ptr to string to copy into the buffer + * @param len: number of of chars to copy. len <= strlen(str) + * @param out: will be set to the start of the string in the buffer + */ +void ui_strings_push(const char *str, size_t len, char **out); +/** + * @brief Drop the logical first string from the buffer, which is pointed by + * 'start'. + * + * @param str pointer to 'start' pointer of the buffer. + */ +void ui_strings_drop(char **str); +/** + * @brief Drop the logical last string in the ring buffer, which ends with + * 'end' pointer. + * + * @param str Pointer to start pointer of last string in the buffer. + */ +void ui_strings_drop_last(char **str); +/** + * @brief Checks if the ring buffer can fit the string of length len, without + * deleting any existing strings. + * + * @param len Length of string. + * @param can_fit result of the check, true if string can fit, false + * otherwise. + */ +void ui_strings_can_fit(size_t len, bool *can_fit); +/** + * @brief Append characters from input string to the last string in the + * buffer. Exclude the null termination character. + * + * @param str Input string + * @param max maximum number of characters to append. + * @param out pointer to the end of the resultant string in buffer (Null + * terminator) = s->end - 1 + * @return size_t Number of chars appended. + */ size_t ui_strings_append_last(const char *str, size_t max, char **out); From aa8e8450879822d87c942b1d52ee3c5488f17c89 Mon Sep 17 00:00:00 2001 From: Ajinkya Rajandekar Date: Tue, 20 Feb 2024 15:05:12 +0000 Subject: [PATCH 36/38] Document data structures used --- app/src/apdu.h | 20 ++++++++++++++--- app/src/apdu_sign.h | 39 +++++++++++++++++++++++++--------- app/src/globals.h | 52 +++++++++++++++++++++++++++++---------------- 3 files changed, 80 insertions(+), 31 deletions(-) diff --git a/app/src/apdu.h b/app/src/apdu.h index 467567f78..32d61c109 100644 --- a/app/src/apdu.h +++ b/app/src/apdu.h @@ -83,8 +83,22 @@ typedef void(tz_handler)(command_t *cmd); typedef tz_handler *tz_handler_t; -tz_handler handle_unimplemented; -tz_handler handle_apdu_version; -tz_handler handle_apdu_git; +tz_handler handle_unimplemented; /// handler for unknown commands +tz_handler handle_apdu_version; /// handle version enquiry apdu +tz_handler handle_apdu_git; /// handle git commit enquiry apdu +/** + * @brief Function to handle apdu request for public key. The public key is + * derived only once and stored in the RAM, in order to avoid repeated + * derivation calculations. This function can be called with or without + * prompt. + * + */ tz_handler handle_apdu_get_public_key; +/** + * @brief Parse the received command and prompt user for appropriate action. + * Triggers blindsigning and/or expert mode workflows based on transaction + * involved. Stream based parser helps decode arbitararily large transaction, + * screen by screen. + * + */ tz_handler handle_apdu_sign; diff --git a/app/src/apdu_sign.h b/app/src/apdu_sign.h index 0880a6bed..1b6dbd84c 100644 --- a/app/src/apdu_sign.h +++ b/app/src/apdu_sign.h @@ -29,38 +29,57 @@ #include "keys.h" #include "parser/parser_state.h" +/** + * @brief Save hash of the transaction to be signed. + * + */ typedef struct { - cx_blake2b_t state; - uint8_t final_hash[SIGN_HASH_SIZE]; + cx_blake2b_t state; /// Ledger-sdk blake2b state containing hash header + /// and blake2b state info. + uint8_t final_hash[SIGN_HASH_SIZE]; /// Final hash of the transaction. } apdu_hash_state_t; +/** + * @brief Represents state of sign transaction. + * + */ typedef enum { - SIGN_ST_IDLE, - SIGN_ST_WAIT_DATA, - SIGN_ST_WAIT_USER_INPUT + SIGN_ST_IDLE, /// IDLE + SIGN_ST_WAIT_DATA, /// Waiting for more data from apdu interface + SIGN_ST_WAIT_USER_INPUT /// Waiting for user action } sign_step_t; +/** + * @brief Steps in a blind signing of a transaction. + * + */ typedef enum { BLINDSIGN_ST_OPERATION, BLINDSIGN_ST_HASH, BLINDSIGN_ST_ACCEPT_REJECT, } blindsign_step_t; +/** + * @brief Struct to track state/info about current sign operation. + * + */ typedef struct { - uint8_t packet_index; + uint8_t packet_index; /// Index of the packet currently being processed. - sign_step_t step; - bool return_hash; - bool received_last_msg; - uint8_t tag; + sign_step_t step; /// Current step of the sign operation. + bool return_hash; /// Whether to return the hash of the transaction. + bool received_last_msg; /// Whether the last message has been received. + uint8_t tag; /// Type of tezos operation to sign. union { + /// @brief clear signing state info. struct { size_t total_length; tz_parser_state parser_state; uint8_t last_field_index; bool received_msg; } clear; + /// @brief blindsigning state info. struct { blindsign_step_t step; } blind; diff --git a/app/src/globals.h b/app/src/globals.h index 2ca386f82..7d4b0846f 100644 --- a/app/src/globals.h +++ b/app/src/globals.h @@ -58,7 +58,10 @@ void toggle_blindsigning(void); #define MAX_APDU_SIZE 235 #define MAX_SIGNATURE_SIZE 100 - +/** + * @brief Home screen pages in order + * + */ typedef enum { #ifdef HAVE_BAGL SCREEN_HOME = 0, @@ -71,24 +74,33 @@ typedef enum { SCREEN_QUIT, } screen_t; +/** + * @brief State of the app + * + */ typedef enum { - ST_IDLE, - ST_CLEAR_SIGN, - ST_BLIND_SIGN, - ST_PROMPT, - ST_SWAP_SIGN, - ST_ERROR + ST_IDLE, /// Idle state + ST_CLEAR_SIGN, /// Clearsigning an operation + ST_BLIND_SIGN, /// blindisigning an operation + ST_PROMPT, /// Waiting for user prompt + ST_SWAP_SIGN, /// Performing swap operations + ST_ERROR /// In error state. } main_step_t; +/** + * @brief Global structure holding state of operations and buffer of the data + * to be processed. + * + */ typedef struct { /* State */ - main_step_t step; - tz_ui_stream_t stream; - bip32_path_with_curve_t path_with_curve; + main_step_t step; /// Current operational state of app. + tz_ui_stream_t stream; /// UX and display related information + bip32_path_with_curve_t path_with_curve; /// Derivation path union { struct { - apdu_hash_state_t hash; - apdu_sign_state_t sign; + apdu_hash_state_t hash; /// Transaction hash + apdu_sign_state_t sign; /// state of sign operation. } apdu; /** Warning: Use this pubkey only when apdu-hash/sign * is not being used. @@ -97,19 +109,20 @@ typedef struct { * */ cx_ecfp_public_key_t pubkey; } keys; - char line_buf[TZ_UI_STREAM_CONTENTS_SIZE + 1]; + char line_buf[TZ_UI_STREAM_CONTENTS_SIZE + + 1]; /// Buffer to store incoming data. #ifdef HAVE_BAGL struct { bagl_element_t bagls[5 + TZ_SCREEN_LINES_11PX]; - } ux; + } ux; /// Config for history screens for nano devices. #endif } globals_t; /* Settings */ typedef struct { - bool blindsigning; - bool expert_mode; -} settings_t; + bool blindsigning; /// enable blindsigning + bool expert_mode; /// enable expert mode +} settings_t; /// Special settings available in the app. extern globals_t global; @@ -117,5 +130,8 @@ extern const settings_t N_settings_real; #define N_settings (*(volatile settings_t *)PIC(&N_settings_real)) extern unsigned int app_stack_canary; // From SDK - +/** + * @brief IO buffer. + * + */ extern unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; From e944e12b5bdb2b955bae7c50cb511ee31f216900 Mon Sep 17 00:00:00 2001 From: Ajinkya Rajandekar Date: Fri, 15 Mar 2024 12:45:53 +0000 Subject: [PATCH 37/38] tests: Fix scripts/run_tests.sh to run stax tests. - script to run tests needs to be changed due to updated docker container - change readme to reflect new way of running the tests. --- README.md | 29 +++++++++++------------------ scripts/run_app.sh | 10 ++-------- 2 files changed, 13 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 1964b32aa..8c814585a 100644 --- a/README.md +++ b/README.md @@ -175,35 +175,28 @@ re-run the test normally afterwards, to ensure the snapshots have been set corre #### Preparation -First, start a container for running individual tests: +First start the app in a terminal using following command: ```sh -docker run --rm -it --entrypoint /bin/bash -v $(pwd):/app --network host \ - ledger-app-tezos-integration-tests - -cd /app/tests/integration/stax -export PORT=5000 - -git config --global --add safe.directory /app -. ../app_vars.sh +make app_stax_dbg.tgz +TARGET=stax ./scripts/run_app.sh ``` +You should be able to see the stax display on your screen. -Before running the test, start the app in a separate container (as each test will quit the app): +Open a new terminal for running tests, run following commands to setup test environment ```sh -make app_stax_dbg.tgz - -TARGET=stax ./scripts/run_app.sh +$ docker exec -it ledger-app-tezos-integration-tests bash; +$ export PORT=5000 +$ . tests/integration/app_vars.sh ``` -You can view/interact with the app using a vnc client on port `41000`. - #### Running -You can run an individual test from the test container. You should see the app progress on the vnc viewer. +You can run an individual test from the test container. You should see the app progress on the display. ```sh -./.py +./tests/integration/stax/.py ``` #### Setting goldimages @@ -211,7 +204,7 @@ You can run an individual test from the test container. You should see the app p You can reset/set goldimages using the following: ```sh -GOLDEN=1 ./.py +GOLDEN=1 ./tests/integration/stax/.py ``` If you are resetting goldimages for multiple tests, you can also use `export NOQUIT=1` to keep the app diff --git a/scripts/run_app.sh b/scripts/run_app.sh index 7f0c67521..566cd0e80 100755 --- a/scripts/run_app.sh +++ b/scripts/run_app.sh @@ -20,11 +20,5 @@ seed="zebra`for i in $(seq 1 23) ; do echo -n ' zebra' ; done`" set -e - -docker run --rm -it -v "$(realpath .):/app" \ - --entrypoint=/bin/sh ledger-app-tezos-integration-tests \ - -c " apk add gmp-dev curl jq libsodium-dev git xxd procps libvncserver; \ - python3 -m venv tezos_test_env --system-site-package; \ - source ./tezos_test_env/bin/activate; \ - python3 -m pip install -r tests/requirements.txt -q; - python3 -m speculos --display=headless --seed \"$seed\" -m $TARGET app/bin/app.elf" +docker run --rm -it --user $(id -u):$(id -g) --privileged -e DISPLAY=$DISPLAY -v '/dev/bus/usb:/dev/bus/usb' -v '/tmp/.X11-unix:/tmp/.X11-unix' -v $(pwd):/app --entrypoint=/bin/bash --name ledger-app-tezos-integration-tests ledger-app-tezos-integration-tests -c \ +"speculos --model $TARGET app/bin/app.elf" From 935500df5195e592e5e7fff2f8e95fccc16db5ac Mon Sep 17 00:00:00 2001 From: Ajinkya Rajandekar Date: Fri, 15 Mar 2024 12:54:55 +0000 Subject: [PATCH 38/38] Update splash screen for blindsign enabled due to SDK change --- .../blindsign_enabled.png | Bin 5208 -> 5656 bytes .../signing_successful.png | Bin 5467 -> 6108 bytes .../blindsign_enabled.png | Bin 5208 -> 5656 bytes .../blindsign_enabled.png | Bin 5208 -> 5656 bytes .../signing_successful.png | Bin 5467 -> 6108 bytes .../enabled_expert_mode.png | Bin 5065 -> 5707 bytes .../signing_successful.png | Bin 5467 -> 6108 bytes .../enabled_expert_mode.png | Bin 5065 -> 5707 bytes .../enabled_expert_mode.png | Bin 5065 -> 5707 bytes .../test_provide_pk/address_verified.png | Bin 4615 -> 5035 bytes .../enabled_expert_mode.png | Bin 5065 -> 5707 bytes .../signing_successful.png | Bin 5467 -> 6108 bytes .../enabled_expert_mode.png | Bin 5065 -> 5707 bytes .../test_sign_transfer/signing_successful.png | Bin 5467 -> 6108 bytes .../enabled_expert_mode.png | Bin 5065 -> 5707 bytes .../signing_successful.png | Bin 5467 -> 6108 bytes 16 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/integration/stax/snapshots/test_blindsign_too_deep/blindsign_enabled.png b/tests/integration/stax/snapshots/test_blindsign_too_deep/blindsign_enabled.png index 279acd54db7568993145eaa08b3ba55c1c567e5f..9d9cdb4251b1a4d39802aae42647cfac1e3394ae 100644 GIT binary patch delta 3769 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 delta 3206 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 W57z9=w~$rf`uSMM(Z(YQ*Z&KmHGSIv diff --git a/tests/integration/stax/snapshots/test_blindsign_too_deep_rejections/blindsign_enabled.png b/tests/integration/stax/snapshots/test_blindsign_too_deep_rejections/blindsign_enabled.png index 279acd54db7568993145eaa08b3ba55c1c567e5f..9d9cdb4251b1a4d39802aae42647cfac1e3394ae 100644 GIT binary patch delta 3769 zcmW+(d0bNY7O%;d`7*7ZOPNc(G0j}+<-S2?MVs12E+L|sTeq_l;R}8v7hq@8VO;y~rA(Zev_VCS#Ykv(>^T7nqukGVX4w2Mzc6xL4h~F=;g+ zZ0PO)Ot7G)Gj>Jv?9cyLZqxB@2sqTwznaNVB5HyCSgwGzko&_2%);N`l2g?+jT@KT z!Rq@~2$G3^ud3--vgus!j(*dKQ@1it?ejp2ub4ZT`V?392{R%X2e;{%I-@6DoA@VG zaCQ-emDdotsNu`Y+x1D>{<|zRoY14)Rb`9pK2K?%3QifmR`1V=s#~^<@lwIXJBF43 zq+J$Hbv% z`l_W7YT43=?XKVTOVBo*fR-g==1R^z6&%^W#y8?r{Ldyvzt|!wK3V55J2YP8T=l73 z^b!dc_AdUAQK%hLwd!*&D)yuYoZ=Tunnp%2E)68iv=p*>FqU}13osFRVo>w z-)$z2*#w^bpw@o?4+`3A`6k(&%=l4&POVbr= znEnt-#ji&V^SnvyVVeEKRPZs!wq7WpNN>df6?7bUr{A_XT$XTj&jpiwcWAh~k&zL$ z)Gw>+8+gQz&C+1IA_KH11OgfT;ZUOfSF+rWrkA~O!UHSJ$R-CTJ|y6-To#JOy~g_Ox)KU=_m&POd9qc;?L>AYkH@>gsD} zQOwSTo{}SKq(7z>31SN!+>($=r3PulO(Sz8m!xG(LBslMS-*SpxQNL-pYJ<4+*?N% z%)9G7It?Z(VNQA>kw`9=`%$T%*URv_YN5%@5oz9_Z8j@?#}1u~aj-B+9v3BbAn{6} zNEAsOXKVTi@5s3TFNB&EV~QDg`ZsgmrEGeub-otiT8UL_%sz2n)Kn7S0kl+-V!dqKgTM`~2g!D|-6)NUO zn(odAMI0+gZ|&u82v|*hgK_0|I)*%t*le4_pzF{b$V7SE%E5Bso=2y3zb@UjGsjzt z#o`?Rci#L8R_AHYWQ>cU=GLtIYlQ)a$4bGVAqCd@8YD_-1YEOq;`gLZ7IVi5o36G4 z0%M@k;W(ze8HYmt-yhT|S4D9FOY(c!D=o4(~A!VDQ66ms5XhMW(j@1p;U&vevrJ zU}0r%aq08EACdtZ}8w!!O^T zw@ibs{-Tu=Suv`Zi*-4a?DIm248&U*pfFR!ju@G>yq&+yKY_hO0vd~KZaL^fpisQh zvBcBJ&=8|kaDE)}i5Czl%TPn_Jzr{*(5-G~*0M5f^&Vm14^LO{TS9=ve~(2pwLM98 zRLAzjnJp?5m^odmeVz9tGMUV57RLy3D$&W3E-iiTo2s5BF9-BKS8bMf9&rLc#l<=e zU-DRVbhN!>>0F}OA}9(2RNg}P(Si$hMIMPn_?IXu__Sg;%tp_D^6w!i)}TXNsk$2B z>>9fBwfvPehn^0+)rQ%R2_*?m;8d3l{3`zmXF5hcFHbfb7R5D5=FWg)DEVoLtq3bT zlM!^uas=I>kO;>>yq(HxFHW^$gCi8-+@VmrY0p>fuS2eB5p?meXSz6s=o4jYmYZ}? zCYN`N<4J=72`&&wXJ==WT@g6-S3`FK9Z0eyO*>5q363wH`F={ZIllxMxHC@v3T1Gt zY>*kk8ENg#?|buuIxZSdCc!QbxKxje*Kn0ViK7=Y#sYCWbOQ99CYI+q^ejyn_UknUP1&yyo)X<^Z~SKV3@P z&KQF(^w7Qb+SM3(fd9FKr4gcG%2#?OqmzG9bV6=Pn!z_?Qf|5@)BN+b(W(Cxo;8&t zgHX;BbBS9IJV8m&RQZV|Fnp&KW_pxp`f*j^+Em@jT%pf<#gma)jgntMW)P6S&3+EA z_j#6&Gg+*ePeK7S&K!H|fn3nP11WJ#&jKnS2JEQF4y5;>OW3*}Jn?u$?qbcDaDLyp zfs~gWOPqEZr*?WLX7Ov(Vq)we(TG8!Z5{s0&mhb^jnOEoxs^S719(Lge}EEYd9;>~ z>p}G?Xf$z@C?hD|Ej@h9e;T&|%f#I(Sm1S*0DZxiYairXISA4hk@Ahd=c0t4RO6-P z5RRgK4knE0XB$Ije!+O8w=E%-XT1eA-w7O>gtA^9bsG4uVGMj7?S>OoX`)lQ)&GMa7HFqEH5t? zjByWVFjFt=NJclg-T(Wd>%qv~dPK}GC+IwSx4HJXsM*2L8!@u-Vx}8^W2egY`-?1m z_VJzhPd1wae`w0y$%^2J@9!obk-SR}TRm!2%H2PbvPu)COsHhY(+oL=uHfG%DE8m= z{3DV#*gkOe;YR1%wCsEk zUPZi;3{?pB`R?XEh=Rt+S*jXifPUa|WbWw-QU>s8$uVaz*Wl4<+cGkPT4&sD34=N- zhQ1QlhX}Qh**R8ddM!A~XiiLhGq8C)LIKKAj+80YY#>TnL;$_b51e06ENtI#{GB@G^IFDzG-6l&N<93Vy@-_Q&we^w*HJLz(K<6 z)E`9E(LK-1yQ~3I-v>lWx6%3(Z+}QE!ti&Sj%GdGmxa=+AB7Ou_SGfFQ7%yO;8i6Xjhxbn(K(*T@;!M_pG- zwdgzEYSHKA6#ndTI;2duw=QSuJ)u-khp=KwP2UF3N%D?l3vFXA(r|T}a4}PqDW?oPEOs_X6%!-Ft#6FJQ-W zY&fI@>sxa{=Q)^#iLxD+Ch+)yT5JB~G1go{D*}@mH|OZImwKcC&e7^>vn(mTeJ4v;wX=z>~4cmm0Hb8N4KqwUAdEnni@{<}yP;4Wb&^A#p%dWT)a{Xtb5D%05 z1~U(?ZpXOjBV`c8A~fw|#dJqAS$kk+xuM9-G}qhfWAc0XxY{Vk?;mE~crA=Zh=woK z2fN;bE+4aZ ze1PIm`hpvfWF|#lgHzptzOX0}3UBofS7NbPJ`Mzij_LpLidWe+x#;WymeYUxafx29NwPxAm2aSt!{x=ju)L1d>76V2^_}0oO})d ztGMKtM=KG)C4&2WKQWHMpPQ@lBhACj*O4!>sg;O$g9g7E&ypf7F%HsbT-|9fGaD-a zMH1ALiB5;WAf+7)$VQ5?D-{d*eczcI&4yG!Atfksv8x}bM|)(uB6RMtAKMndic=+- zlQAuS-i}gkx<($`r@nPrim5hL^t-+aPc0}UT5e*%D yaoONZQU7$(i&`y1B4K&+#4+poCm~yO6h=vV)C=#LKaJi5+SyZ{Cu>ijGXD>uq%aZy delta 3206 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 delta 3206 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 W57z9=w~$rf`uSMM(Z(YQ*Z&KmHGSIv diff --git a/tests/integration/stax/snapshots/test_blindsign_valid/enabled_expert_mode.png b/tests/integration/stax/snapshots/test_blindsign_valid/enabled_expert_mode.png index c9ef229fa7be8fd071a271ce31ba27c48213c36b..959148f0416db262a1cf4762efb7558767926929 100644 GIT binary patch delta 3820 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 W57z9=w~$rf`uSMM(Z(YQ*Z&KmHGSIv diff --git a/tests/integration/stax/snapshots/test_expert_mode_rejections/enabled_expert_mode.png b/tests/integration/stax/snapshots/test_expert_mode_rejections/enabled_expert_mode.png index c9ef229fa7be8fd071a271ce31ba27c48213c36b..959148f0416db262a1cf4762efb7558767926929 100644 GIT binary patch delta 3820 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 diff --git a/tests/integration/stax/snapshots/test_sign_execute_outbox_messages/enabled_expert_mode.png b/tests/integration/stax/snapshots/test_sign_execute_outbox_messages/enabled_expert_mode.png index c9ef229fa7be8fd071a271ce31ba27c48213c36b..959148f0416db262a1cf4762efb7558767926929 100644 GIT binary patch delta 3820 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 W57z9=w~$rf`uSMM(Z(YQ*Z&KmHGSIv diff --git a/tests/integration/stax/snapshots/test_sign_transfer/enabled_expert_mode.png b/tests/integration/stax/snapshots/test_sign_transfer/enabled_expert_mode.png index c9ef229fa7be8fd071a271ce31ba27c48213c36b..959148f0416db262a1cf4762efb7558767926929 100644 GIT binary patch delta 3820 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 W57z9=w~$rf`uSMM(Z(YQ*Z&KmHGSIv diff --git a/tests/integration/stax/snapshots/test_sign_transfer_without_hash/enabled_expert_mode.png b/tests/integration/stax/snapshots/test_sign_transfer_without_hash/enabled_expert_mode.png index c9ef229fa7be8fd071a271ce31ba27c48213c36b..959148f0416db262a1cf4762efb7558767926929 100644 GIT binary patch delta 3820 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 W57z9=w~$rf`uSMM(Z(YQ*Z&KmHGSIv