From adb6f67e19db9ba13a6c4dcf5d41c9dd5da8580e Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Mon, 5 Dec 2022 18:34:14 +0100 Subject: [PATCH 01/85] Removed old blue-specific glyphs & icons --- glyphs/badge_transaction.gif | Bin 339 -> 0 bytes glyphs/blue_badge_akroma.gif | Bin 727 -> 0 bytes glyphs/blue_badge_atheios.gif | Bin 347 -> 0 bytes glyphs/blue_badge_callisto.gif | Bin 560 -> 0 bytes glyphs/blue_badge_dexon.gif | Bin 823 -> 0 bytes glyphs/blue_badge_ellaism.gif | Bin 523 -> 0 bytes glyphs/blue_badge_eosclassic.gif | Bin 430 -> 0 bytes glyphs/blue_badge_ether1.gif | Bin 347 -> 0 bytes glyphs/blue_badge_ethereum.gif | Bin 347 -> 0 bytes glyphs/blue_badge_ethereum_classic.gif | Bin 347 -> 0 bytes glyphs/blue_badge_ethergem.gif | Bin 769 -> 0 bytes glyphs/blue_badge_ethersocial.gif | Bin 595 -> 0 bytes glyphs/blue_badge_expanse.gif | Bin 1477 -> 0 bytes glyphs/blue_badge_gochain.gif | Bin 365 -> 0 bytes glyphs/blue_badge_hpb.gif | Bin 434 -> 0 bytes glyphs/blue_badge_mix.gif | Bin 347 -> 0 bytes glyphs/blue_badge_musicoin.gif | Bin 1144 -> 0 bytes glyphs/blue_badge_pirl.gif | Bin 372 -> 0 bytes glyphs/blue_badge_poa.gif | Bin 679 -> 0 bytes glyphs/blue_badge_reosc.gif | Bin 347 -> 0 bytes glyphs/blue_badge_ropsten.gif | Bin 347 -> 0 bytes glyphs/blue_badge_rsk.gif | Bin 347 -> 0 bytes glyphs/blue_badge_rsk_testnet.gif | Bin 347 -> 0 bytes glyphs/blue_badge_thundercore.gif | Bin 271 -> 0 bytes glyphs/blue_badge_tomochain.gif | Bin 579 -> 0 bytes glyphs/blue_badge_ubiq.gif | Bin 386 -> 0 bytes glyphs/blue_badge_wanchain.gif | Bin 592 -> 0 bytes glyphs/blue_badge_webchain.gif | Bin 791 -> 0 bytes glyphs/icon_toggle_reset.gif | Bin 225 -> 0 bytes glyphs/icon_toggle_set.gif | Bin 227 -> 0 bytes glyphs/nanos_badge_akroma.gif | Bin 1331 -> 0 bytes glyphs/nanos_badge_artis_sigma1.gif | Bin 118 -> 0 bytes glyphs/nanos_badge_artis_tau1.gif | Bin 117 -> 0 bytes glyphs/nanos_badge_atheios.gif | Bin 56 -> 0 bytes glyphs/nanos_badge_callisto.gif | Bin 91 -> 0 bytes glyphs/nanos_badge_dexon.gif | Bin 1217 -> 0 bytes glyphs/nanos_badge_ellaism.gif | Bin 854 -> 0 bytes glyphs/nanos_badge_ether1.gif | Bin 1132 -> 0 bytes glyphs/nanos_badge_ethereum.gif | Bin 1132 -> 0 bytes glyphs/nanos_badge_ethereum_classic.gif | Bin 1132 -> 0 bytes glyphs/nanos_badge_ethergem.gif | Bin 71 -> 0 bytes glyphs/nanos_badge_ethersocial.gif | Bin 856 -> 0 bytes glyphs/nanos_badge_expanse.gif | Bin 1134 -> 0 bytes glyphs/nanos_badge_gochain.gif | Bin 53 -> 0 bytes glyphs/nanos_badge_hpb.gif | Bin 84 -> 0 bytes glyphs/nanos_badge_kusd.gif | Bin 1134 -> 0 bytes glyphs/nanos_badge_mix.gif | Bin 1132 -> 0 bytes glyphs/nanos_badge_musicoin.gif | Bin 607 -> 0 bytes glyphs/nanos_badge_pirl.gif | Bin 79 -> 0 bytes glyphs/nanos_badge_poa.gif | Bin 1134 -> 0 bytes glyphs/nanos_badge_reosc.gif | Bin 1137 -> 0 bytes glyphs/nanos_badge_ropsten.gif | Bin 1132 -> 0 bytes glyphs/nanos_badge_rsk.gif | Bin 1134 -> 0 bytes glyphs/nanos_badge_rsk_testnet.gif | Bin 1132 -> 0 bytes glyphs/nanos_badge_thundercore.gif | Bin 87 -> 0 bytes glyphs/nanos_badge_tomochain.gif | Bin 170 -> 0 bytes glyphs/nanos_badge_ubiq.gif | Bin 1136 -> 0 bytes glyphs/nanos_badge_wanchain.gif | Bin 1134 -> 0 bytes glyphs/nanos_badge_webchain.gif | Bin 68 -> 0 bytes icons/blue_app_akroma.gif | Bin 538 -> 0 bytes icons/blue_app_artis_sigma1.gif | Bin 671 -> 0 bytes icons/blue_app_artis_tau1.gif | Bin 663 -> 0 bytes icons/blue_app_atheios.gif | Bin 1652 -> 0 bytes icons/blue_app_callisto.gif | Bin 588 -> 0 bytes icons/blue_app_dexon.gif | Bin 1684 -> 0 bytes icons/blue_app_ellaism.gif | Bin 550 -> 0 bytes icons/blue_app_ether1.gif | Bin 556 -> 0 bytes icons/blue_app_ethereum.gif | Bin 405 -> 0 bytes icons/blue_app_ethereum_classic.gif | Bin 1620 -> 0 bytes icons/blue_app_ethergem.gif | Bin 1708 -> 0 bytes icons/blue_app_ethersocial.gif | Bin 596 -> 0 bytes icons/blue_app_ewc.gif | Bin 1773 -> 0 bytes icons/blue_app_expanse.gif | Bin 551 -> 0 bytes icons/blue_app_gochain.gif | Bin 1791 -> 0 bytes icons/blue_app_goerli.gif | Bin 405 -> 0 bytes icons/blue_app_hpb.gif | Bin 579 -> 0 bytes icons/blue_app_kusd.gif | Bin 1842 -> 0 bytes icons/blue_app_mix.gif | Bin 2022 -> 0 bytes icons/blue_app_musicoin.gif | Bin 521 -> 0 bytes icons/blue_app_pirl.gif | Bin 504 -> 0 bytes icons/blue_app_poa.gif | Bin 1668 -> 0 bytes icons/blue_app_reosc.gif | Bin 592 -> 0 bytes icons/blue_app_ropsten.gif | Bin 405 -> 0 bytes icons/blue_app_rsk.gif | Bin 1829 -> 0 bytes icons/blue_app_rsk_testnet.gif | Bin 721 -> 0 bytes icons/blue_app_theta.gif | Bin 346 -> 0 bytes icons/blue_app_thundercore.gif | Bin 557 -> 0 bytes icons/blue_app_tobalaba.gif | Bin 1773 -> 0 bytes icons/blue_app_tomochain.gif | Bin 1932 -> 0 bytes icons/blue_app_ubiq.gif | Bin 1579 -> 0 bytes icons/blue_app_volta.gif | Bin 1773 -> 0 bytes icons/blue_app_wanchain.gif | Bin 1858 -> 0 bytes icons/blue_app_webchain.gif | Bin 1554 -> 0 bytes icons/blue_badge_thundercore.gif | Bin 271 -> 0 bytes icons/blue_badge_tomochain.gif | Bin 1080 -> 0 bytes 95 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 glyphs/badge_transaction.gif delete mode 100644 glyphs/blue_badge_akroma.gif delete mode 100644 glyphs/blue_badge_atheios.gif delete mode 100644 glyphs/blue_badge_callisto.gif delete mode 100644 glyphs/blue_badge_dexon.gif delete mode 100644 glyphs/blue_badge_ellaism.gif delete mode 100644 glyphs/blue_badge_eosclassic.gif delete mode 100644 glyphs/blue_badge_ether1.gif delete mode 100644 glyphs/blue_badge_ethereum.gif delete mode 100644 glyphs/blue_badge_ethereum_classic.gif delete mode 100644 glyphs/blue_badge_ethergem.gif delete mode 100644 glyphs/blue_badge_ethersocial.gif delete mode 100644 glyphs/blue_badge_expanse.gif delete mode 100644 glyphs/blue_badge_gochain.gif delete mode 100644 glyphs/blue_badge_hpb.gif delete mode 100644 glyphs/blue_badge_mix.gif delete mode 100644 glyphs/blue_badge_musicoin.gif delete mode 100644 glyphs/blue_badge_pirl.gif delete mode 100644 glyphs/blue_badge_poa.gif delete mode 100644 glyphs/blue_badge_reosc.gif delete mode 100644 glyphs/blue_badge_ropsten.gif delete mode 100644 glyphs/blue_badge_rsk.gif delete mode 100644 glyphs/blue_badge_rsk_testnet.gif delete mode 100644 glyphs/blue_badge_thundercore.gif delete mode 100644 glyphs/blue_badge_tomochain.gif delete mode 100644 glyphs/blue_badge_ubiq.gif delete mode 100644 glyphs/blue_badge_wanchain.gif delete mode 100644 glyphs/blue_badge_webchain.gif delete mode 100644 glyphs/icon_toggle_reset.gif delete mode 100644 glyphs/icon_toggle_set.gif delete mode 100644 glyphs/nanos_badge_akroma.gif delete mode 100644 glyphs/nanos_badge_artis_sigma1.gif delete mode 100644 glyphs/nanos_badge_artis_tau1.gif delete mode 100644 glyphs/nanos_badge_atheios.gif delete mode 100644 glyphs/nanos_badge_callisto.gif delete mode 100644 glyphs/nanos_badge_dexon.gif delete mode 100644 glyphs/nanos_badge_ellaism.gif delete mode 100644 glyphs/nanos_badge_ether1.gif delete mode 100644 glyphs/nanos_badge_ethereum.gif delete mode 100644 glyphs/nanos_badge_ethereum_classic.gif delete mode 100644 glyphs/nanos_badge_ethergem.gif delete mode 100644 glyphs/nanos_badge_ethersocial.gif delete mode 100644 glyphs/nanos_badge_expanse.gif delete mode 100644 glyphs/nanos_badge_gochain.gif delete mode 100644 glyphs/nanos_badge_hpb.gif delete mode 100644 glyphs/nanos_badge_kusd.gif delete mode 100644 glyphs/nanos_badge_mix.gif delete mode 100644 glyphs/nanos_badge_musicoin.gif delete mode 100644 glyphs/nanos_badge_pirl.gif delete mode 100644 glyphs/nanos_badge_poa.gif delete mode 100644 glyphs/nanos_badge_reosc.gif delete mode 100644 glyphs/nanos_badge_ropsten.gif delete mode 100644 glyphs/nanos_badge_rsk.gif delete mode 100644 glyphs/nanos_badge_rsk_testnet.gif delete mode 100644 glyphs/nanos_badge_thundercore.gif delete mode 100644 glyphs/nanos_badge_tomochain.gif delete mode 100644 glyphs/nanos_badge_ubiq.gif delete mode 100644 glyphs/nanos_badge_wanchain.gif delete mode 100644 glyphs/nanos_badge_webchain.gif delete mode 100644 icons/blue_app_akroma.gif delete mode 100644 icons/blue_app_artis_sigma1.gif delete mode 100644 icons/blue_app_artis_tau1.gif delete mode 100644 icons/blue_app_atheios.gif delete mode 100644 icons/blue_app_callisto.gif delete mode 100644 icons/blue_app_dexon.gif delete mode 100644 icons/blue_app_ellaism.gif delete mode 100644 icons/blue_app_ether1.gif delete mode 100644 icons/blue_app_ethereum.gif delete mode 100644 icons/blue_app_ethereum_classic.gif delete mode 100644 icons/blue_app_ethergem.gif delete mode 100644 icons/blue_app_ethersocial.gif delete mode 100644 icons/blue_app_ewc.gif delete mode 100644 icons/blue_app_expanse.gif delete mode 100644 icons/blue_app_gochain.gif delete mode 100644 icons/blue_app_goerli.gif delete mode 100644 icons/blue_app_hpb.gif delete mode 100644 icons/blue_app_kusd.gif delete mode 100644 icons/blue_app_mix.gif delete mode 100644 icons/blue_app_musicoin.gif delete mode 100644 icons/blue_app_pirl.gif delete mode 100644 icons/blue_app_poa.gif delete mode 100644 icons/blue_app_reosc.gif delete mode 100644 icons/blue_app_ropsten.gif delete mode 100644 icons/blue_app_rsk.gif delete mode 100644 icons/blue_app_rsk_testnet.gif delete mode 100644 icons/blue_app_theta.gif delete mode 100644 icons/blue_app_thundercore.gif delete mode 100644 icons/blue_app_tobalaba.gif delete mode 100644 icons/blue_app_tomochain.gif delete mode 100644 icons/blue_app_ubiq.gif delete mode 100644 icons/blue_app_volta.gif delete mode 100644 icons/blue_app_wanchain.gif delete mode 100644 icons/blue_app_webchain.gif delete mode 100644 icons/blue_badge_thundercore.gif delete mode 100644 icons/blue_badge_tomochain.gif diff --git a/glyphs/badge_transaction.gif b/glyphs/badge_transaction.gif deleted file mode 100644 index 131325d4a16f9889cb1efc0709cd4b7aa9130bc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 339 zcmV-Z0j&NFMd%*x1a>%=!8GA^8LV00000EC2ui05SkF00092 zoR5hREiYOCs@j_v-26=pT3SbTUl;}^KxN|=pclZM;rq1mp+feKi|q!zh;Ddz2~ou* zQqg2Wj!y;611eIhR^M#Oy@4ybSvk_klS7D6(z$^-0J(YLSsJ?+R9qS8KJnC7t#Tga!SS_ z({QtMd#20f^Kh2xn(Q0vK-X64*_WCl4P8<_0r+KP***E}Jo`2Lq&V6~J_Kp79(b&? z=iX(USu3BW9U6bHPmN&5uihzG{E8s*cW(|REeQ$YLwILSIs;MeRK#P%j1nXyMKU4@ lQe}<@PzyRb3uBU-6&(4(u(UQ(-pdk)5=wy4fTV>206Uxbnu-7b diff --git a/glyphs/blue_badge_akroma.gif b/glyphs/blue_badge_akroma.gif deleted file mode 100644 index 40b3320c4ca61847a4a848f73fd76e9d5383d160..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 727 zcmV;|0x11QNk%v~VKM+R0OJq<%FW5n(9O}*(A3w{*V@gVn6 z?DF*S_WAYs`}q6)`u+d>EC2ui05SkF000F3@X1N*Wa$hMfEUD}Fji@vQ-cUz>%PK4 zqO`RTZ?1dBT%(M_D^N&`8j{9hktlRry`L%Z^bi)vnnKtTD5MpHtKb6%T?p`_G3YMT zHkN0QrLkLwI-JrtwCFW$9%*|gVskWy0EC5xEsPckj}%{x7K#Za3~~p20s;namJ@ye z0c8?g0(uKv0HC6c4RQq)3@xz|X9imxu#F426kG-t4q^mrXCE?qT* zf&&TDC&3Wh^S%L+S;9%c_V4Y}40&qZH$O`5F zRN4emf|vqd7z`MoWsaPi6k5?_*(RTYCq!6yqfk%|06i8M7;yKIoC5~ET9`D^z(W-p z7*{SdSV0Mb0MJn6s6hq53PH1V3MvEs{E#%DC(kw4MVvwfj;$i9prNtKhYe68v z8<;2r3bIGm4^ciCoOCJhDYKPQdW{_loJ7H74~iemJTTMZi3BXVp=b~qKiO$S0)GtBtlP}~!|87y!unzH4Ozq!OL3tLJ9-b-8) zs6s>mmB>`3O^|2XJ^b+q%#P=RTEp;=lrXX|ARd4M<^qmg6{wON7~#d|!z>2c@&qKK zBoW33-pn*lhbAb(Sp}txNFoJ_#B@SC9CoP4XS=~Tp?fpln1pe${m{`LI#Q4#08zkk zg9|RIf!i1-l6B-?ze%yoUqvjD1#kA1*8&+NPPxOESFCu!0n>f?3Iahkf8muB=;w2_yx zH_%rkB;Xfv=2hgiQ3%11xI=P?p@PF{M)Igo=Ltk22%;p$gqnHN5$Jj;6I(m`ieZaF zi8{*1!H5bv#__9w!=@@hE7h|4eB9+eyhIT>_Cr6{}d=wluJ#9R0zBjq{0eKK!x@aF0`n{N~eP?Pc()( tqJ`2!I)>^s6f$y4$$5=TN;G7`#*0S!z$C*}gQ7s394XFB7ZXVV06SD}p<)04 diff --git a/glyphs/blue_badge_callisto.gif b/glyphs/blue_badge_callisto.gif deleted file mode 100644 index 43a8c35634af603e4487b8d4fe564272523d14a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 560 zcmV-00?++NNk%v~VKM+R0OJq<%*@Qs&(G1((bd(}*x1lq*=;-U~ z>+bIE@$vEV^Yi!j_xbtxEC2ui05SkF000F3@X1N*WG92o^I=vfj@QAR==qUsh^ZfV zVP+?{apAH}ib*l|JeagZi2&X=e3>Zit zfkCrG2yjU_5k#9sZC*GLus{*VMT_PcC2g#5!rX)u*b*+3(BR>ph#WbXoOmL@zDoWC z0CXw9lbIixaBR?70AYdv@8ZpyRL_hCge*1`$hIv27;uTiO`+B*DgdMt{B3v^O=1W> zUxdDr;K1rsVZ_veSUZ9PyKD-Ud-!>uwlus(@7v43j`|BshiCfkhZsBk5SD zrNE3sqzC|0N@gX2V{-6GC^ROhq6xdfcY!Vi0s#__`Mk%q8$)x>+P-}n2kYBkP>0Dq yhDx3tGjkYE^5sWzLp6eS@xeqn5#Z6OF+j3i!*$*bvpYsn9efGzFv_=x002Ah{Q4IF diff --git a/glyphs/blue_badge_dexon.gif b/glyphs/blue_badge_dexon.gif deleted file mode 100644 index 9b4dd9e7c7b76ccbb860971267afd824f34f79bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 823 zcmZ?wbhEHbG-5DfIKsg2>C>lc*RDN%`t<(&`)}U7xq0*E*RNlH{`~p={rg9c9^JWf z=jF?nmo8m8fByWRKYz}gIrIPje+E*3;!hT^avcx}vXg=Jzk*6%ilvoDkct0mqt=EQ zCAs}AkKX;UW7w|Hd*Fp+FHciIhsGzSPSyl3QJy)w8xlQ>c`AC2I%aqzL^J7~6gYA2 zic-?Gg=QO~dRgzNoX9&_&d-=!t;QC?TW?mT$J}bhm#fQIVmh%mcB=X;CB8Yz@w%*L zR=RyAhN@hdD$Jawlla%Da_BLdZslzeV9?#Ymw&ekUqshjzg?z&%LV+nlqW4VVbi;$ zT&wG4azodF+uDJ}I=@Emi9q=^RldfiH`YAw^{4r5FVu4|S=cz~kL_mFBc;NMC+8`O zGkGcUY!x`a+^<|lwqW5|mqsxj1)rLS4;&U$e3~)Uqk+BY06V|$|3|`(M$+D0N;@Q_ z9oMq91hBPRZftXnIxlFQeWy`@^MR>&%Z}3DW_~Oi*hM|3G$ovCIWD$d;Y9VtcaCm? z;(P6mxRoY!)=vF)_149NwK{^*_bAqus zUolJ$JFd*OTZ7#~Gl(NkKBsb3Z!zadUAvRj%S>O)40Po5Gh$rxrnyGN@0s<=3$2H4 zYCpFtsO7trwZVq1rPQWs_Sr=yHlLGTJLEsz-xzxHNaW&><}G?3j8a6ezvx(~9voLY zp|qm%c;aK<*)rx@oO$ei+YBcB+*%~8E4@O@#sA7ocGf@Q3pA#=l=Mfcow&}lCD__v zMsySZvgE@BPaGW{YKwF&xtwo!aLOF+>rYvgWD8p}Vz{3RG`Ab9-SI^{PGHNExg1q1 zm7Ah1c`rNoy^&cK%50ZsAj+NG(s7J11mcB0n zvh0R_vxJ#9Ju|dp?j>hhC=y0J{JROg2QfY6uRT1r7_l2@M5|UP{2Y0|ySo2MP-b z3<1hCwxlG?u!0AjVFJ7W$3rPA3Y4b?4&|o{4Cw#?sw3?p#R32U9-{}#UVwuLLGeRD zLIF1b5K|?BbqoQl0rE)nlY|Q5f{DQcDqa+{B1NP^5djEFw2okblNUU2fH|Q7x@9jH z%p)*w+AKBDMEO|IfD(ZP1|agJSxAYkU$9c{dqw~QCK?V3oQi0G&&&tld^Fe!K)_EH zt{j!>1d(Y8pxqz(-_qu?6G!=VM@#hI#_=@1yQ zU&V|Gkc3PIvmMW3x?q`-W{svJPL>Qxy~Xqsx2>E=P9yt?3?Vye3ll>GhVR#wCDi`C NJ9zFCIH*Jb06RZI;S~S? diff --git a/glyphs/blue_badge_eosclassic.gif b/glyphs/blue_badge_eosclassic.gif deleted file mode 100644 index 3ad0bbaade6ce5391249c2c9867257c54a6e83dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 430 zcmV;f0a5-(Nk%v~VKM+R0HFi`-QC^o?d{CW%=!8GEC2ui05SkF00091oR4`C00N^6 zs@j`e++5;sHQhJ@6bL@tbQ+AdqF1oCpSaobphD)p=m`KoUJgUV&^)qU^742>nIGpZ zqN`YuSdb5rRV;@y>Xbs0PQezlC3=9TB3k-YkP(Cx?(rVMhOmUez8Jy(lpTLNA02eS5WM^NVEZ`;v zJS8&YyJjbaMJlCGpplQyI);)tQ%WI?1RWUx8SLgqUv;P%Gur54BwjA$QDnpF4^ewb z^AW`2^p;eW17l#S$`7mMAgF;~ Yv~LHK=%BU;m&1q^19>r+h2jDLJB!-L$N&HU diff --git a/glyphs/blue_badge_ether1.gif b/glyphs/blue_badge_ether1.gif deleted file mode 100644 index 5174214f342c9938ccb2b1ebf96701f5d698edfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmV-h0i^y%Nk%w1VKM+R0FeLy-QC^o?d{CW%=!8GA^8LV00000EC2ui05SkF00092 zoR4`C00N^6s@j`e++5;sHQhJ@6bL@tbQ+AdqF1oCpSaobphD)p=m`KoUapv+d1O5z zveHCFpO)#Rr=up973EO-!CJWBYXo{OgUADK_U7EV5vus^VVC+4kvC>8muB=;w2_yx zH_%rkB;Xfv=2hgiQ3%11xI=P?p@PF{M)Igo=Ltk22%;p$gqnHN5$Jj;6I(m`ieZaF zi8{*1!H5bv#__9w!=@@hE7h|4eB9+eyhIT>_Cr6{}d=wluJ#9R0zBjq{0eKK!x@aF0`n{N~eP?Pc()( tqJ`2!I)>^s6f$y4$$5=TN;G7`#*0S!z$C*}gQ7s394XFB7ZXVV06SD}p<)04 diff --git a/glyphs/blue_badge_ethereum.gif b/glyphs/blue_badge_ethereum.gif deleted file mode 100644 index 5174214f342c9938ccb2b1ebf96701f5d698edfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmV-h0i^y%Nk%w1VKM+R0FeLy-QC^o?d{CW%=!8GA^8LV00000EC2ui05SkF00092 zoR4`C00N^6s@j`e++5;sHQhJ@6bL@tbQ+AdqF1oCpSaobphD)p=m`KoUapv+d1O5z zveHCFpO)#Rr=up973EO-!CJWBYXo{OgUADK_U7EV5vus^VVC+4kvC>8muB=;w2_yx zH_%rkB;Xfv=2hgiQ3%11xI=P?p@PF{M)Igo=Ltk22%;p$gqnHN5$Jj;6I(m`ieZaF zi8{*1!H5bv#__9w!=@@hE7h|4eB9+eyhIT>_Cr6{}d=wluJ#9R0zBjq{0eKK!x@aF0`n{N~eP?Pc()( tqJ`2!I)>^s6f$y4$$5=TN;G7`#*0S!z$C*}gQ7s394XFB7ZXVV06SD}p<)04 diff --git a/glyphs/blue_badge_ethereum_classic.gif b/glyphs/blue_badge_ethereum_classic.gif deleted file mode 100644 index 5174214f342c9938ccb2b1ebf96701f5d698edfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmV-h0i^y%Nk%w1VKM+R0FeLy-QC^o?d{CW%=!8GA^8LV00000EC2ui05SkF00092 zoR4`C00N^6s@j`e++5;sHQhJ@6bL@tbQ+AdqF1oCpSaobphD)p=m`KoUapv+d1O5z zveHCFpO)#Rr=up973EO-!CJWBYXo{OgUADK_U7EV5vus^VVC+4kvC>8muB=;w2_yx zH_%rkB;Xfv=2hgiQ3%11xI=P?p@PF{M)Igo=Ltk22%;p$gqnHN5$Jj;6I(m`ieZaF zi8{*1!H5bv#__9w!=@@hE7h|4eB9+eyhIT>_Cr6{}d=wluJ#9R0zBjq{0eKK!x@aF0`n{N~eP?Pc()( tqJ`2!I)>^s6f$y4$$5=TN;G7`#*0S!z$C*}gQ7s394XFB7ZXVV06SD}p<)04 diff --git a/glyphs/blue_badge_ethergem.gif b/glyphs/blue_badge_ethergem.gif deleted file mode 100644 index 01676ade0b5cfa619750923f947d76a28d655fbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 769 zcmZ?wbhEHb)Me0RXyIo#d-m*w3l}b5zI^@q_1m{^-@AA3;lqcIA3uKn{Q2wGuiw3U z_wnP$uV26Z`0?ZS@8ADP2Z}#g7`Ye(7<3qb0Awcv>%RxeeJU?aP8l-faPzcZvPjLn zpCP!xQQ^;ix%CRWCA~G6@&g<+Bm!121xmbOXnFK;+XY6JHkahv9uh1K4v8CeErql< zG+h(36nP%L=wE@%g~$@KCev~+CXSY7c55~sca1Jp9=1&ONh%!H)1$fBa@^}OIovoi z=1d6bj9$c4ZOX09HbXU*m9>A(ROSWBysQyB7lv%-+@iwc#hR?lWye*@vwb_;nP@I1 z#tTZkUYm3IIM~=(*<4Ebrm~#jioc!mn3I*0{eJEZh6{WLzD0lHiWU3g9KP~Er`-CI zP;QTt4D(rR1NLkvb2+%jI$JK_C2OWD7X#~$3E3AKx(qYf|NUSH7HkNat+yoS;iVZH zdzXpcIuMvBaIV3V{Zd%$ZY75qg8rJ#Mk~yh&ATYgbD^d(DkIt7Ol)DP;WkyR?nSZ3 z8FQT$JKD0pOa^4F!r^VQ^nWef%ma&ya0r*al8v78ohGp`~2>@%(j#UZO@Uin+t zm^oA&W(;EclyUgqmM_A(9gJxo7MG^Wd{8rQCmi*tg|J zn={P3TT>tBXEQPR<%WpjWwjBLS=A&@*nVS(_KQCtuwc6Es)#8KT7Ogj+NG(s7J11mcB0n zvh0R_vxJ#9Juauy2$1$z<>1p;A19YQu*BMk%tiw_I~1Pv>h z6qgn=b^;143Icj<922G%00)7w6AcTH6?X|{N)o8H2nD1R2#$v#4FvE)Dm8aYPV7;&aZX;nPHv!-J}%4q}^CHN_ehtLP~XyStfbydG7 z^ z;>CU`Y(4P9mz@9!48)}?VKF*`I7w{2@Qw}EtRy&H?Z{3RY-N8)G9m|O&QHX%|K^`r8C%47G he79~BV*06YIo_?7?w diff --git a/glyphs/blue_badge_expanse.gif b/glyphs/blue_badge_expanse.gif deleted file mode 100644 index 9de8e125cfd47054ecce3fe90191a0e4a7468bb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1477 zcmZ?wbhEHbG-5Dfn8?8J;K75BA3vTsbLQvIpNjvvBYXoCToOwXfwYZ%ML}Y6c4~=2 zQfhi;o~_dR-TRdkGE;1o!cBb*d<&dYGcrA@ic*8C{6dnevXd=SlxV%Qmue&kg&dz0$52&wylyQNJ0T*r*nQ$s)DJWnQpS7v4w)U zrJkXwrG=4+j)IYap_#scrM{twu7RPIfu)s!p#l^r0c|TvNwW%aaf8|g1^l#~=$ z>Fbx5m+O@q>*W`v>l<2HTIw4Z=^Gj80#)c1SLT%@R_NvxE5l51Ni9w;$}A|!%+FH* znV6WAUs__T1av9H3%LbwWAlpjz~0eI&d=4aNG#Ad)H48i38v837r)ZnT)67ulAu(C zd$Af^98y`3svneEoL^d$oC;K~46>@g%DE^tu_V7JBtJg~7K#BG`6cQdFB2=9ZF3nBND}m`vLFhHbsTY(WatnYqyQCInmZhe+73JqD zfIV)NiQ6qkIL(9VO~LIJW1M>RfsWA!MK4lx!-Rlo2*iXZULXga{8RIQX}$=UxEcTd z`}^njub)4@fBX97^QVs=-oJbM=Jl(WFP=Yp`sDGWhY#-GyL;#Mt(!NlU%Ptc@}-Lx z&YwGb=JctPCypOGdgSn-g9rBS+q-A?uAMu!Z`-%OrteG>WPn$Yr@}!9q`ulo&y1P0%+S^)NnwuIM>g#H2s;eq1%F9Yiii-*h z^7C?Yva>QX($i8?l9Lh>;^SgtqN5@s!oxyCf`bAB{QZ1=yuCa<+}&JVoShsU?CorA ztgS39%*{+qjExKp^!0Rgw6!!f)YVi~l$8_}c#J?&&>E`yVWg@c!7dEz#p7%iT1EjF49%w$s8-PqCiCRAv64c=d&z z?BJM5tDM_!ZN9>DN94nm=NyODm2VSMOJ}s0QE)@)c>0dU@6QWa!e@N&*!J+NgGNE& zOy(CWuSZ-=RJvTiu;b;6hK!q)H$E1fj9R#iF|)ej)W)RSDWSJ^PAE;VVVL94&gdiM zUL#|>hDZ9R*4g0R37S%!;X8F>GuLu0U!ars!IGzTw%uNz)zbZcLf1Wg#asKlX>H$Y znOzlgEE2rkF5F=$eI#>d;{gK!%S`cQCf+Ab9x%=;(cclVC2{%G#%hJTJt1veJf8AQ z({DC@G(6+&aXzeTM&`upiyW>$TVr%0NqKqm`pD1J zUC}b)@mRDe=jL%AfqI`?9bY*Yu9`A4=Z4$VKy?QGoqX0+S3ed{JGoo$wOhu5ZBC2~ F)&M|mJlX&N diff --git a/glyphs/blue_badge_gochain.gif b/glyphs/blue_badge_gochain.gif deleted file mode 100644 index 4a8ea11eb14bd74722a7bfb2382105460b152634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 365 zcmV-z0h0blNk%v~VKM+R0HFc^-QC^o?d{CW%=!8GEC2ui05SkF00091oR4`C00N^6 zs@j`e++5;sHQhJ@6bL@tbQ+AdqF1oCpSaobphD)p=m`KoUapv+d1O5zveHCFpO)#R zr=up973EO-!CJWBYXo{8cc|onH%sCa-w2fx5nluCc!(}P0_1hT*9WM_mF9X1Q6{><%IRu5D|>j`E6{r@ ztbq6{N~}Db&|$h+j4OwW;HC1sxlB#%;!_y>$}G)ohiRC-oks2_NsO9a%e}gq8x9|x zCi(4NIebs3=++-(|CqHi@}(Idaq494qoc6ZKW-2K)>2cj;H*bXxj6EwBWp{*k0AY+ zF-fx9$SQ5hSi$fTOiY+Zw8ZilX2Xv;LU4kJH6%+2A)aJ*U{S3B(S&7iK=UEg=q8^Z LUo1shqyPXrmUXYi diff --git a/glyphs/blue_badge_hpb.gif b/glyphs/blue_badge_hpb.gif deleted file mode 100644 index 3b64b0c2ac860f1bc3973f99de33638110e24e71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 434 zcmV;j0Zsl#Nk%v~VKM+R0HOc@0002Y%*@cx(B0kL?d|RM_V)k({{R30A^8Le000L7 zEC2ui05SkF000C3Xu8}>WQ;(oBrfaSWc{GUjan3*=YWyq1YWBGc`v&WZ#h}l+21H;l*}#cxK_oL1WmTt|>n7;KHlG>iafAxADqRKGQ7Bi=6zZGhHkdbSgE(#f zEKq7UXbdh=4uE|jb_H8P41lCRC; z!$&rBuJOq7r$?~$)yv>49Vw*goJYhYjIG z450!7dKhMR4#8LH@P%{mF%h3OAt`QiAW=a{a@#;Kf|yB0#);u5%dc5!EN%xv ca26r%)G232<*-UsFIv8IX^>UHHbVjcJMdn{QUCw| diff --git a/glyphs/blue_badge_mix.gif b/glyphs/blue_badge_mix.gif deleted file mode 100644 index 5174214f342c9938ccb2b1ebf96701f5d698edfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmV-h0i^y%Nk%w1VKM+R0FeLy-QC^o?d{CW%=!8GA^8LV00000EC2ui05SkF00092 zoR4`C00N^6s@j`e++5;sHQhJ@6bL@tbQ+AdqF1oCpSaobphD)p=m`KoUapv+d1O5z zveHCFpO)#Rr=up973EO-!CJWBYXo{OgUADK_U7EV5vus^VVC+4kvC>8muB=;w2_yx zH_%rkB;Xfv=2hgiQ3%11xI=P?p@PF{M)Igo=Ltk22%;p$gqnHN5$Jj;6I(m`ieZaF zi8{*1!H5bv#__9w!=@@hE7h|4eB9+eyhIT>_Cr6{}d=wluJ#9R0zBjq{0eKK!x@aF0`n{N~eP?Pc()( tqJ`2!I)>^s6f$y4$$5=TN;G7`#*0S!z$C*}gQ7s394XFB7ZXVV06SD}p<)04 diff --git a/glyphs/blue_badge_musicoin.gif b/glyphs/blue_badge_musicoin.gif deleted file mode 100644 index c56081dfc689bca2f954099cee6ad8e11fed0a12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1144 zcmZ?wbh9u|G-5DfC}&_${LdZX8=&BlSds{&ZR{%w5|gu2OB9k)(=+pImEP~(ucVNf zVyhHx>TBRz;GCL~=}}db8eHWUl3bOYY?-2DZ>L~WVO5b^kegbPs8ErclUHn2VXKsw zlAn}n1!RMS^_3LBN=mYAl|Z&R=NF|anChA887KjD7p0_G1-ZCE^#XaeN*N_31y=g{ z<>lpi<;HsXMd|v6mX? zCgqow*eWUM18vZUS^;9h-D;i^A3wZ* z_x8=}S1(^YfA;jr<3|r4+`o7C&h1+_Z(P52^~&W-7cZPYclONbQzuUxKX&xU;X?-x z?BBO{&+c72cWmFbb<5^W8#k<9w|33yRV!C4U$%6~;zbJ=%%3-R&g@w;XH1_qb;{&P z6DRcd_4agkb#}D3wYD@jH8#}O)z(y3RaTUjm6jA26&B>@<>q8(WoD$OrKTh&B__nj z#l}QOMMi{&g@yzN1qS&0`TBT!d3w0Jxw<$zIXc+e+1glJSz4HznVJ|I85-#8>FQ`} zX=$m8y~Dnd%7)F6yaL zO#Mm5t#WMYoaM#BoDF(YC$VWKhiNy7msxSltkPa7mff{#ftAiGPch~tqSNIT2`%5e zVY`ReZVpzF&b22Fln45UEoYh~zjyzcd8&#>P8{iZjlF@W7rdN zg?5}0?!2_);H?OVi?g@Nz9phN_WzICNkL?c-eV4f9_!-xJ z7v293Pna)wE3Z$LjjYKzt~h-v|CSp|pDf#ue2ClPSwwQ%f$-z=^kdJ=>{xtBZ(e>; z&<)Nr8W;IJ6PdnPUXJ(55$c+IsA|jO<5SExe_H6WPzhlxkunb2 zF520Wr_vW5@shV#I`f#z;Rel#%1cijSuJyZ!OCVH|GW2v(j1leoLkohl$|JU=?Iwum%87+vq(2 diff --git a/glyphs/blue_badge_pirl.gif b/glyphs/blue_badge_pirl.gif deleted file mode 100644 index 19a25f9ff7fb0b681489ea5fed3aad12891affa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 372 zcmV-)0gL`eNk%w1VKM+R0FeLy?d|Q|-QCR0%=!8GA^8LV00000EC2ui05SkF00092 zoR4_`5dxzFs@j`e++5;sHQhJ{6bL@tbQ+Adq8G5XpSaobphD)p=m`QqUapv+d1O5z zveHCFpO)#Rr=up973EO-!CJWBYXo{OLV)CfH~ZP_-UyX**V)+-5%`59<8`oymnJ9W zW6)Q)c5rxeCMfghm=*`YkcdLbXK5yYbB94Gkie;6r{dSysMzZIs-Prx`O0~^khkf1 z>uJg{%34|(i#woO!K++6oD4j++0ir{KLuH^EfrONN;xilr1TTVaq>___(jO)b S1XWtIsfz|iO$@Y90028FSgzgx diff --git a/glyphs/blue_badge_poa.gif b/glyphs/blue_badge_poa.gif deleted file mode 100644 index 62d6c065b0d0fb6dbf6b767ae3134f6790b5e7ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 679 zcmV;Y0$BY=Nk%w1VKM+R0J8u9-QC^U+1cXa;`R0Q=;-Lw)YSa^{PFSe?Ck9L`1sDw z&gSOk`uh6O(b3Gz%>V!YA^8LV00000EC2ui05SkF000F4@X1N*Oh|;HoKi&~Ac%MQXlxb}xK<5F(kr)y~;y}o?6o7%v#xNoe%g4d!5CEeVL`NZDU?&Vgr-ArR z1T6r~dBO9LHs6%3_ugbI}@1b&ASi2!D3Es9R0u~@JaE?HfR~m>#IS0TE3?$?K6kMx;Z-WDN7SQM@1fV607KF;7 zsK&toG!wm!EHE%k0RbE@kex8#r$v;P0ZQZ~d`g7tPL)nFDXgoIKtN3p0tlmWV5)+`Y7NSs4fLwPO+qE$nV7_Y zqVM0pgHzOG0bkSy<3b0+%)I$Wq3$G96IsEd^Xtt!QxiBrStC2rc=`JN1zc0t1j$F4 zWnpz|^_;Ak$OakygkbL}Oq%;WQ8muB=;w2_yx zH_%rkB;Xfv=2hgiQ3%11xI=P?p@PF{M)Igo=Ltk22%;p$gqnHN5$Jj;6I(m`ieZaF zi8{*1!H5bv#__9w!=@@hE7h|4eB9+eyhIT>_Cr6{}d=wluJ#9R0zBjq{0eKK!x@aF0`n{N~eP?Pc()( tqJ`2!I)>^s6f$y4$$5=TN;G7`#*0S!z$C*}gQ7s394XFB7ZXVV06SD}p<)04 diff --git a/glyphs/blue_badge_ropsten.gif b/glyphs/blue_badge_ropsten.gif deleted file mode 100644 index 5174214f342c9938ccb2b1ebf96701f5d698edfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmV-h0i^y%Nk%w1VKM+R0FeLy-QC^o?d{CW%=!8GA^8LV00000EC2ui05SkF00092 zoR4`C00N^6s@j`e++5;sHQhJ@6bL@tbQ+AdqF1oCpSaobphD)p=m`KoUapv+d1O5z zveHCFpO)#Rr=up973EO-!CJWBYXo{OgUADK_U7EV5vus^VVC+4kvC>8muB=;w2_yx zH_%rkB;Xfv=2hgiQ3%11xI=P?p@PF{M)Igo=Ltk22%;p$gqnHN5$Jj;6I(m`ieZaF zi8{*1!H5bv#__9w!=@@hE7h|4eB9+eyhIT>_Cr6{}d=wluJ#9R0zBjq{0eKK!x@aF0`n{N~eP?Pc()( tqJ`2!I)>^s6f$y4$$5=TN;G7`#*0S!z$C*}gQ7s394XFB7ZXVV06SD}p<)04 diff --git a/glyphs/blue_badge_rsk.gif b/glyphs/blue_badge_rsk.gif deleted file mode 100644 index 5174214f342c9938ccb2b1ebf96701f5d698edfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmV-h0i^y%Nk%w1VKM+R0FeLy-QC^o?d{CW%=!8GA^8LV00000EC2ui05SkF00092 zoR4`C00N^6s@j`e++5;sHQhJ@6bL@tbQ+AdqF1oCpSaobphD)p=m`KoUapv+d1O5z zveHCFpO)#Rr=up973EO-!CJWBYXo{OgUADK_U7EV5vus^VVC+4kvC>8muB=;w2_yx zH_%rkB;Xfv=2hgiQ3%11xI=P?p@PF{M)Igo=Ltk22%;p$gqnHN5$Jj;6I(m`ieZaF zi8{*1!H5bv#__9w!=@@hE7h|4eB9+eyhIT>_Cr6{}d=wluJ#9R0zBjq{0eKK!x@aF0`n{N~eP?Pc()( tqJ`2!I)>^s6f$y4$$5=TN;G7`#*0S!z$C*}gQ7s394XFB7ZXVV06SD}p<)04 diff --git a/glyphs/blue_badge_rsk_testnet.gif b/glyphs/blue_badge_rsk_testnet.gif deleted file mode 100644 index 5174214f342c9938ccb2b1ebf96701f5d698edfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmV-h0i^y%Nk%w1VKM+R0FeLy-QC^o?d{CW%=!8GA^8LV00000EC2ui05SkF00092 zoR4`C00N^6s@j`e++5;sHQhJ@6bL@tbQ+AdqF1oCpSaobphD)p=m`KoUapv+d1O5z zveHCFpO)#Rr=up973EO-!CJWBYXo{OgUADK_U7EV5vus^VVC+4kvC>8muB=;w2_yx zH_%rkB;Xfv=2hgiQ3%11xI=P?p@PF{M)Igo=Ltk22%;p$gqnHN5$Jj;6I(m`ieZaF zi8{*1!H5bv#__9w!=@@hE7h|4eB9+eyhIT>_Cr6{}d=wluJ#9R0zBjq{0eKK!x@aF0`n{N~eP?Pc()( tqJ`2!I)>^s6f$y4$$5=TN;G7`#*0S!z$C*}gQ7s394XFB7ZXVV06SD}p<)04 diff --git a/glyphs/blue_badge_thundercore.gif b/glyphs/blue_badge_thundercore.gif deleted file mode 100644 index a31bbe32ddb35aa91e081e4041a9a71b51bdf7df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 271 zcmZ?wbhEHb)L_tL_{0DOjEsy-Oiawo%rF54#h)yUAdU`*0I6kQzQVEV&OZY$(N%MQ z+&r5-Z?;I?S=U+V4n`W!)-HW@s(|OxR^Gik+cs})eBrL>#m0Q-tfPz7d=CZ@t`t+* zrVKHq4PnwwZXt$juQmGDH3jI+_U69l^p<6}c%r_8-?96Qk(EJBt{Hs6rAfhdZ4!CR zS>Dz1sX6lcZtazw#;wAMe$kRMW+pWR)>|9Z@OgQ71!)!vHRh_v^UtYWY_TR~QN_eb zo7)=>ZJh2iv*pCxQ#+5IJ6{%j+}hdpvfw_0JL#79PA$FtaMk0m=gtq6Z@S99d29Fd J;}=c_YXH;4WQPC% diff --git a/glyphs/blue_badge_tomochain.gif b/glyphs/blue_badge_tomochain.gif deleted file mode 100644 index 624837f5a70d5f9911d3f2e64a3eb4df1c27c2eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 579 zcmV-J0=)f4Nk%w1VKM+R0P_z3|CLSuc}@R-P5+5a|GiEBt4;r*P5*06|I1DPv`zoO zP5*FB|C~+#$4&ptO#lD@A^!_WZDD6+O<`wgV`~j(VQp<;JuogbH8eFf03rDV1pojK z04x9i001%oG5`Ps|M1C4YYign!L9$G7mS#eaU7tAEVwMBNuh&kxA^mtL2j#zoa+S> zPHc>zadIH`mXxGnx;!)&p%W@JrRJ(u96= z6LxqYU>7Aqb5a#|358aN7*JgXj0uhwY>`lcT@{y@6q*wxoE3umF6UxDDxK9*hG;)ed$`ZG&&l1^ja!Cx8 zLIesrVYtTSfapsK3Itbt0wFcg6ZH*5aOnfFqTd4r4HUR*CE%Kef(8*5A(i0|0D}@5 z0NlfH;0K8P(-4aDL+~O-jWDi}{AjXY0|X6Rjq~`hWw&JyG$N4spkhgz>Tn_$>dfIv z3qYVKV>f}QGnywtoMS}DLp`PvoJzvB%Y&3Oy?j|%hxGvh2M$1F<3cG`RSQ=soMo|v zt=kY}R?RkjOY?Z)nhJm!ju5b3fmACkoDb>SQ^;t&6fczz5H`|ZkV-feBO z3T%@$^3lEvapiJZ^HbaYBOEA4kGyyb_^XyDHvi5bJY?+;7<>`JC2>VC2$mdEa>z9S zaz|cAI8GKyB#B1efrTg$WOT{0<;aWaTAEU+BW9T`W-RvL*-s}Dpi7ix;noMo$BJKC gfQ;c3j*J;EcrehQ0_D^WT%Xz$gq1{9Bn1EfI~T{Vt^fc4 diff --git a/glyphs/blue_badge_wanchain.gif b/glyphs/blue_badge_wanchain.gif deleted file mode 100644 index deb64841e5b4d869edd2a8bce8f9391cbface390..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcmV-W0&(_}I>+O5AV|`HXli9-G9sHQ zf6VCK_A>8NqqHvIOL5|*GPWQ>@hb%rF{4K$EHNZC=gTBrDUz=!W>H;ox{n38RkTpG zCGpHxg`PV|__BRe>xn9KaCRwgHZhb4S?f+TV?EF^n(9SjN_NR3853nvZ=R~`%i z1P7yN77Paj0I3%Y0s{d82bO3K2LikTu&V+D1Ofq9xJC>C1H!&E!NLT;T@B03(iF17 z0|VE{+t$w7+^P>84Bx}uSkK$)JLlESr0nA$4DJ%t@$T6K?H{3pW%@u3n!HQ&)G;ui zjFtg)`oPT-cTLxTXUuFJdjL-&LW=&Y3MhjHjaC6z93rL*=dWJAT^LCkv{l3$x`VM2 zVo*RJfXrSodlDGP@g_fdCs>Un8Q>%Xkun`#DJZNM%Vn5|Y0G$^NCTK#hY1kn&tuN5 z1!j>nDedV}Z2}6ET{*F2SYAZET#QN*Coq{M13W~r@a@l|fQ9A-5zr@Kt913c&90Ytt z!+=*XIb`Qq#KrYs55g;Cal*#UmM6cW@0hfR=x#lcR2h1*K#`K>8%7 eDg9nLazyp}Y;m7|iVOPv0S6>ofCN?$0RTI46ad)( diff --git a/glyphs/blue_badge_webchain.gif b/glyphs/blue_badge_webchain.gif deleted file mode 100644 index 24edd1c2ab57855dfd71299d0baf6db56228145e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 791 zcmZ?wbhEHb)Me0RXc1sId-m*w3l}b5zI^@q_1m{^-@AA3;lqcIA3uKn{Q2wGuiw3U z_wnP$uV26Z`0?ZS@8AFb|7Rc(DE?$&42$$-K^*ji=e1hb@!6)0D${O21oOCWjkm#>`o> z+2gBCxwYA*E;i+x#GIqT%No(QHk!waHCdUshQ*My`v0DM;I<|J6|v;>4QU@U_rNwbw}K`2S;X1VL4mw>mI_Q@cF(g z8|$GqQw0-|&8xyL)||9b>OCcQU+l|_-OY^M{gT-+vDwM24DMDe7b+yaJ>;6m$Z_Mw z=`U`xY^O8yd}K51?JwfHqZju3a+^&%gW97l-d_%$l-?h=W6#3mhQmuNN~hH^UJPQ8 zkW>6vJmbefd;flU3DZNLZZ)*2meeeXdZ#tp`=H(J8y)K$_en2RQ2Sw&ru9rtJXeLs zz&ZA$+`&!ON(BluBA3Cf4e9Ac)i%~xSD zad}{<(CaeYNAzN76z`FeHXmJ<4XRE|+$|c9bd|b(ObXqt@ZCX+iEA;3&Za30TnvkL zcz9?su^bUrGjj|+m9@m+(L%L}K9`c^IT(!GwOeZ%Iphm!5)VwOxiit-aaPGjW{IQ; ziEL6?M}Bw+d7FH65#jL(JSrNwVudGP_<_&`)>#>e$?_U29yoCuoG5t0p~%2s4FGc0 BIs5=jZ47`T76<|IEzHA^8LV00000EC2ui03ZMo000Dzut`ajNH6QXlTgGYHbual z=oS2p@Hr>=Y?x*0!CneV{8Cb2UlrYbRkT6QDgxWI!9gq*06JE~1l$0M&>}L>STr|?VH8@(Es)oYV7nDO zEa41+93?z1>BoT$Jv?njDTHt2O&9tisc2RTLA(x*8ImX?UQQ(2f*(X+Q?eXHMCd4`vSC2P z1e%S4aD;6lIKajj5Me-+0xSePGkl31|rD1nGF=z|#L^A7nHe{G$u}Bx2Y0Jql ztRM&s;24ghFhRM!rlaa zf&wv$izV48WO*1CC=iAKtVd-_)6=~hp?ngji{oL0r#LW#;sVfcdHpY}sW5FhhJv%8 z8%hQ-89iOLCd;tXbUnpXQDLAwhYldP-a|LoIGKK|:i+8-FM!8>&-V_f9=&*UViDt7oLCa*=JTi{nV3BJpS0DkF0w5 zp$At!aQ}VxuDIv!yO!U1$L+V>ddtl>En9ly4cA|H?KMlTUcBh4g;!p2`DK@0a`8nM zUeJI3g8B2#JNKNk&pPvr)921P?bO+)oP5%WC-n9D#aRW@i0lb>tB<51-L<*rCbk-G_7?JWW36z^R=bQxffQX>!{Et&_x-iBRBU(MY(NV*x`` zP5bXRp>f}R_TH<3tS9!|WB1*5-DT&UcHCk6@#D4|J7(LuZAOpUdaEr*Zn61@&4v#P zh3W@JlwZ82U=AL@(C~)2W0w`zN=+)!5rZxXLd=q=)yrMSIm QWp_qliepi;AuEG50IDu15dZ)H diff --git a/glyphs/nanos_badge_artis_tau1.gif b/glyphs/nanos_badge_artis_tau1.gif deleted file mode 100644 index 9e741b54e50405a36420a3d849ae483f19b1ad6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117 zcmZ?wbhEHbN=+)ejGla-Hl#4J0x^zpK} QOQ%H{FrA$e%fMg_0GW>|j{pDw diff --git a/glyphs/nanos_badge_atheios.gif b/glyphs/nanos_badge_atheios.gif deleted file mode 100644 index e7447fadc773b056f77006229f600305f26d3015..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56 zcmZ?wbh9u|j>wsvG2m_ONPyb48Ug#FEq$h4Rdj3G|%)7!{qbvJXa(bprp61TTU=0BJRUTUa diff --git a/glyphs/nanos_badge_dexon.gif b/glyphs/nanos_badge_dexon.gif deleted file mode 100644 index 65021cc8cc2a55d786005d87af31c513214abb6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1217 zcmbVMcYM@T91j&oMXD(76;i;W&3MV>E-&<`*SjkeIa=EyxP6zr>%}(1B<0e&aNt11 z1&D$S_ud;7Cv|Te;6}xbTX3B(<*xciKm1|-czNUd`+a|VVpF36Q5981&7!Dcu}D$W zsN%30nHD;Qd_?|r^?`%5PVCcJ++kR8X5-3L3~lIfX1bgaGENfbjY+*OZtI=euJv|m zP-p5V&~Gike+mboaafrw1U zAP1sS1j1Tc6oA4D3J)X}MAe9(iXvV57{cc2Ikh#_SmGk5IFt8%N9FlKp}-X+&UQO^ z03qZBkrzdlAXu-*@=?HAUUgYR3VWJsIKE+9bf^(!?QTEL5KFhXU^WV-*D`Y(x+RHY+HQMF7f*mK8*qw?Vi|vazkos!10k-*($=yQ^FUEqU9w zy}a$v$z+&yNY`YLW?13nxG+&${7zxln2Gg9*EZ??NUO#mRwxp}F$^?T1TrQO067*) zD9Xxm4vAT)Bz;?KfY4_2m~EKL6~~^`CtF(T5+r|K7T_@4oZ)TWj8Yn%6mbmI-z zUw7>_SFc#UZ0S`?7GHVAqRSU9n19)&mt1_&ybI@EFz5X9&OK-L*=L=3#;ns%JN1;4 zdwYVy%x>RvPjYO_?CLzx$amzhu4T~)#~*j>F-ISDh+i z#(Mch>H3D2mX`VkM*2oZx|Z5PFSp>IEf;+ybD@E~!PCWvMA{Mftf3V2@j6VsVR^ zk&}_JqpJzfJY(!`f#^-a?G^)^ZqWxiMjsTtNYM=w0;VAl6P|d19C-3i%>$zB`;K7M%r?(Lh`uU@`*{_N?K$B!O9xPR~No!hr=-nf44>Xplv zE?zi)?(CVz2)%Hf~tIZta@Yt5&X9zHI4| z#fug$m_KjsoY}Kx&X_)J>XgZoCQj(@>+R|8>g;H5Yi((6YHX;ltF5W7s;nq4D=jH5 zDlEv)%gxEo%FIYlOHD~mN=%54i;annii`*k3k?Yl3Jmb~^Y!ue^7L?bb9Hfca&)k_ zv$e6dva~QaGc_?bGBnWF)78<|($r8_Q&mw`QdE$ala-N{l9Uh^6BQ8_5)|O)#mZm}0O8n;egFUf diff --git a/glyphs/nanos_badge_ethereum.gif b/glyphs/nanos_badge_ethereum.gif deleted file mode 100644 index 776f6454b3f247e94570e722dd801ddd5f5f5ced..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1132 zcmZ?wbhEHbh+i z#(Mch>H3D2mX`VkM*2oZx|Z5PFSp>IEf;+ybD@E~!PCWvMA{Mftf3V2@j6VsVR^ zk&}_JqpJzfJY(!`f#^-a?G^)^ZqWxiMjsTtNYM=w0;VAl6P|d19C-3i%>$zB`;K7M%r?(Lh`uU@`*{_N?K$B!O9xPR~No!hr=-nf44>Xplv zE?zi)?(CVz2)%Hf~tIZta@Yt5&X9zHI4| z#fug$m_KjsoY}Kx&X_)J>XgZoCQj(@>+R|8>g;H5Yi((6YHX;ltF5W7s;nq4D=jH5 zDlEv)%gxEo%FIYlOHD~mN=%54i;annii`*k3k?Yl3Jmb~^Y!ue^7L?bb9Hfca&)k_ zv$e6dva~QaGc_?bGBnWF)78<|($r8_Q&mw`QdE$ala-N{l9Uh^6BQ8_5)|O)#mZm}0O8n;egFUf diff --git a/glyphs/nanos_badge_ethereum_classic.gif b/glyphs/nanos_badge_ethereum_classic.gif deleted file mode 100644 index 776f6454b3f247e94570e722dd801ddd5f5f5ced..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1132 zcmZ?wbhEHbh+i z#(Mch>H3D2mX`VkM*2oZx|Z5PFSp>IEf;+ybD@E~!PCWvMA{Mftf3V2@j6VsVR^ zk&}_JqpJzfJY(!`f#^-a?G^)^ZqWxiMjsTtNYM=w0;VAl6P|d19C-3i%>$zB`;K7M%r?(Lh`uU@`*{_N?K$B!O9xPR~No!hr=-nf44>Xplv zE?zi)?(CVz2)%Hf~tIZta@Yt5&X9zHI4| z#fug$m_KjsoY}Kx&X_)J>XgZoCQj(@>+R|8>g;H5Yi((6YHX;ltF5W7s;nq4D=jH5 zDlEv)%gxEo%FIYlOHD~mN=%54i;annii`*k3k?Yl3Jmb~^Y!ue^7L?bb9Hfca&)k_ zv$e6dva~QaGc_?bGBnWF)78<|($r8_Q&mw`QdE$ala-N{l9Uh^6BQ8_5)|O)#mZm}0O8n;egFUf diff --git a/glyphs/nanos_badge_ethergem.gif b/glyphs/nanos_badge_ethergem.gif deleted file mode 100644 index 19b762159ed8a1f0e6de4702544fd1672654696c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71 zcmZ?wbh9u|h+i z#(Mch>H3D2mX`VkM*2oZx= zIZpGSdQ)(_#R8{ZeV}9XLD7p8-7q0w8Uiuli5JL$C;!wuV45!iCT_<6|Nj2@{p;tC z@87({PcxqRv3h4bgmo;iK$ z#u35cm<%;FYmM&SmXyJnS^XAT( zJ!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3 zjP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|L7iT9&2YWkP8*3{|3v)A5 z6JsMo1ARSR9c?X54RtkD6=fww1$jAH8EGj=32`w|5n&-g0e(JS9&Rp94t6$H7G@?! zUHd3@pi8IxXKX-g^*F7%3>J-PE%X46_GT#!5ilWL2sh+i z#(Mch>H3D2mX`VkM*2oZx= zAx`t4dQ)(_#R#WfeV}9XLD7p8-7q0w8Uiuli5JL$C;!wuV45!iCT_<6|Nj2@{p;tC z@87({PcxqRv3h4bgmo;iK$ z#u35cm<%;FYmM&SmXyJnS^XAT( zJ!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3 zjP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|LV2nCC*xT9KSX)_In46iJ z7#kTH=@}C@U!{$jiyfNJ~jdh>MAe2nz`c@bmHVaC32Tu(PqUFf%a% zONgH=z;c3tK?g*D$_@r50HxfJjsO4v diff --git a/glyphs/nanos_badge_mix.gif b/glyphs/nanos_badge_mix.gif deleted file mode 100644 index 776f6454b3f247e94570e722dd801ddd5f5f5ced..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1132 zcmZ?wbhEHbh+i z#(Mch>H3D2mX`VkM*2oZx|Z5PFSp>IEf;+ybD@E~!PCWvMA{Mftf3V2@j6VsVR^ zk&}_JqpJzfJY(!`f#^-a?G^)^ZqWxiMjsTtNYM=w0;VAl6P|d19C-3i%>$zB`;K7M%r?(Lh`uU@`*{_N?K$B!O9xPR~No!hr=-nf44>Xplv zE?zi)?(CVz2)%Hf~tIZta@Yt5&X9zHI4| z#fug$m_KjsoY}Kx&X_)J>XgZoCQj(@>+R|8>g;H5Yi((6YHX;ltF5W7s;nq4D=jH5 zDlEv)%gxEo%FIYlOHD~mN=%54i;annii`*k3k?Yl3Jmb~^Y!ue^7L?bb9Hfca&)k_ zv$e6dva~QaGc_?bGBnWF)78<|($r8_Q&mw`QdE$ala-N{l9Uh^6BQ8_5)|O)#mZm}0O8n;egFUf diff --git a/glyphs/nanos_badge_musicoin.gif b/glyphs/nanos_badge_musicoin.gif deleted file mode 100644 index b8288acd0af0938b88c790d7e18f857c4d42f900..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 607 zcmZ?wbh9u|TBRz;GCL~=}}db8eHWUl3bOYY?-2DZ>L~WVO5b^kegbPs8ErclUHn2VXKsw zlAn}n1!RMS^_3LBN=mYAl|Z&R=NF|anChA887KjD7p0_G1-ZCE^#XaeN*N_31y=g{ z<>lpi<;HsXMd|v6mX? zCgqow*eWUM18vZUS^;9h-D;i^A3wZ* z_x8=}S1(^YfA;jr<3|r4+`o7C&h1+_Z(P52^~&W-7cZPYclONbQzuUxKX&xU;X?-x z?BBO{&+c72cWmFbb<5^W8#k<9w|33yRV!C4U$%6~;zbJ=%%3-R&g@w;XH1_qb;{&P z6DRcd_4agkb#}D3wYD@jH8#}O)z(y3RaTUjm6jA26&B>@<>q8(WoD$OrKTh&B__nj z#l}QOMMi{&g@yzN1qS&0`TBT!d3w0Jxw<$zIXc+e+1glJSz4HznVJ|I85-#8>FQ`} zX=6v-9O7C~? zS5nAKu~iB;^)>JRtPXT0NVp4u-iLDaQ zr4TRV7Wn$Y4bCgp1A9m>IX_pwBC$Z`6o8MwHZ8Jak{IhvcB7@NZMdgc|EB<3Zj!t`bW^;$R@8(2CTI9gb`;nr*AT$Gwv zl3x^(pPvJZy?~7TlKkR~`~n4MXHaZeC}{X5CTHe>1T{ec40Ug6QD#|cid#{Bt^zoO ztTJ)C!U(r3AbL}<_#Wy5W1M>RfsWA!MK4lx!-Rlo2*iXZULXga{8RIQX}$=UxEcTd z`}^njub)4@fBX97^QVs=-oJbM=Jl(WFP=Yp`sDGWhY#-GyL;#Mt(!NlU%Ptc@}-Lx z&YwGb=JctPCypOGdgSn-g9rBS+q-A?uAMu!Z`-%OrteG>WPn$Yr@}!9q`ulo&y1P0%+S^)NnwuIM>g#H2s;eq1%F9Yiii-*h z^7C?Yva>QX($i8?l9Lh>;^SgtqN5@s!oxyCf`bAB{QZ1=yuCa<+}&JVoShsU?CorA ztgS39%*{+qjExKp^!0Rgw6!!f)YVi~l$8_}WF?O;*e}u2zN`Jp-p=p#jY^`r54UA1&oB*r O;_J(CUMiS@!5RQTVvaWe diff --git a/glyphs/nanos_badge_reosc.gif b/glyphs/nanos_badge_reosc.gif deleted file mode 100644 index fe388baead9e0aee90147278055f877dc9c6db20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1137 zcmZ?wbhEHb6v-9O7C~? zS5nAKu~iB;^)>JRtPXT0NVp4u-iLDaQ zr4TRV7Ql_oE7k*hM=v=)SHB{$K;KZ$0OTc@LSJ9}N^^7Js*6j4QW5UOYH)E#WkITb zP-=00X;E@2P`NV5ssbzLqSVBa{GyQj{2W*)24v)yucqiS6q^qmz?V9Vygr+M=vuo#md6O(a6oz$=J=<$j#8u)xy%%$kf8k$;8sw z)y>e{#TBO4B|o_|H#M&WrZ)wl*950tP=d%U0NU)5T9jFqn&MWJpQ`}&xK$=Lx40U) z7#ldbx*0iHVs{HfZwhX=7~yn_KF~4xpy)-4ZkP}-4S|^O#0%uWlYeR+FwGYM6F1}k ze}Dh{{`K?6_itaneE#(D!~1t{-@JbH^2PIKPoF$~^zgy`dw1{LzIF4)^=ntJT)uSi z!ufM&&zwGW^2G6DM~@snbnw9beS7!p-nDbb_HA3YY~HkS!}@h=*Q{Q(a>epxOP4HO zv~a=vd2{E?o;7pE^l4M4OrA7xLVsUxPj^>mM|)dqOLJ3WLw#LsO?6deMR{3iNpVqO zL4ICtPIgviMtWLmN^(+SLVR3oOmtLaM0i+eNN`YKfWM!wkGGenhr64ri?frXgT0-t zjkT4fg}IrjiLsHPfxe!uj<%MjhPs-nin5ZTg1nrpjI@-bgt(Zfh_H~L06!lu4>uPl z2Rj=p3o{cV1B2pE7I0yq10q3X2LqE@i>&1F1^Xp@UaUyFSar!&*7v$wP!NaZJ+G}x S*!u6K&+GkhS3H=3!5RSa50P&G diff --git a/glyphs/nanos_badge_ropsten.gif b/glyphs/nanos_badge_ropsten.gif deleted file mode 100644 index 776f6454b3f247e94570e722dd801ddd5f5f5ced..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1132 zcmZ?wbhEHbh+i z#(Mch>H3D2mX`VkM*2oZx|Z5PFSp>IEf;+ybD@E~!PCWvMA{Mftf3V2@j6VsVR^ zk&}_JqpJzfJY(!`f#^-a?G^)^ZqWxiMjsTtNYM=w0;VAl6P|d19C-3i%>$zB`;K7M%r?(Lh`uU@`*{_N?K$B!O9xPR~No!hr=-nf44>Xplv zE?zi)?(CVz2)%Hf~tIZta@Yt5&X9zHI4| z#fug$m_KjsoY}Kx&X_)J>XgZoCQj(@>+R|8>g;H5Yi((6YHX;ltF5W7s;nq4D=jH5 zDlEv)%gxEo%FIYlOHD~mN=%54i;annii`*k3k?Yl3Jmb~^Y!ue^7L?bb9Hfca&)k_ zv$e6dva~QaGc_?bGBnWF)78<|($r8_Q&mw`QdE$ala-N{l9Uh^6BQ8_5)|O)#mZm}0O8n;egFUf diff --git a/glyphs/nanos_badge_rsk.gif b/glyphs/nanos_badge_rsk.gif deleted file mode 100644 index 5ca99a56e05ed393bd941c63006b9940d65b05ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1134 zcmZ?wbhEHb6v-9O7C~? zS5nAKu~iB;^)>JRtPXT0NVp4u-iLDaQ zr4TRV7Ql_oE7k*hM=v=)SHB{$K;KZ$0OTc@LSJ9}N^^7Js*6j4QW5UOYH)E#WkITb zP-=00X;E@2P`NV5ssbzLqSVBa{GyQj{2W*)24v)yucqiS6q^qmz?V9Vygr+M=vuo#md;!)Wyie(#g!g+||&~)xyc#%*?{b#L>{$ z(ACV**aD{4B|o_|H#M&WrZ)wl*BPf?P=d%U0NU)5T9jFqn&MWJpQ`}&xK$=@w^-sd z52`l>w_6->>eUB2MjsTtNYM=w0;VAl6P|d19C-3i%>$zB`;K7M%r?(Lh`uU@`*{_N?K$B!O9xPR~No!hr=-nf44>XplvE?zi)?(CVz2)%Hf~tIZta@Yt5&X9zHI4|#fug$m_KjsoY}Kx z&X_)J>XgZoCQj(@>+R|8>g;H5Yi((6YHX;ltF5W7s;nq4D=jH5DlEv)%gxEo%FIYl zOHD~mN=%54i;annii`*k3k?Yl3Jmb~^Y!ue^7L?bb9Hfca&)k_v$e6dva~QaGc_?b zGBnWF)78<|($r8_Q&mw`QdE$ala-N{l9Uh^6BQ8_5)|O)h+i z#(Mch>H3D2mX`VkM*2oZx|Z5PFSp>IEf;+ybD@E~!PCWvMA{Mftf3V2@j6VsVR^ zk&}_JqpJzfJY(!`f#^-a?G^)^ZqWxiMjsTtNYM=w0;VAl6P|d19C-3i%>$zB`;K7M%r?(Lh`uU@`*{_N?K$B!O9xPR~No!hr=-nf44>Xplv zE?zi)?(CVz2)%Hf~tIZta@Yt5&X9zHI4| z#fug$m_KjsoY}Kx&X_)J>XgZoCQj(@>+R|8>g;H5Yi((6YHX;ltF5W7s;nq4D=jH5 zDlEv)%gxEo%FIYlOHD~mN=%54i;annii`*k3k?Yl3Jmb~^Y!ue^7L?bb9Hfca&)k_ zv$e6dva~QaGc_?bGBnWF)78<|($r8_Q&mw`QdE$ala-N{l9Uh^6BQ8_5)|O)#mZm}0O8n;egFUf diff --git a/glyphs/nanos_badge_thundercore.gif b/glyphs/nanos_badge_thundercore.gif deleted file mode 100644 index e72367907050ddec708f7218241ae54b3539ca1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87 zcmZ?wbhEHb6krfwXkcUjg8%>jEB+I7E=o--Nlj5G&n(GMaQE~LV9)_cf|M~ZDfaZQ mJpGn&QAyD}DPKQ{jQu(C%1#S{rg>Bq>3+5Q9S65eA zSs7?7&~U|{EQ|~catt~kn?QClu&O60^rd9ZyY1h+i z#(Mch>H3D2mX`VkM*2oZxD$|%*>rEV0vBhlS^|`^GaZPQxJMxaq0ynh};68%`T}$nPsUdZbkXI3Sf_0W#V>= z6HfD>dQ)(_#TlnweV}9XLD7p8-7q0w8Uiuli5JL$C;!wuV45!iCT_<6|Nj2@{p;tC z@87({PcxqRv3h4bgmo;iK$ z#u35cm<%;FYmM&SmXyJnS^XAT( zJ!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3 zjP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|L7iT9&2YWkP8*3{|3v)A5 z6JsMo1ARSR9c?X54RtkD6=fww1$jAH8EGj=32`w|5n&-g0e(JS9&Rp94t6$H7G@?! zU6v-9O7C~? zS5nAKu~iB;^)>JRtPXT0NVp4u-iLDaQ zr4TRV7Ql_oE7k*hM=v=)SHB{$K;KZ$0OTc@LSJ9}N^^7Js*6j4QW5UOYH)E#WkITb zP-=00X;E@2P`NV5ssbzLqSVBa{GyQj{2W*)24v)yucqiS6q^qmz?V9Vygr+M=vuo#mdRhz|zgl&Dhe=$w_A*G>eUB2MjsTtNYM=w0;VAl6P|d19C-3i%>$zB`;K7M%r?(Lh`uU@`*{_N?K$B!O9xPR~No!hr=-nf44>XplvE?zi)?(CVz2)%Hf~tIZta@Yt5&X9zHI4|#fug$m_KjsoY}Kx z&X_)J>XgZoCQj(@>+R|8>g;H5Yi((6YHX;ltF5W7s;nq4D=jH5DlEv)%gxEo%FIYl zOHD~mN=%54i;annii`*k3k?Yl3Jmb~^Y!ue^7L?bb9Hfca&)k_v$e6dva~QaGc_?b zGBnWF)78<|($r8_Q&mw`QdE$ala-N{l9Uh^6BQ8_5)|O)do3$FV?231qt0!cpJ#TU=09*Bo+7o diff --git a/icons/blue_app_akroma.gif b/icons/blue_app_akroma.gif deleted file mode 100644 index 12c9cd215527155ab67ed7b242384909f26a4dca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 538 zcmV+#0_FWjNk%w1VKM+R0J8u9^-xgy$;tff?eY*1^f@{E-QD?~p8Kz_^B^GgUtjld zaP@6%_=$=6`T76<|M36-A^8LV00000EC2ui05SkF000F4u*peVV2QlVyZ1!G1XXD^ z#e#fn%OXp0mcruRc((|%6b!i_Za_L2gh-sh6i7N<#fbp;tab*xiOtI0EGC7n_#ta- zKY-O3_id;@3`aomUV9K0SHi(}91>J^92YJGd;xuafPxPgH+&2O2?vRPfn6ClhzA^o zi4Fz;Vj4Gb0v!T=3W$6Hp^O~>d~cLZ4+xZfuA+dtQGsnV$VQ3+BW#&Q-FcBbPi4l zdbsUVziltY9E6unL9Rp>2nYi>W{9G5045GommVK}zth-g4!~Lt)Bl7g#EseSNt^VcHv(ocMv8 cNRI|JUhnt~Mn$g}#F=2Q93;eu-w^-+J5pZaegFUf diff --git a/icons/blue_app_artis_sigma1.gif b/icons/blue_app_artis_sigma1.gif deleted file mode 100644 index 8c47bf3a5f35ab5715398014cd9fe1dd8924feb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 671 zcmV;Q0$}||Nk%w1VKM+R0J8u9Q=)PI|Nr#)_TTR0UZ{HN^X;C?uYS3eX|98*(YTbw zro!IMbF+-p=-jl{!HK_}A^8LV00000EC2ui05SkF000F4Fvv;6aO!}~yZ49U3{`0c zg@Jr*%OXZ`mV)8lcxMQ+G!VHUjzBssgh<@NG)OvK#fbp;tab>ziOt$!91e*D6=#?f zlHNyn(TGxxL0Mqyao#lgAEUaOVBkf3Vh8t_1#d^ z(*gx|%{1Hl!Q?<~1r}uSVW75U39DI%$Psa3K}HM`xJmwiK%~$cMg;L_FMw761QaMQ zaoz)o#vcTaL_pw+fdqCMET;gUL#Med6ody%WeqHlz)&pkq0}xF3}RpcUpObkLI4JM zKz~*ACKeY@>_i!dR!n9dh)&GH5O^eVa8M65r0Bv914@trhE>3DSd2bkP#O{;jDSZ3 F06Pi}3$FkG diff --git a/icons/blue_app_artis_tau1.gif b/icons/blue_app_artis_tau1.gif deleted file mode 100644 index 3dfdf062922c427f49839229332de7541357eb9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmV;I0%-k5Nk%w1VKM+R0J8u9|MvO$exLsC^8V%Q`NV1>NRyZ1!F3{`15 z0&;w8%N~eumH^`3c!vP9Gz7UIEo%LYZUhVzhfF`mO9(xfT@y3JPHvU|9+U6B;-N7D^IRECg}_j9HR67dMU$ zJO&;M3XysZ6AC#PHwF$01QLD+OA=xpWdb}5I2kTj4jQ8k0R~wKexaU)H4|cO z11kUvkSs|M5aE>sSt#h@u!PPi0b@8xC?LaO2U8~hCT>s!XF~uPC2<_&F+khM1{x%^ z=wt$43tv7mvXI$g#y}Q)Ea=?nzy;5dD00YQ806>&r`&M#OPRx|hog!zx#;J>SW^cJ z48-ejbY2ivk!sxlDIp=*q7V8FZDB8x%?|;VfO`seA(E4x}Gk-`83updk?%|b+ug9#Ng3hRb=F2;qf&PXy&jc3k9u x(*&$l_=FqfY3Rf(Oi<{dNgUFU--tTUH$w^#J^_Oq`|*cCfH{OP0v-_n06X!_`;68M@#0p7>V0`|GohzZoXKXXtpl z_wG-#MIV3u{Q3X?e}=wyivPJId;=6*5=#<+w2gg5L1J=tYKcNpYI8?t&$^1LIGr_bAC~(f~lUFZnB|?fr7cEo}rn6iK(HEf{}rt zxxRs^zJZypfuWUwg_V(^0u(3#Z7WJivkG!?gW3h;*(zm}loVL$>z9|8>y;bpKhp88yV>WRp=I1=9MH?=;jqG!%T2VElw`VEGWs$&r<-In3$AbT4JjNbScCO zxdm`z^NRJr-qB0W&(*I;EYLU9GXQxBrqI_HztY@Xxa#7Ppj3o=u^L<)Qdy9yACy|0 zUs{x$3RJEPvZ}z!xhOTUB)=#mKR*W+iUAqoqsPsTY(WatnYqyQCInmZhe+73JqDfIV)NiQ6qMIL(9V zO~L6FGgq8?^?{Dj2SqPZbi;&zX$ZuGCte^2p8QkufN8!6n7A4L|NHyr_phHnzJL4r z<@2YHAKt%v`{wnlmoJ__d-~+@qlXXf-@AL~_N|*Yu3x))1N{AbeZ0LqJ>1<~U7Vd99qjFFZLF;i!CEAvdoy#pdpzv-JzzPpPLWpqV9-h2Bx;sim5DoEE8FIblK;YE@b29;9D_~ zg=2ad7dsyZ=e9)?xtO?($~YIUVC`MMGI<+Q`)-zlyLZlTU&>x~Y~2Rq!zW6YGHzwt zW6H|7V?r(~GxI%WUOvW?{Hs5Oaq^V$Naa7PzHH8UV`pGc%PkeZye3ww1OJiPy3s}Py6Da_4KN!H-Pjh=%Z4lJE7MA$bi z>78!IWnkj4WraJ##~Ql^jfrhd0aF%vyP5iebN|Az1FoV+Gi&I1oWco+8=CVgewuuCyx z&iPou-&2y>niV~l&inm9@j^-4q-o6JoKCkQG{w}zV<%^^JXrH4n=xp^zPD#RyIJ@A zeX{O@xkcac47D>ReruCIX>5+#&1SrUyQyM@x|WB+gUVTKPF(lwWFN3h(Qx2-aGCR2 gl%Fj3jydl48yeX7nT1}sOK)KAWbOMQz{p??02S(cI{*Lx diff --git a/icons/blue_app_callisto.gif b/icons/blue_app_callisto.gif deleted file mode 100644 index 162765a359501d320b6d3841e2747205ced62e04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 588 zcmV-S0<--`Nk%w1VKM+R0J8u9ecZIx^5*9D@2BR=P0yJ@%aQW@_{{O*TGF7JS8fr3#pVxeoUmEduG3k>IFcU{L1jRW8UyKiTnWN^ht@zo9jXkb7f zkAorv;*{#+;14`-e&i77<4X~$S&JG?X`^gfhik$4KrZ0GZeKqf1sJGY*#e>ij}N}p znv!y*%9aqYjl!3^)!r34~mkc5YOtBhc=^yHwV&5!m*oRK1=LIVD@vjLgVSV2w%Q)${?d zf(eLG+bPM=t5^@{k^yXlbBBLbqAp1VlLhDv0KArFB4X9fXwTRJ8L=wSqPtW`;O<~> z4?~BJ1~o|hf#Vylx9ZrlA;$1-G*^aekxiwJgea4NSg9~N`;8|QigxhVdRgg$tslgct!o0suRsw*40X diff --git a/icons/blue_app_dexon.gif b/icons/blue_app_dexon.gif deleted file mode 100644 index 3f51c6bc5056a3e1ae5d07cf6a0dfa1527bc9730..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1684 zcmZ?wbhEHbG-5Df*v!D7qoecZ&!3AIFRop?cJJQ3!otGy=FNNe?p;?`mxqT(Sy@?P zV&cPx4}bpr`Tzfa1_lPj|J)J20SYdOC5b@V#=fE;F*!T6L?J0PJu}Z%>HY5gN(z}N zwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRu#Dgxv3?I3Kh9IdBs*0wn~X9 z`AMl(KsHENUr7P1q$Jx`$q^)>0J76LzbI9~RL@K|+0evP!Q4{M(9GDx(o#pk$iUD- z-@roO&{)^d%*w>T%E(9o3Y37h6{VzE1-ZCE?E>;_l`=|73as??%gf94%8m8%i_-NC zEiEne4UF`SjC6r2bc-wVN)jt{^NN*WCb*;)Cl_TFlw{`TDS%8&Ov*1Uu~h=P6yk;4 z0=Thx#d=`x=q2ap>Q^Kd=o{)8fV>1#=KlDb#X~hD#E>34K5C;EJ)Q4N-fSW zElN%WDpv+sRbb^@l$uzQUlfv`p92fUfQ? zg4-?5IQ8lS9itD5UZm)T2?5g(hzU=;Kn^_lr{)3Ed=W5lGyebg_s{QNKYx7x_Vvr> zPai+LfA{vy>sK#dJb(7|$>T>4AKbrp_s;EGH*Z|OcJ<2TOBXMkKX>-b=~E|996xsS z$l*f=5A5H!chBx!J9li~wsp(qO&d3?U$=J6>QyUOEMK;C$>K!|7tEhGch2ltGiOYn zHg(G6NfRgZ_x1L4cXf8Ox3#u3H#IiY*VWckS5;P&mz9V~xOjJZzNKk;EkC%s=i<5($jg^I&i4j;r{A2-^ z6Tp%MM1V>e2A2ODPFl{*KC~ue-v5LbjGRseVGe88s4C3SI3LfbSm8G#Vr|8-udf6iZ{a!cfN}n-AIX8GEl(?6NuOVC zeW9j;m4}xzij}#5lTDF}D~Xw@z?G|BA+}AKoqe(kS5G7ZyEubf9g{qpSVJIZdB7?$ zW`5QxzJ3O)B@36X-6h63Rg8}(_3-9E*15*94q`luc{LpDFB~`-xtw7eAKT8uWy?=z zHH$@X?&4X>ahOG}s=tx{4c|Mt%O@BPCvu9-X}r%h^Vdf0YxCHdbs7#$-Y~np=(v!; z76JW)^%j3SzAjQ{aBU9!`oHAQ?DT_iG8M{`?l7opifMGLKf*EDWwqjhG~NvzyC!5h zZY^|`+BZi`?V86F{(Y7^G>$FO6!&zr5_#^pLZ(XXq2!(o4J+6?`S=WEnLle=ByB87 zU3%mA(Ftui%iqp=Y$kANt^?b;su!jLyEZIUxW$~^nPOWRDr$G5>!_Ie@{V$|00mKw zy~$yVdzKbfhHg&edLqQkwa7tDV{4n}pF diff --git a/icons/blue_app_ellaism.gif b/icons/blue_app_ellaism.gif deleted file mode 100644 index 0936f88ba2d20536d41ddebaa8b865dc0bd78f2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 550 zcmV+>0@?jXNk%w1VKM+R0J8u9m(y{L&trSXO7{Emgv(d9-VImPg{=c$XZrq%gT4jzKyZgh-shq)0kl#mNEqd@!g_25(}kJ`6{1VzTf) z5Do{zENgV1fS?0^=LyX?X$QvvAAYqt)v1*H{dsVRM2& z&HzZX_#-R!g4Dp+zqK5tm4qh0a_$`g@o!xDih$FK?-*m?CD+- zM`|{paZokL2ttMg$gM)cu8=)_{&*4OX7n*!b|m!j^oR`?GhoczksvBdOCee+G`X82 o3I)TwKP)-%Be(}5JsQ+7zF|jlGAiK0X!Be*hQNnMB#!_9JMdoiDF6Tf diff --git a/icons/blue_app_ether1.gif b/icons/blue_app_ether1.gif deleted file mode 100644 index 1592686a1ebea766c6685c41bed658c9028021ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 556 zcmV+{0@M9RNk%w1VKM+R0J8u9&7823Bv0<%*!Ay8qx4Y|0^6 zsDxex625R4DCeqHLlE!0S1_pxqtGkz5C_YRp))#TfQpLwtiqxb6~W2{Aq?3|_W^JK zx`{A{TX49W)PPqIb`cY0p8RmCVr4&z0QZU?_UBp`Kc z9yxtxegz=tz`#9$RR}18rocsjK#qhN*p{|xXZjpKsCJYXq`i$^2Y z1&+nyVXU?a7;&>E>)nQEP6N6ttHEO1%X2D3iimu*`lOxb&sIj@L(C(|Yt~~_QMh4% ucJ3Gjq*O2f`ZovyN-UH#z9WEb;V4@A?s9R(YwH*iOfOb|hV=;%0027%uk#K7 diff --git a/icons/blue_app_ethereum.gif b/icons/blue_app_ethereum.gif deleted file mode 100644 index c3d5c4e1dc70b9a674bb9e74c88711501e93b7e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405 zcmV;G0c!q7Nk%w1VKM+R0J8u9^ZELJ+~uw4?$hz~=l1sw!_t@G={?NZ0Kd;}+2c~t z-7v}50Km}s`T76<{{X$uEC2ui05SkF000F4u*pdq5kakjp8p_-6pIoFM5V3`U>spA z&)#7G>}nKr?|TJ9ZZd%Vj=jSmH{c16oa1f**9fP_ zzyzX%BcuK)qLzcE3h0?N}2 z36~4CMIQ>-vH{;73b7ALZqpvLhr|T}mD21$&JNKC0rv~_AqtHE+;foNQx{a6R$Up< z#TcbzYWj6y)aVhE5@UFI5@Vu|r9lcxKhf)g!rze;7EOZq(nckXGNoLCSTkXrOb=xy zr1Zy!;+{q_l`dK{N~Er2Mo)TCSTpk zuq^(~_fJ26{`~*{Kf{V-#sAz9z5xm@i6x0Z+Qz=3ATc>RwL~E)H9a%WR_Xoj{Yna% zDYi=CroINg16w1-Ypui3%0DIeEoa6}C!= zDfvmMRzNmLSYJs2tfVB{R>=`0p#ZYeIlm}X!Bo#oH`&m{K*8Kn&(O@k#MDqn!N|bS zT;IS{-@r`Qz|hLT!pg`{0Sc6WwiTtMSp~VcLG1$aY?U%fN(!v>^~=l4^~#O)@{7{- z4J|D#^$m>ljf`}GDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaozEwNPsx)kDt z+yc01U13B ze0{Av^NLFn^O93NU2K(r=ICW+rdU}zI$AgzSQuNHIGP(8x>`6Hnz&h-I~tofx*D4r zI-A1uy5uL9=BDPA!1Sgd^qSz*3rY~V1wfl!Qj0RnQd8WD@^cly9=FQG?G{6v=0WwQ z;C71OOUj$6tjQ{`r{qy_R&mZ5vef{$J z)5j0*-@SeF`qj%9&!0Vg^7zri2lwyYy>t84%^TORUA=Po(!~qs&z(JU`qar2$B!L7 za`@1}1N-;w-Lrew&K=vgZQZhY)5ZeMTG_VdAT{+S(zE>X{jm6 zNr?&Zaj`McQIQehVWA55(yHR%&uz_+X=C zW~XbSpn*x)UUdgW9l7;psSFQatYz_D^CLomXO{>ALyqij*Y4vp9|efq`w{h%;i%1{ z%0>lNrVPG>rcQo24trogw1|~;dUkTNu=6sOH*#7uG_taB$TqQZ@vtncXknYk$jiqz zw~|%0iIX#3Y)+#OGVDZT9@+EBufDoqg;T%P7T)~pJ_T#XI9J!dLXDNr^f7~T77_Zl`bPY(*n`r(+84{)$sEF({y{dy4d1qT#7 tW>nvj`rPq}h3$l*cZqLw!beBp-DfUKToy=RlVh^*QJA1w}ph6)D@_zxkFOwz0kZz|xr)j_rLI zVzuPq-FH8K{`~*{f3nY7#sAz9z5xm@i6x0Z+Qz=3ATc>RwL~E)H9a%WR_Xoj{Yna% zDYi=CroINg16w1-Ypui3%0DIeEoa6}C!= zDfvmMRzNmLSYJs2tfVB{R>=`0p#ZYeIlm}X!Bo#oH`&m{RKeU*&(O@+#L`kn!N|bS zLf^nb-_Tgs(9Fujz{^~=l4^~#O)@{7{- z4J|D#^$m>ljf`}GDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaozEwNPsx)kDt z+yc01U13B ze0{Av^NLFn^O93NU2K(r=ICW+rdT;yy0|#HnYp=G8d(||x>`7y8d$ozS{gdKnVK7z zIXc4hy5uL9=BDPA!1SiT^_m;t)C)=wxdlL*T~doO%TiO^it=+6z#g~C#O)RroaRCG zrr>monJZ4c`as9%gQ6EHx?w`VGz4P86EBbhPyVTSz%*Y3Ox%qB|NZ^*``6DO-@kqR z^7+%p5AWZ-ee?R&%NNg|J$>@{(ZdJ#@7=v~`_|1H*RNf@a{1E53+K6ZM9qnzcEzM1h4fS=kHPuy>73F26CB;RB1^IcoIoVm68R==M zDalER3Gs2UG0{A;Cd`0selzKHgrQ9`0_gF3wJl4)%7oHr7^_7UpKACdNjF z2KsusI@(&A8tQ7QD#}WV3i5KYGSX6#65?W_BEmv~0{ncuJltHI9PDhYEX+)d3=E1t zSr|Y-2Sk8M83vaB8%|oz&Gu0ZnfE{8hYYJBOB-uIPPQSl`nfIY6IfoY(S2>u(wq>X zeXfnw_3@=_1_tJZg;CN<5y+EJ*abR+N^6+#&aplk&)5R@6KNl`51Y4_pz~e6t860WZ_{5=W9-9Jz8VWAHm9bwdHb4M9g)5&3PS@ z`q=ncA93$v-0{SODT$f8k8i@3v+v$#aIBr##ml7=!J2trB=nou7h?tghh5=p4=)x? z@I2EN=Je#{ZS{t^hZ~swZ%_&7FjVSI;S=E5Vtz!h*@Z7}CXb@RZ273Umlmiv{BlLEApU&i`vsY%bHZd#xKT-K<>Vhjl;ygNv zVwsH+3~WI;y&VQ`S!ad|F3FgXbljpjhv&^EgBR!4Gp|17@igoS+qCKXKAk)$^uTdJ zdU~L&j>FG`tNi$n7+3`GzZbbQY0kFjqYT`JObdOUYZ)Bqi>qF!yMxKpOQ?yVhyRn@ z0};k1Ro2rxtzI|AtzbMOv}D53Ka61+acXZTd^lZY&hR#&(<x?V4ESJ6uOPMOZXky$`@=;jm@6YSb l8V)H&E)CMl8XJU?O%BFtOG#{>BBi2`;A9{cB*4gE4FG-8iQE7H diff --git a/icons/blue_app_ethersocial.gif b/icons/blue_app_ethersocial.gif deleted file mode 100644 index 2df10f438eeacce3074ad2528bd59ac9f59ff9ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 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 TF~;!orLbd(O&`e}04Dqce2tcB diff --git a/icons/blue_app_goerli.gif b/icons/blue_app_goerli.gif deleted file mode 100644 index c3d5c4e1dc70b9a674bb9e74c88711501e93b7e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405 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 bgv#)jxg=7A&iM`DUY+gvGb;R501)&yYlg27 diff --git a/icons/blue_app_mix.gif b/icons/blue_app_mix.gif deleted file mode 100644 index 38cdca838b3205ed5edce01cb6d4cdae55cb1e3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2022 zcmaJ>XRPL)h+3~wtF};avxzHqKP-Je%)IY^p6B@=@ADf; zvX~1iSpW+-2mp<@9>!g`Ju@?-8@mS#U7whGI{Ih|=)ZFK!4u%**u$sKfWFJX=*0B& zwA1MXPF)RhlCorSNTjqVUGJDUt5K;cKrB!$lCRYZsFO!~sgPDJpf2Ia7&4;}(P*XR zCM2^wO`$3;P{C?yTr3o0JR$Zaq%(DupO0^*u;kowiFr5lLhgb>()CBhj z$emMYFd-0!78RjlMslENn8u7^N5XJ8#9}bHbOx8sWJfTgc##Yqiv_({R97~WI**qj z62HjhIti#6i^a&J(@RTBX{BtM!IV#D!Z1u{u;?sSgbNX2F4J3-)(E{hcveA#m{lgN z(V{izA-AG3*HCN`P+gV&w*{T?rL5jed)^LBWzf;BN+X>~W4K$I1!$wFu|bd%;!D zU5jW=F5OiO-F?0PbKSEcmxtWjm*#aHUfLhgyF71lnH%N&_p_O&zfDj5`pc8YkA8mm z)8vm2?%%t6=ZD+3Zcf}7zkcoN*p5r_Mhj@j{f8CBWH$(1_w@`I(ef1 zc%P&9n`2)e{p!f!LtlQ;bMV0a?$7sieYSVc-#T~i>S%AZ-Jy`}lnZB30^8$PM8 ztKCxb@kiC0t2S-iuzuZ#Yb)1O*#7##>c6ZiFSC}G6kE)uBBMdCD=c_ltI5wp)T&%% z&U-6YEYDuHG;7J?MT*Rfcjf76vW2NB$x?|pNhC~6h>wdE#PE4AH#&+F$!0MbbXr9C zJ8!=g_U3}nkYH*M^ym3+1it>-tMdZe~BBQEvDuLLXV$cA$$Hv%bG@9zUEywte*G z5dcrxY4In|E2$s8R?}FHc%aeW2Zn!j)e=^yL9M;Z)%3-4Ji#f3&;6&)av=%B&(2U{ zaGP*=*C6ny<(W&+)(Yx!6qZ87HB;;qY&)?fy-u+fZCFLdw_w1f zU_ER1pzYXdJDyxg!5J6pfNX2}Flk(;2$d6W3Pi7@ zY}nX&);?fcJ#*?9+&bAP2uAt&S>plQe)O-2-*!rYj(*c`erw6z`sR>Wj^}E)l@XeZ zyJ0(?+El-TP`ScivB>-J=)Mi)HQ~07wD&6ZP(FUv+V&{aR><~sj5qk>!%;*zb)F+x z>zj!~pU7tHqx)>T3(Q}-H%*ZX34#}V7BB>O;~I9!i+_6m5;Zex@TT2fbx;W8b8Al> z#o03C6}m0_>+guzrV!JZZ$bK|tW^8x2x+uhF$vRK-hgusX?7pT*^^hJ7x7CVdNq?1 z9YK}fSQHAc@J5<%7moP(YXVG{1}B^RsGY1$R|h}s1?_UDwy0wwGj%eo=VTP6h&|-x zaV(b%5OE$=uc*)B5*hJ6rHP_opD0g{FE@@8v~_n5)o4nX3}SjLT(`Nb4ZsC3vt^G0 zLwQ@wIGK0SiBvx6eE-5ydn0p^4BvcxICZ!N9G3EK7A;OB6dl;{TK33#FO7Qtp(?aW zy0xlcXJ^P7Nm4UsJU5}6lah1hYc)Vf?yMwu9+ca?Q+%5o4d@@^2e$x{SR>_wZ$c8V zk`()QOP7t;d%Rwo(e-$Uf4;)+vTSMs90wj)kB3>YAh-~{KvutV`v&k%&9-Sm&7G8{ zj=?br8tfjdEQ>vykJlA81<0OEb@#124YXb?3QHFyBmt>h@ktETKkFJx5_7ALa__#+ zy3Z#XQuWLF_w_l5J@ZL;D06}(#%>)@(u>v7o^8jpK=L}uaQpE|K7rf~dR>X{4C+mg pP8s|g2F^)nMHA;vV?qPZfF}kD9gY~%>70H~py#0x;{yQv{{WO%02BZK diff --git a/icons/blue_app_musicoin.gif b/icons/blue_app_musicoin.gif deleted file mode 100644 index 42f81851016f0fa7b55f7539a3b81882e0b07e05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 521 zcmV+k0`~n!Nk%w1VKM+R0J8u9{^Yj){QCXFUH$dv{_D#9*OdLdN&MZW{qfxW%XIzH zhyAuV`|Z^E`T76<|NXHmEC2ui05SkF000F4u*pfQWF+g&N3dX6Ax9!SXsWKPkQ|68 z4u`?sIBpzrbu77{Fl7Mr28p3^m>7fxwxu*@a9X0%Y|En1dRYYu;!9S=B+2q45pV#~ z%Yw~ehb?ud zD9_b+tI#;jUa@?4sE&EXIpSK3D1wTY4ngcw#3}A6o({Gv^-|AJP+GP^fv|9Dw5@SK zK+C@+8vqD;MXO;)O#qJNnaQVs16=lm z7&wNYfC&LE006LfZ3)g6Z4i`v&}Qk4qbmd<7!@SsJTFjFEa1q5;TM-TD1k-9>I)|w z`GTmr=%oQw7J|U#c%)8?fd)lWNF&gX$R(#Y>nhe!WJ1|@fDxO%5X$uHH z6o~~G%SbiWQMALMHZKolZ-TzBV-Yt2dUOnOepd+xJ8^wrhHywFSC1Z)Q3L{vgdmnk zGfQdwjbx@c(M0!L)o~1?sQiY`m%gUig z1RN0Lbtc#&01jL%YHTZ#HWHlnP&hEm9TsLD^s8CbO@o|02*~9zMg`xzK&emwFc>k2 u02PJ+kmwjj0VWm-G|tOlOym^8?t&$^1LIGr_bAC~(f~lUFZnB|?fr7cEo}rn6iK(HEf{}rt zxxRs^zJZypfuWUwg_V(^0u(3#Z7WJivkG!?gW3h;*(zm}loVL$>z9|8>y;bpKhp88yV>WRp=I1=9MH?=;jqG!%T2VElw`VEGWs$&r<-In3$AbT4JjNbScCO zxdm`z^NRJr-qB0W&(*I;EYLU9GXQxBrqI_HztY@Xxa#7Ppj3o=u^L<)Qdy9yACy|0 zUs{x$3RJEPvZ}z!xhOTUB)=#mKR*W+iUAqicFt@ZcGB-6ebhU6YHFI@#HnDJVb#*gy za_=yk-Y7nC4!3xGDeq!wkCrKY$Q<>xAZJ#LkW+b!le&4cPq z!R;0coO<VgsyL#pFrHdENpF4Zz^r@34jvqUE zVojbN~+qz}*ri~lcuUorj^{SOCmM>enWbvYf3+B(8J7@N+nKPzO zn>uCkq=^&y`+9r2yE;4C+ge+in;IMH>uPJNt12tX%Sua%iwXi?qaq{1!$L!Xg8~Em{d|4Ay*xeK-CSLqog5wP?QCtVt$>kjW@=(=WN4tT zr>mo_rKzE=rmCW>q^KY-Co3Z@B`F~;CMqH&FX#K^#)_>+YJ z1av?IsFYz~`M=?$<=kwSg$48eC%j_T1oPV_#Gw?_wgG zUQ_MD!eqx^Rn%F?Q^%KI(_P5G&dtkM(B;*{!^%=wJ-1KeyY z+?OAOA6o46X3?=1#tcWSCYc)+5fdIXG&XSmKh~JMpl|VnEH0K7m6ac5Z7PM@JDd(Mu&P;!eY5SJc8I}L zo;AcTQh5S{QqEnT2$cyJnU1q_6cxBQ3P&GxUKt>ev%+Cz*s_aGa$lT^B<2{fZQ=X! zk&BPPjBDT0#+O2YGlb@e-FxLEbZTdq^ztpzJ{1Lei<9$Hts9sYuRT6N*;{Sm;#U)y z9S%gqoZh)Pz4*As&pmHW&U<-zMeu6128EIarjyS^=J{5C*t&-C*eCAiIorjZ__$7d zo%^nH=ffk6eSeJjCkIbHb={m6e|{#JBWXt&&89do2!9R~U}Ufc0Q6Xc8~^|S diff --git a/icons/blue_app_reosc.gif b/icons/blue_app_reosc.gif deleted file mode 100644 index aaf46981d391d1f92f549a4a93463cec95d16387..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcmV-W0RFZTxp| z|HHrkN`oC4pUE;oJoP(0|W!e!$<+6$OfgP#31H)2DL%Cv-fvD9fo@c1poaOL<>>? zm_c6z?5x@_AQ=m70~ZC5#KGPqMiduqFhtJ~fLe9^9BO<}Amauix)zwzC#2v(g9n5y ze87N!2w2+)6ujud9==%sCVAW7i_Wbe>DH_(CCmW=oy8nD^I!;(lS>g#%4~t`5r;@Y zyE(|Zq0!h*f({fkSDx=hHY<{cAL#4lsGrEZEH7* zK+}H$V7=ob;Y^DI@qW%SF#L^#sj^@C`$t^?YOY#F3V|bmoAw)6Dm3|iy98_U9G0A5 eiJnN01~t&{cn?N}#2ECMV7UHRM3fT|0027!v;&d= diff --git a/icons/blue_app_ropsten.gif b/icons/blue_app_ropsten.gif deleted file mode 100644 index c3d5c4e1dc70b9a674bb9e74c88711501e93b7e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405 zcmV;G0c!q7Nk%w1VKM+R0J8u9^ZELJ+~uw4?$hz~=l1sw!_t@G={?NZ0Kd;}+2c~t z-7v}50Km}s`T76<{{X$uEC2ui05SkF000F4u*pdq5kakjp8p_-6pIoFM5V3`U>spA z&)#7G>}nKr?|TJ9ZZd%Vj=jSmH{c16oa1f**9fP_ zzyzX%BcuK)qLzcE3h0?N}2 z36~4CMIQ>-vH{;73b7ALZqpvLhr|T}mD21$&JNKC0rv~_AqtHE+;foNQx{a6R$Up< z#TcbzYWj6y)aVhE5@UFI5@Vu|r9lcxKhf)g!rze;7EOZq(nckXGNoLCSTkXrOb=xy zr1Zyl-)a@5TCG~ERST9jov7IU@OXOqe$2dg-~H})*B7aa2t_d| zAO#Kpz{FLagOh=dj*i@Y#;T^0`l|=$lqx|BaJjXy<-rwo7VzlVy^^D;?d|OjheMtQ z_&Eeq^iiM|qcP?`bhzDu;fVwd8i?5@vkH20Q61z|?YKq#5LQ!IhN*D7?P3Q{{SKqse$vJ#+7 zEEnNO2n;GvF(QXUWJnMwg%O1WmPuf_2u74}s8Wi6Zx_U{S&g%l(b|Z&T+B%YCD61* zDUl>6CySGV#guin1VK?$0!t-Qsff`K*%p{-%q}w9`gdB;5;ojwvd|{V3_2}h25KIy zf*4QVgg{#K`gexSHu39##5hGt?3hJ@h+zpyI^%k+ZKI=!f82Plwk>9Xg^)xOHfo*~ zCm8kqonR(+A0~1tGTtc1Sxrn)up}*o&m##lt<$O?=0WyhF}<%DMW@@C@c!W zF`3AKW4MSgpa>2lL@*^rUn9ZWx%uyKy4S z%nVtXVPQG``m^JYSM6=TzkKohw`Wg(ee%oWM-P8~aQ~-!cYkcXbGzl%%^z-jfBo9k zE0-@_ym0>9+3(JL`%QCGW5enCQ(vDv@m1aNFOMBPa`;f~7oXQ0JWyS=f8S?&_w3%a zbI10|ZCkf&t|%|tw6XNl4JF0v*A=Z@v%0V#f7Qwr%a<+9%gxDNl9ic}zIf5XwA7RZ z_T>5VXq$Deg));#iE~T|vu6=T+Z{6a5-!i0Qj|Y0p|*Gew?osz;*0z)NLepdYw4z=%@D5;b_dRv6I4u zyz;eR0%XcQ4+ubZJ4Nd_60>BEEOEM^^6n#>bb}@|IZc1_H%5X~ig? z$=!4{rMr{1_swfdE5m!#vt4-!Y1wiXAjk;dE=h~cVQ~U8W*2fe{K9Tw#3~zqjhk>o zHcQxpQ#Oasa}x;MN-BA-f_15R%Mg#+)KW_&xwT?bWuHpGp1U|JUpO_5zvDpny<4`~ zR`X7{)sA=VvOA82WM6R0a^dm;_R4%-$Wx-bs|%mJbp1x*VkY$3QSLiuR!?Djb?qH_ zrUm7wqkJ0HHQzqD1PEND_6%$FTb}O-kVR#4&gBcwy-MfGq6+u%OUDMKR#!J?a7I7Z zLzkXbj`XaqFS_tD9^m*I;#dQKy8B)wg6C`Zv~P9oCXmFrx^pgu?}7YHP3o9g(U~h) z>{mg{bNRxYX*<@@xxl3c|2f{}yB?;`h^(DkQ<37`d}=Ve$_ot@w6*%uQ+_msi~tW@78FwcKZOfj!gQTap%J#I7XU>bwMj4}G~!+n4s5 zf5=1M=$IP28O^J;t!XP*6(8ALGhUZsTR5>UAPmlInSQpdvVLGV7b=r?s8%;X0sdfx zpXaoDIbAJ7UGDVkepSu22biDbdKam!2HhB+g1Wpx+zh}YD%~ZU&6%Fl>K^A^7bcW; PRCCf4Zr8%Nz>vQI-)W~5 diff --git a/icons/blue_app_rsk_testnet.gif b/icons/blue_app_rsk_testnet.gif deleted file mode 100644 index 2fd05e6b7cb4ce4e3729bf02274559f269754854..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 721 zcmV;?0xtbWNk%w1VKM+R0OJqDNJn z0POPSnY?@X`T76<|2BL8EC2ui05SkF000F3u*pfCZK)K(y8jaOEffm|oj9eTx#t zl|qvJ9Sjb1b>N+HAm(%j0~QQ;d0GzzV*(8ZXlw@t4hstocZXU43ydZNk7)s#0x=S2 zm;r+gjHYyZ4uyhcpKMV;vU#C?YKo4h3>E{kT?fCH50S5ixCRXith8^eQ4IycX$l!M zdBhHm2m}WJ0-l&!8>f;54-E(hZ^nlK3|Xg&3=0L43FUPL<)M`XY-(f;R1AKRf}k*< z44t-e37s|kf+oPkHvaf&Nfiu7s2~0r=sn2@QQxL#53rrkQ&uhjl!GU<3l?5X8X$(Kg-S&_wtUGY*AWK^0K~+1bI?}= zJYW?3!nLJ11iu;}2|!lCFStcx#`NM8)UQdETudTRX%kqKUHYcsmW6={N>dXF5W8%f zq&wUU{9@>?0aJt9XbLK90s%uRh!eNnT3F12H?J*F@$*@A9t7h$(I6WJ>>F~l3_SEg z$-sgJl*uB?cPlsmT7NG9U4Zt@iBW4k8d&Ybhn-49OZOnqt5pwNO7Q%)cWg;K9|#Be z=ytIc13CXR$=3L#fV1pw&4^RmAu4HgihCNl6ht-rHK@fKs{rU=OV}_{l!Plikl_h6 zWSCf7st}Zh12&LYA`T`dCdw59qFAB@9lDrUB5;@>M|LKrc;b#NJ-`PMXcd&AjveNh zm;#De5!o6%ZU|$HO)+6W0yU}-1Ojs*_|Fmw3{XH2R`fAR0Sv?-1A#k?M`e`~L;wIg D4Wl9V diff --git a/icons/blue_app_theta.gif b/icons/blue_app_theta.gif deleted file mode 100644 index 5056f1b4582395d86c1d817051c37eda89b9d10d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 346 zcmZ?wbhEHbG-5Df*v!Ci?fbWu=TDye`e}6i()>5C%AP#@_~(!P&8yM(Z?Ap-_W%F? zDp$@kAOXdnEMT4vhy)Nxszk4_`gl1|v71ZRMmTN4S=Jw!Tg}B6K z7M`67c@9>pEgmt4SUjv^k9IQtSX0Kfr}ONoyDVx=>naq3bB z&$^blbR2yB*-^62quNobxg$fmwX>^7wqIsq#$@iPQlO`) zK89=Gol(kCBjCWBASPRAg2+~2fodF+P!MtQ_(iWB!A?@cegdnYA?5uP9M&K)Tm}dd zj4rakc(?+BynfHuG0=R0X&e?VQ#@1(h!hJS7cByH4wICW6bS+j5|x||C2|}XEp!Ad z0dRFI2oec4V}lzREpRLaI|v#B6R;i&4W>#AtyzkH0~|yLHj&Cm1Pp8d2NMV#(+t0^ z497^TM*~C++#8WxHw$)24~+n0n@{8jI}QiD009iuNV;+as5D<-Oi&OF0I4La9yD0M z5FHgz90s7O)6gN51f43)8^>WXR`Q%=3SPAyn$`gd vT#E@Oz`q=tU?e$*B|O|FAF>FbT0gY0$!;Ssdj$jq1Q}5dZ)?h0Eg3 diff --git a/icons/blue_app_tobalaba.gif b/icons/blue_app_tobalaba.gif deleted file mode 100644 index d1c438fce85bcf3a2917dcd73082c83ce3c5005a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1773 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 IF)&yI0DrkwX#fBK diff --git a/icons/blue_app_volta.gif b/icons/blue_app_volta.gif deleted file mode 100644 index d1c438fce85bcf3a2917dcd73082c83ce3c5005a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1773 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 diff --git a/icons/blue_app_webchain.gif b/icons/blue_app_webchain.gif deleted file mode 100644 index 50c5b1f996ba3d6c74671612b20c547758b7fd24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1554 zcmdthi9gc|008h`L&*3Db2T|~wwc)|NsQT?tGPzZv6`%lC668*+e|c-VVNi_HWFg4 zl~)mxNsUrorRE4r2cqckUhm&{-~Zw3zdi?nIj

o248Fqxv2%-qn%m?*2|50nV7fZJvZ3-b7a%aVI{=%_n%5Z-~2Z zsE1z|#y`w6faDbzjwM8R@80XZClW`D#1o@@g2=wX(S9K@{-Ln}VX=XvxZUCVhncP>-g@C#D@p zN~6*LJd~V~n0h)X?F>DQaXce48QFQv94_k| zHYLm;ZFtZAsa-XN^KSzXsuQ!l<=-(1_!T-VrI-_%ww zZf|IAzu6*bY`rCJ>u9}or@iCe?K@rfx*y!{?eBgd?dconeK^o39qfPfMEXcJ@OWrY z_Vn@4vnRtNL(iT+9T^>Y@$&CiV=rI7c{TR-^&9!v+wnK@iMQjE@`8W=! z@1|#`XB0EDidn^b#rrwM+=usbA3uKj{OR-j=lO;Cg~f%%FN%8X++4GS_yx5HJF$ z=Hwtli>}^T8wi(klJDNet%$aeafWxh;-_hu5p8hfQs$hL0B(=72Ll`U z98o5nKrvM2SCx|JYpWDnC4Tj=Po6xvM~2x-Hap^eAIGL_BGayH9lgU8n2=*zl*eG| zfOe;iqy;l#I_OxXgy1`Qdui#BB0xa6d{`BWkT0sI6Ev9tmSD}e4G3!_8;3XbVg(R@ zD&~MOt%;SZ3hwoUVxjD|hvwOJtN@+%78Zk9CI@wsGUQ?vEc!%FjHN_*J;PX1!O}1V zH!%Wi&0Lq25Im$FroaKoQ$eI7pWVlht}!(>Q6TeWYT$mw`aDTvGJq|W@3X9s=s}*F z04N>^Aq02IEF~*kn^Mk%1qVp@2vD#^a+VS{O3qTn!n~ziBgtP~`s=FYC=hlvPVS|O zHI<7w>%ce`4B!s|FQAf~E~1*GMhvr(EOpAVfGZ3QyJB&c5~9?JT~`H=oiAaja!?ClPoDS^d%pM44NYIG+qOox;6L2q;XU>5Qz@Z(q;ENHuucRhrL+$OQtdspCYB<(Jh|VsMg@}A!jbE5R*z#m0Q-tfPz7d=CZ@t`t+* zrVKHq4PnwwZXt$juQmGDH3jI+_U69l^p<6}c%r_8-?96Qk(EJBt{Hs6rAfhdZ4!CR zS>Dz1sX6lcZtazw#;wAMe$kRMW+pWR)>|9Z@OgQ71!)!vHRh_v^UtYWY_TR~QN_eb zo7)=>ZJh2iv*pCxQ#+5IJ6{%j+}hdpvfw_0JL#79PA$FtaMk0m=gtq6Z@S99d29Fd J;}=c_YXH;4WQPC% diff --git a/icons/blue_badge_tomochain.gif b/icons/blue_badge_tomochain.gif deleted file mode 100644 index cf7c4b5683be4428748440567d231c8fb3c7d44c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1080 zcmV-81jqYFNk%w1VKM+R0M!5h00030|Ns8}{{8*^{QUg;`}_L(`uX|!`1ttu_xJYp z_VxAk^z`)e^YilZ^6~NU@bK{O@9*yJ?(OaE?Ck98>+9<3>gnm}=;-L?=H}()<>ch# z(^ z($dk<(a_M)&(F`!&d$xv&CJZq|Ns9000000000000000000000000000000000000 z00000A^8LW001-qEC2ui05SkF000L6z<_W_EDjTv52_`b&19|9r;;#Quh=1C!*Y7R zVAiIZEgKmnu&d;Y+%w~h=YqB7+2o@$^A_sU^6fjOP9e;-b2putt6pup# zAYLE_mP7`bP9X!21cNg!4n_hE7ak)fCL0%|cmydfW+oP62$A^rVkpj!~>O(XmDFv*fwoS$AASMhyaT$w1irdHzu^J9v+`~@qxYjW^sTdMG6}*Ac7E5 yD|iO5;DQMrXn+9*8hBuWxlWYO>A?XsFj^QJ6w0v>6!_*su`QsWVyk!r0RTIEkI$9> From 469dde2722ad6df738e1ff856acea26494446ede Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Mon, 5 Dec 2022 18:23:45 +0100 Subject: [PATCH 02/85] Removed unused PNG icons --- icons/akroma.png | Bin 2231 -> 0 bytes icons/artis_sigma1.png | Bin 6103 -> 0 bytes icons/artis_tau1.png | Bin 5369 -> 0 bytes icons/atheios.png | Bin 1824 -> 0 bytes icons/callisto.png | Bin 2866 -> 0 bytes icons/dexon.png | Bin 1723 -> 0 bytes icons/ellaism.png | Bin 12127 -> 0 bytes icons/ether1.png | Bin 2287 -> 0 bytes icons/ethereum.png | Bin 2117 -> 0 bytes icons/ethereum_classic.png | Bin 2166 -> 0 bytes icons/ethergem.png | Bin 3455 -> 0 bytes icons/ethersocial.png | Bin 2849 -> 0 bytes icons/ewc.png | Bin 2923 -> 0 bytes icons/expanse.png | Bin 2358 -> 0 bytes icons/flare.png | Bin 1208 -> 0 bytes icons/flare_coston.png | Bin 1181 -> 0 bytes icons/gochain.png | Bin 2801 -> 0 bytes icons/goerli.png | Bin 2117 -> 0 bytes icons/hpb.png | Bin 4172 -> 0 bytes icons/kusd.png | Bin 6650 -> 0 bytes icons/mix.png | Bin 5349 -> 0 bytes icons/musicoin.png | Bin 2251 -> 0 bytes icons/pirl.png | Bin 1559 -> 0 bytes icons/poa.png | Bin 7280 -> 0 bytes icons/reosc.png | Bin 2624 -> 0 bytes icons/ropsten.png | Bin 2117 -> 0 bytes icons/rsk.png | Bin 10573 -> 0 bytes icons/rsk_testnet.png | Bin 9847 -> 0 bytes icons/songbird.png | Bin 10782 -> 0 bytes icons/thundercore.png | Bin 2504 -> 0 bytes icons/tobalaba.png | Bin 2923 -> 0 bytes icons/tomochain.png | Bin 19947 -> 0 bytes icons/ubiq.png | Bin 2058 -> 0 bytes icons/volta.png | Bin 2923 -> 0 bytes icons/wanchain.png | Bin 2420 -> 0 bytes icons/webchain.png | Bin 4239 -> 0 bytes 36 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 icons/akroma.png delete mode 100644 icons/artis_sigma1.png delete mode 100644 icons/artis_tau1.png delete mode 100644 icons/atheios.png delete mode 100644 icons/callisto.png delete mode 100644 icons/dexon.png delete mode 100644 icons/ellaism.png delete mode 100644 icons/ether1.png delete mode 100755 icons/ethereum.png delete mode 100755 icons/ethereum_classic.png delete mode 100644 icons/ethergem.png delete mode 100644 icons/ethersocial.png delete mode 100644 icons/ewc.png delete mode 100755 icons/expanse.png delete mode 100644 icons/flare.png delete mode 100644 icons/flare_coston.png delete mode 100644 icons/gochain.png delete mode 100755 icons/goerli.png delete mode 100644 icons/hpb.png delete mode 100644 icons/kusd.png delete mode 100644 icons/mix.png delete mode 100644 icons/musicoin.png delete mode 100644 icons/pirl.png delete mode 100644 icons/poa.png delete mode 100644 icons/reosc.png delete mode 100755 icons/ropsten.png delete mode 100644 icons/rsk.png delete mode 100644 icons/rsk_testnet.png delete mode 100644 icons/songbird.png delete mode 100644 icons/thundercore.png delete mode 100644 icons/tobalaba.png delete mode 100644 icons/tomochain.png delete mode 100755 icons/ubiq.png delete mode 100644 icons/volta.png delete mode 100755 icons/wanchain.png delete mode 100644 icons/webchain.png diff --git a/icons/akroma.png b/icons/akroma.png deleted file mode 100644 index 22baa92a1c6bde6a39f139e65916a138a39891be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2231 zcmV;o2uSydP)StCZJ3JnE;r8FahZV2@?Plzy=L>*WR_|q-lt=)1^{#bU8G~^5>Da>1T5iz!B|BZrsK?oYfBt}IAX3T$`nX{ z5ip4*2)L$`6}AW+i#fD$Wr+oheFmcy^`0ve24&z4NDAYeOo2qvmq7}p=M>1p)EY)B zkU9Cx$hys`)hq@i!UzjR2gr4V;SNd)WGC+p4UL!)VYrhv)2TTSmQBR~?q2pEa`c+y z)EUlK0EM^^@sHb4k zd64uiTgXAwQE)j>0ud&c7Lv7goBVQeLSLh3$$O^zISX;pN`IM5$WI?Xk~i1a&TpL^*{%zGWE-{Aex;*mJcx;>m zL^x9hiR<`551Pgg#1T=xpPrJZ+gq~n?j2cwUz|T6&TzMeL}69p2nX`w`sldg#VZ|( z{rcgP-fC4yxR0B8^$hH>?Q7CtP zcek+0my1UH{$*!}CIwkF3*6qu{(c?cYy*h5i6~jQIxQ60O7Izg`0wzL#vm&=ozAiV zX?X=AyR9`1#UM4Ft5t;00kRAyFa4%)Mx$lvt5G1{zM)FFMOW*Sfve+ibb4b*D3+k< z*>3nex=Oi4fgP?$c1LT55NT1FdbQi6 z%*u4xFgvS)l{7+}#Hv8Fi6e$q1-B&z`1K0Jksv@+Q@Ta&!KN1`pT{)C#&;@vwlWA1 zRXt*3C8h-;-d~i_VQ!^L>2E16i~ix;+g6s97Z+4kg$5&5!DP+V%Mi;>f5QN=XouKZ zR#xnh7gBJSDc3M%2lhs&6FoaB5KZHVDs};m*kqKyTbWRT0Wocdm{j01F<~&ELuUaV zZ!)4qZ<-7&KM=z-*0#O?h<|&%*Y?P_e&2ZM>S|bsZRgjb^&+10+wn0413&;JwoCFX zr>v?y7!Z~FX;`#SbTc%S{)RH=_+5n z=xW8h>70rWNqj7{&Jz@5vb*^!Dc&VYbyt=u-XJzSV(qWtDo8HkB5}kT#F*Mzh)rFQ z_qnV>59_eF^`Pi8u^urk7U$;c3&gUn;P;AXn?74rkCltOhxKz>lN7f7rS5O&Ig;Qm z3krd9<^ODWO^LUbV7jZ3ONLFCy z?o7NT4K)iC6Vi|KIz{XbgqpMhkW#kh(Y@mqN}%nK6cFkcSe8!3?Ly==TLCVL8@McN z8qg`jEkMbOq`Q3iD6EYabv}#O0Ex#KKrTti&jCR(2QXOy)g;Xo0l7#JWjPuRBC=cK~o3J_clwIGA}61iqFZG;+1 zFImQolbr#Qnu=KxaMG&lZF{EBH3NrZn|+B1g1q%0T$Xt2^w)0JdPXu&==MwuNNt`G z;tG(MAVAQP=Yq~J8knwAUU37n+CE##6(AXwhpL@EtBM1ud||xT1ZWHTeBjsflJ|)a8C<_qc%a=5`yNn<70ug{9jW{7uv;jG++VKF&QyIw0 zx-DBkSeoRhf40RRe>AgXunK*x6%;)F`?d6!=R?k-euB%4&Kpvti1KqBbrej-I?tf$ zM?D3TIbAmt{S*)zMqLGo9dq6&K3K9GF?+Bid*fl$n>RUB!N>%{pbW@#L~$#FW{zIt z<`0H#Bxi|jg)0Too<{pJGw zz{JJ3U|G@KyqB$CL6fRv&BZcLQ0>ofh{MX^!sMOIimjs7yu~)uYdJCo0k9p002ovPDHLk FV1iz50b~FG diff --git a/icons/artis_sigma1.png b/icons/artis_sigma1.png deleted file mode 100644 index f6b47b129dc3584859e9dd56768d275710eab8c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6103 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 VNAn&gkE2iTM*60D<+`rqe*ocal!E{O diff --git a/icons/artis_tau1.png b/icons/artis_tau1.png deleted file mode 100644 index 388009a32d42982f0f02677609b0dbc300be0fcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5369 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 diff --git a/icons/atheios.png b/icons/atheios.png deleted file mode 100644 index 22af8d272b175d1e3c940f5779fcc563b78aa842..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1824 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 QiU0rr07*qoM6N<$g2><;jQ{`u diff --git a/icons/dexon.png b/icons/dexon.png deleted file mode 100644 index c6a934a8fe591a7224476c5f1b3a763658f74878..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1723 zcmV;s21NOZP)(iCiT3ySks%n%{3#C+T{hepd z&OfEpUMbZXZ{gos>*LkRB`1`ss-V!9#-Fl1IL$r{psm(=pYy@&P^zk$83=2o)L+(z z@!0|37(gBS(*O#Gn@|Kl1j2y6Bi|{d8m@9Xl^uD4zcB6z1m-Ol9BLr1ci1w<94g?f zI4DLr?H>$=?NAYy#XvEw<56L_zN2V0Q((+YTzzy9u7f&TWQStHRVM(v4&iK-4T=Hs zXq|bgCxH8w_(pLC#> zmyo9s-z7sa{Rm6O*6X#l4QhHyI?yugf&_yWn35K>4%>FS9Tybvbt)8=egp~ zI;Iw+P6X`BQ!3y9hyJCGg2EZLpbxGy)eXAo)`!Jz9g7!#{;n+=+~1tHExo^0i3Yu~y}VO{_&SO608%3d?i~CO5HA;C8sKg2I#=7VELT%LVKzH(&qb z0*;mK5q`XYVmf&8he0iN&8LbmMP+~2g*K#$hQ2%YoR~Zj`_hHN61rjv5^Gg`4aN#* zX#6l#88GEG^c%2N#UzopE)??3bD{l&?Y>x_5=OAF`SS8|@!8n)4i+}2PJDX2bD@xK zf*6vUV~(jJ*Frj6OkjL}f0N~DNVZS#+VD7SGbK$tMw*5IwJm1$7E@3u1)EVKuX-p; z%7jDY=9ps&s<+rdoDXnpp0IG7GP6D6n;r`3C_Yqfj`_#O$3-E$y}d=JgNcN%udk%e z8WRb`o&ITb|Hp(c5^I`9JwHF6CAHaXRM+tz>BwR0_4@27^ZESZvx&Co|2x^%Q>vO& zV)*JkW#Ti&`|w4w!blZ!OYG=vr|2_B90u~!6QWcnB}(FuJQB`}H6&1|bbN_}M<4Li zaaa~8lq22}r&)ZSGGmbqO6>fW&r6(;%=Ozzp~TkUm>*ce)cu&p%z|fwLbcvd;v!e5 zhprc8fkL%1SK@N;)cjA}U6}@jTLNEu;{?TTm>`kUpiu4hNL6l}TZ~c_6yefwJQS>R zOWhZhx~j*y8IN*mC{gspL&+t9V}Yg?Y=IIv4oZmJ4E3qaoqK~fRX9$FB5_bcbG*Ox|SCZ{8%wBAh5v5t2#=0Rfm?B+LZZH8}2YBuYXE}!a4mSFG`yRMP4aL z<8-eSwE7o$`Q|jId-x^vVDw&@0%WtQs%BA)z0p$;2UEddHH`heBkWMl9#&Pg0R;Y( z?ZIjGX+ji$*mFF1%Lwx*e(NMH@_*R{sTUGhLc4m RuZ92s002ovPDHLkV1inBB&YxY diff --git a/icons/ellaism.png b/icons/ellaism.png deleted file mode 100644 index 9ea64d0bd12968eb87a26d11fd818c5846c02057..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12127 zcmbVy1yoymvv08C?!`jzB7xxU?pB~sECh$3MOvKVPH`>n6qgn)S}0B_6xSA~Kyi5C zeCIps-nZ_3a#<^|lgu9d&HQI(6RD-4h>P_U3jhG%Dl5t9ApTlCzA&C3e!Hxv=m7vY z5Ib2}Ejc@P7e@;p06-}+#lTBX_k#T4Q(|Z+t_2p+A0qh#&LP_1Kt~tCBtQ^>rIMDb zt}44B`ZGLg(&{L~Mm(*ks4`Eoi;9i#7uhqGO9j7g7?7&(a!y4%c0OGkwylicEsl5W zI z8|2mPvRfg5iI0j7Mfd0vzQ)TpKD7A^NZstDn{0p_G{9o9OdZLD9U1}S&<-|I&IKTh zgp?E;=_Lz5Lpbkb^DdUxCNOz?oa$J=0|4Ob?Pr2u1}t<@4?eVjBI~=tI04mfd_0H% zTvGdN9C7N%`Dg?zMZzbT035)2k|9Rf-ObgPpL+cFvH6S~*nvD!_Lx^|bpQ^)l)|&f zc-_GexBf&Pz!?A{UlpOOy_F>6J2m;LNnq|)KVm77#-xgJ?bSefwLRNch!|uiFjottefKNjaxA5~=ACpu%vX%Hm_GBHT??@zWTZziga9{>{Q!C_KdEmH6 zgB#bV+jqA5T>RSI@k&q3v9!<%l44r@b7Zu=Lo2`)CXDL(d!-eys0l`X|75kKvH{&{ zkg^^TfGTj8l}-I{{6Kq1cjmN|UYD_?tZ{M?`TnO|%98~&R}5JpZ>`{PYLY_0dfef* z^YIKz;;L+%Sj1{c+?h>L2)=O9Dg!0#5=AFM3z9&NC9z5Ho#BBmncocME@1X{ z{^N=0<`7j`Dk@O!>ysUD%qyU2F99hidJ6r7D^pFg> zzUV}(FuXONR{RSz2&BQgLUY6&N&vvv(9N^l0tZT2n3Zx)p?O_#UxxRED@E5T-`E<&IiL8YcQEZI8L%_~hfEeX<0uAuZ>|fI7={@rA_BM` z!3atoV*ZW6_MXw2z>H8|j=wJRyVMM^B;ifu=RW0iG1r_{SuxN(XgQIjT;5Gtbt;Hj z;W~-liX%ft19&<#Y(*&?Z=zJgxHoiQMeLIt;{0>a2z@%lQ z$Hi1?t(~HWtFOqf!#U%+3z}8-)P>tIJ1L#o3W@~AmFU_biD%@>gYylhjejv;v-%}= z%3e&+Q7+(Mhp~UoBm6vMzR6R<{fvS?=4(tx3^ZmWhHHSGIoWR1!|Iy5Fe76WdD~+f zdHcmSo;B5}*eUHPQ*=KB+E$NjgvlYH+EZa(ZRun~WBJnDvu@ee*51(0+g8rr%1(*@ z3%@;IvmNzJYyOE;VOsTIv&~Hd@pqX&e1AZHm|tPvaD0qj8kyV?azhqo%SIkE8B@_< z*rC{A-f1f-DTyt~+cs3M+ot}Sk}1lsX}di6rV^IFRX|$8Z>n0}q~#F(JnNfh_0Gb= z0^UN;g3$uj!P|xN1;s|VL)RqF3}ppzA;U~YwQl8fk-PLxIhXOAsi2%!fpdm)?4k2g zL;I4iqd0m8w|M6=N5_kfJ70ry(_N}v{5j1D@RV78m-<7|y(~&

6JB(1dwzk3tB; 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 diff --git a/icons/ethergem.png b/icons/ethergem.png deleted file mode 100644 index ad9608503d25b4a4d6f6b8197b38ffc9c079b537..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3455 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 diff --git a/icons/ewc.png b/icons/ewc.png deleted file mode 100644 index 5bda6b7969883d400277bcec1abe1cada2f23629..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2923 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 diff --git a/icons/flare.png b/icons/flare.png deleted file mode 100644 index 57d5519e64308a092afb46249b43739fe31d449c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1208 zcmV;p1V{UcP)F1qBNa2ooCw3l9hq z8VVdH3?VE72nz=f76}v_2o)a+A1VqNBLM;f0|^WT3J(Pf4+aht2oxL%6dnl`9t#^M z3>+v694ZSLB^nwt5FR`M0s{pL5D63<3L7N}8z=@169x_x2ND_y6&?&2Bme*a|Ns9H z5fN2YRc2;p?(Xh8J39#p3HbQl$4YyDJdHp8~XbC>+9>=+uORjx}&3`hlhuJe0)boM?pbB z7Z(@S*4E6-%*)Hm!NI}6z`&=cr>3T+rKP29ZEdiEkRJd505fz_PE!Ep=gZ@}snME; z>3#hB_1T2YkueqJmUm$oNd4{I+NOGMZbCmUED8ww({@T5!nTWMDkih1a{vGX4oO5o zRA}Dq+6hzIKoke?R}-!XBFL>GA}C&M?SCn92r3A8U-jtSe*Z7gnRKiI8)CBAbe!?` z1^$!S&F1C3r7>2P76S>dNAYE|ZwzF!KE>lr1QwT8$hw)NH!=qc<`i#ohAi0d`$DiG zLeLkeg}uVHQWPR8XTjgh$}e-2Te^A zM>GgW1*4oLUxmYhBg>zfg5##PhE5R;5@^fxlm}9H1{MU8JXw~s3Q5%1w{4mn}{p<5#omtYv5WgO>2Ci1+h}lrV z5TAacguqihVzyK+fpiM3K{_9WAzhf}A>BNwkWQruNH_5s^3pIG&dULr$2vV~B+`*)tr7h4kyp+!e$^+RWVEy;w+Xo0&T5LoB4q zOzoE;7*a7S;@Um&W2L!m=<>^P=eG6&56IV${}JL!N#sg#=SrFCPQk6fK&uRgDC7Z8 zxpT?b?(rR*;NdqUs)y{alNQ8zxj&|-j~|p1h)ZyPvA>PfJwm2=&4M0#;u^y8ytYSW z;9Cx11zrQ^W}xo_QCf*80?ALJaGPrVfsz4&^rl)8Bd*w^E<~;K8=d_N_TUplh4dkc z4F{*RR7x!r?at!r_R19WGxek+DC` W9rQ9YJ*V;j0000DNn1O+TQc_YeF)=JG zEF&W$=H}+t*VnYPw3L*TDJdx%8youi`s?fK+uPf^y1JvIqlbrwe0+RIM@KCZ-rlqB&ZEbA(N5yD7*^<7nYPpa zJN_Z9_Ry{piH*vX?G$k;l{XAkDh^56 zY5f#6qErMz4QZKSnSw0&evul}d)$DOKMls37 zW7B5_jxumQ_aH}W?IKigDxk7jye9zs~*5mQdWH4kwU2j(FM=BlCPVj^iClKc<( z+aR6M{h(Q6X^sGSxczz}od)F~^QVS%^&<;u^9#pwUlTGDNK{iz!?#7U;Xn^E7Adl? zG>>pkfYE)>g9OKX#@SfY8S8w;sjuttHC_?d8|jCY_AyhJpQio0;9riyuRCcF60w*W z$jY%W0`UYO7OFKsh^1ZJt^R!vD(+mAg>cH$Bix0+1vm5R(DAV#gmDS-` vMC!0*Nmcc^+VgX`g6p!L!?|uj;5pn6&aTId4b75a00000NkvXXu0mjf=_u@D diff --git a/icons/gochain.png b/icons/gochain.png deleted file mode 100644 index 67154f805af81b4231521db5326bbb9f7f58fbcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2801 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 WcH+TgrJi^I0000TAYCdVpdd(t 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 ASO5S3 diff --git a/icons/mix.png b/icons/mix.png deleted file mode 100644 index 02af27ecf4ce7b41d406a8cb4d541244733d6747..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5349 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 H4v+jFY3Pmi diff --git a/icons/musicoin.png b/icons/musicoin.png deleted file mode 100644 index 2d6ec90d1f05153ee9340454adbaee15e8e8fe3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2251 zcmV;+2sHPJP)xBO3`QXtu*%ZyNDV%D$bF=i zA)FPhA<~E7?}*dYIENe2MGN@WKMSsN?&yve0GQXFh3ytgRWb@ z=Cn+h8V?;?K_Ec>`UV8o$kJV^)KV80KM%5m>j|UmDz7)O&z|4P4S@U&SK&hDth{z6vrWb!l zXIV7E^6q^m1x2&acLCvx*objMH1sF1AT&u+I?A7^n z^$0)_!xxH46p;Fi0Wxm1pm&y2zn6utN52F=57qtNGrIoyCG?h3fr`1*9-R z-*qH-9o2}9oA0n$#gL62A?|4k%1c3uAnuC7mKlI#5%fJLgFnD^bZq?5Am02ZVaCAu zG=znIu81W@0OIUEk-kEY5r3@L!b~DrmxMb(cPvAS5OfrEf@3}Z^e#_zH|E|CwN7N= z%mR{E(8cT4qbqqd7-iGDs##(NLxj6EQqYCahSex>7B#)Ql_KxAfF$0faV_@{llq_D z?bbB=EFf7#Iyq#eYtP4mVgbn^=p*~$1w9KWRDV?Tv?||R>|4-nr1#>n zk_Fn;@AfJZ^jKgrFl(qnmTEyCgjHKZvIx5PaL%&@3&_9(T^8CbLk1}5VrYB$xJ=I& zniR593i{~LO0c8SfS4%g)n-VZ3O&#AAPa~BL0`8FDUYD{v))&uZ7bVd@AOs%A|&;y2%xnoKz=&HP z6=!1Cwqu5%>jk6-#DVvU|LnLlHs=F8Mgqdt(qbiG5+fkE++pmle?@g;`{>qPjv2a< z@GPC|d2?y~0V}bfYXOAq$`i#3Y?*|ulJI~Gntc(@@wMu7ccmct47cww(ZinPlsAZxS5QLS9%i-{}@R8El zwxsq-*#%u0AjqafFgETs^xmPe#||pMkm6e>*y~UTRo?RV+MQ8FL01BZY;}jqN5G;5 zy&5xwGC&p!{X}tf$Le6_uBDG1l;0Ks$ePlx7?dLl+C)IJtpSiZ<>IQF9e4)NFX+hd zRu`%O$Q%G!DfADBfDK*^?MkyCZ<>eVT;&mgsTp)=%u}d>WFL`R@ECzin}vx7Np`5!0hE*97ON>JL?^C zkL1a~00g!P$7lKWBH8?Y`rTf2v||$k|7QG3&M0L1A;$GUeX!h})1cW|Vyy4YgTfR2(D6;-Oo5(IXFDgplg}8^jL6|xk;CJDsE9*|OS1?9 z^#-1vtxlTj_dO9AqV~87gc!_`uuZ^r6#nrnM4^dU(nZt>ws~BIc)|{lQhVSq>ju}m z#oI{Er&z%Vrd2npB;KOUQZO1JhHyZ}iOwUBurRKt3Fs210SI*kI=7gIuU=@9S>VVc z*(q)6S&{^jBrWc)LU~RMvj97y0MW~m;kM*s^Y{fCa&T_W-|V$WFbTQicFk(wbw_(Eo|XnmYMn}W~Mf{}?K0$ZB&x6iG=6YGp-);IOF za*==0L6rX1?;)Gz6?n6sH}}O5fi2^tdj$1G3j}G#rLnIVSq?jgQBv=hbfsEGNw5`T6x)^4G;-HQ#?Z(=KzgWfJM0b*SPcH_%>g|rquoy ZU;ykN%BC73ab5rb002ovPDHLkV1n_}E@A)x diff --git a/icons/pirl.png b/icons/pirl.png deleted file mode 100644 index 9ba9202fc8325de1a3ba54c73fbf467f03a6c8b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1559 zcmV+y2I%>TP)ntCNh)R|PFLo{z^KZ> z&0<6c=B6QYm0X30AAp0{n$7oAu_Y>{sue^)6yT`m~2&V28_*Ka#;`_URad%4dA=HlQsOIU@} zIAUPn`^+k(HnPi-)v?SGgDJ|g%z0#mY;eTDu8J|rMkt6J^;fuIJb(27em=Ma2Z!5S zQC5O8u3&|%a>Tg(=xaE7(}8<`e#aSQH4LQ66~hn4DAm4cuPm8|oH2s&`G-Hi;==0C zI756&d;$NUANhqm|AqR)IEDE(*mPH{3Vo?Z!SQLUF z7KI>)MM($*FGA%)EQ&@De+903Ar_@SX0Cp7x~8%nGE+DX7v8%9PhR{E|NQ$j)HdiUeocprWYKPT3LS6mZb zTM$4;E@D;4;=;us!?{}O*)AQVZwat{LxxVCh^ z;IBiPlt6S>3I`0|zz1mnvCxIW1fyr*gVcdwsG=~!=oyd(Q9)sb(GMaIKx~?V!VshB zA3_=2T)Y8B|Xqc8V;C+vvz2!4S4k*ZPa6d#Bg#*XN&LSKv@ zgT+B$QI*0FV<_j&z)BHE`dzLl3^8_%ID={&3KNXbTstBADJZtX6@?MT&R}(5L_O;S z&qZ>9!C8hrO4!?k;}9aw`-(iiTOJR39c&~K>!LbB*L{)CI+0(nWpk%JwxTdbR!E>y za2L{^7_D!MWaLY`Px8Dh97~!um+BZW!AVAAL4;`AqUgbpxf~f|yR3ok3;RBM#`^SQ zMs?Cpp6aQj@*A(qX`7AlQ`_}vFs23x%)Tm|7LQph`Y=bMW>Z?atdK6umCOHSYv2X$ z1J=S;;HiKNz~IVrCC3%9sRE%DBmh%_{}0-&=3woDGbiklw*5c9>IkhMAvmsV6$5|} z02j$v1$CVWsep{=+Dft^Qc<=tp`^EE!{lSqTROU;N#j2O1^|Qi`Y|QSX50V(002ov JPDHLkV1l=!!_NQ! diff --git a/icons/poa.png b/icons/poa.png deleted file mode 100644 index 1443ae071e4a67bc221abd36a81b6da1e704a784..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7280 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 diff --git a/icons/reosc.png b/icons/reosc.png deleted file mode 100644 index c38bbc3244b157c010169da69653c2dd627fa67e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2624 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 ikDMOtWijn?MD#!LmN|tbk3FCO0000L{S^M7{t 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 diff --git a/icons/thundercore.png b/icons/thundercore.png deleted file mode 100644 index 49758acfcb54f801e5d8b286f5e8194fec72760a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2504 zcmV;(2{-nMP)4j&hffkZVvP5vBCe09}k5M3qR1 zghZ1>f`S6cO(aB>3XoD@iGm^&NrQw)B)dX1;B<%vyF?&irQq^`a}F^i4)HE}v$J=* z^JZqhW_I`P_9vYs@80d+&41^;H*enVIKJ;gS$MtnJOCW$uPy+z_-n4TFQI200JivR z4FERq<#zh3+D{q8njl`Ujg3CfU)>rtdS2GKNGQ&#+v#uEIEhg~xCmzf;NlnvkOT^J z9RQY1iep3&Zi*HG;0)P08LR-nk_ppRNDwZ>6#zI*c1|X@u|0|ilS>e8nwBQGMU^Amq3uDkv%v(9Fux}or>J_!QX_^{4)Qi85J7l4WO4?5GYe!>Nu1$r z9fJtMb5j$6bLSIL-m^9)C)9m&j?cmrM)iUaa!l zm4Vy23jllBnSB2-!1mRuztUoKd@_i#cx3eldHcA~x(4q4^RXY}_1bm$aVNrvD{8XN zlDCZmGYjB$9#Ao!RO&lK25lehA#39{DtBJ|4xBx2knI3F;PsA?trfEFcKTfi1+i_e zuwlx^+4DO7m7dlA?rD-=Q$cPTcJ}Y@vt#k*A!Q2b=dwsH20AT)ZlvPL#zqn z?0buBE0^->&H{3uk7*DJ(j~hMfw6uSU`Xpd{zPfEY~gzk@*bIK5SlDI&b*?u1QTNW zDjWQjjo<$u?-`i}&hDQr>?%K!-3D-8`V}1a=&+%R#Qhk)9{xr$mL1~n{s#X2*VzB! zxubZS=K!AlK(^-r(=SmgP;hMX<}|OfwSwawi8fdMAFT{uhsX9d&kq}UWK5l`6Nb z=zQJ7w=`n-tXHHH<1X12L+G)EVFTWXN#6b4*rCk}l4M)i{KP|z^9{xd?21e2gnj=R z**3&sb0N$m9=l^Cd*HOcjGy0NC~e$iC5>E@9XIga@oDC$NH;nckB?V%-iEYguE0hQ zi8nUY8ch(UE`0Ak*%vtqxCcHCd{Krg+P`;-T>!ysAU${V_!w4WuVLp9dbJkOT;)$D zN-^6*n3KLW_&1tcQW2y@)RRd8J3-i*HBw3uG(^FRgbiRd=OOtygLyG9El7Hkk(Zpp zq#F6>Lm5Hl#Hh)NClhV3m-RptJ}cN$hvv)-29k*c!#+f3b_|}yJsLz!S?B5{r9ee6 zkW3`Vhqif`S+G((pbd|orZ-(ObIMZj-X?i(YAh7lSsAIDLTC5W1Plym3SXE%sS)OS zhy|Rf6N-cS>BLZ&C>yC1Q`A}z)z@QJcLFjK6|h6L)Cu`7t^X zPFPAV7Drys^_)!C#^94%DlriM@5-y)wWz;&#mMqqY|2)FE&zy;(7URpo`Oj7S2|Or zGf{EmQvr3NmL^L~Z=)lYnyM5gDvG~b|Jz?`*+aw>jBM&QPj1TJ`iN|+8};iULV8=4 zd%_vQBr&8}1BJ<}6SWg0UgWkDFCJjCjs3)QI-74HX_fl>52%~T3X1C@y(40(lFLaU zD4y#D=FT}3f24@-JtXh0BlQtv_HxV&MXL;>ch0I{lS}tb4fZKVK<6Subjn zT#T0S3`&258Auh(&j@uGP_i>0| zNE;nrBops-{?qR*`~rKFZn6TClIFCEkXDBzZExtljnXJr5a}&vKB?!@g|s@H)@PDq zj}|U}40b7qcgHf{@Pv-U^N0bGDwR?5AMB|>e7z;>ki;SP4eoyNFnbO1z1GG+`Qqf>?L#6m#ZkO#BDaAZ(S@ zGS>;bqSzW#Ua!5} zEU8*LD{iMh7z2nihSGJB8mtm)^Ozuf+3DL&`#WEY!Y6`o7Wv|b4R&~>TJK9L2p^!*ukDz@eazSM-oslYb6ltm24Q~k~(gl;o<)Uv`CuvbP?Dl(ZY5x&y#m5EqkIvtn? zydoQcr=^e}AzYZn2~OQ(k60=qM2HbVLiiG{nA^WN0b`eSKGV0X8g=Kvs31|eIP?6~ z9Rq>Zd8rQef>o0uM6o7_3~t(v^H-NIx74bUSlH+|R=^iFJ~sM>2~(5`0Qes%525Ud SqHxOq0000cn^ diff --git a/icons/tobalaba.png b/icons/tobalaba.png deleted file mode 100644 index 5bda6b7969883d400277bcec1abe1cada2f23629..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2923 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 diff --git a/icons/volta.png b/icons/volta.png deleted file mode 100644 index 5bda6b7969883d400277bcec1abe1cada2f23629..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2923 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 lSf;+;YqT17?<(rG_ Date: Mon, 5 Dec 2022 18:24:32 +0100 Subject: [PATCH 03/85] Removed unused split ETH icon --- icons/icon_split.gif | Bin 57 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 icons/icon_split.gif diff --git a/icons/icon_split.gif b/icons/icon_split.gif deleted file mode 100644 index 0ab40011f2682a4e7992352100cf5ef84ea4c5dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57 zcmZ?wbhEHb6krfwXkcLY|NlP&1A`6_1Nj0B3``O&{VPwueJIqU=98tl!8~n^to*gg Khn;S$4Aua&=MfkH From 52638ba913c143464bdc852a7f3ce7349903b596 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Mon, 5 Dec 2022 18:25:43 +0100 Subject: [PATCH 04/85] Removed useless executions rights from icons --- icons/nanos_app_tecracoin.gif | Bin icons/nanos_app_tecratestnet.gif | Bin icons/nanox_app_tecracoin.gif | Bin icons/nanox_app_tecratestnet.gif | Bin 4 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 icons/nanos_app_tecracoin.gif mode change 100755 => 100644 icons/nanos_app_tecratestnet.gif mode change 100755 => 100644 icons/nanox_app_tecracoin.gif mode change 100755 => 100644 icons/nanox_app_tecratestnet.gif diff --git a/icons/nanos_app_tecracoin.gif b/icons/nanos_app_tecracoin.gif old mode 100755 new mode 100644 diff --git a/icons/nanos_app_tecratestnet.gif b/icons/nanos_app_tecratestnet.gif old mode 100755 new mode 100644 diff --git a/icons/nanox_app_tecracoin.gif b/icons/nanox_app_tecracoin.gif old mode 100755 new mode 100644 diff --git a/icons/nanox_app_tecratestnet.gif b/icons/nanox_app_tecratestnet.gif old mode 100755 new mode 100644 From a69666fdefe600b4ff62797fd65ea3a39b9c14c4 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 25 Apr 2023 14:02:28 +0200 Subject: [PATCH 05/85] Removed common glyphs that are already in SDK --- glyphs/icon_back.gif | Bin 74 -> 0 bytes glyphs/icon_back_x.gif | Bin 1123 -> 0 bytes glyphs/icon_certificate.gif | Bin 1133 -> 0 bytes glyphs/icon_crossmark.gif | Bin 1131 -> 0 bytes glyphs/icon_dashboard.gif | Bin 1133 -> 0 bytes glyphs/icon_dashboard_x.gif | Bin 1126 -> 0 bytes glyphs/icon_down.gif | Bin 1100 -> 0 bytes glyphs/icon_eye.gif | Bin 1130 -> 0 bytes glyphs/icon_left.gif | Bin 1101 -> 0 bytes glyphs/icon_right.gif | Bin 1100 -> 0 bytes glyphs/icon_up.gif | Bin 1100 -> 0 bytes glyphs/icon_validate_14.gif | Bin 1125 -> 0 bytes glyphs/icon_warning.gif | Bin 1130 -> 0 bytes 13 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 glyphs/icon_back.gif delete mode 100644 glyphs/icon_back_x.gif delete mode 100644 glyphs/icon_certificate.gif delete mode 100644 glyphs/icon_crossmark.gif delete mode 100644 glyphs/icon_dashboard.gif delete mode 100644 glyphs/icon_dashboard_x.gif delete mode 100644 glyphs/icon_down.gif delete mode 100644 glyphs/icon_eye.gif delete mode 100644 glyphs/icon_left.gif delete mode 100644 glyphs/icon_right.gif delete mode 100644 glyphs/icon_up.gif delete mode 100644 glyphs/icon_validate_14.gif delete mode 100644 glyphs/icon_warning.gif diff --git a/glyphs/icon_back.gif b/glyphs/icon_back.gif deleted file mode 100644 index a2a7e6d4fa290e4875992d4024e988d14b91df26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74 zcmZ?wbhEHbh+i z#(Mch>H3D2mX`VkM*2oZxP`3=Lf^oD9vKom`v^ z4IGV}EX^$3V0vBhlS^|`^GaZPQxJOHaOwpmh};68%`T}$nPsUdZbkXI3Sf_0W#V>= zGfwlMdQ)(_#RaEceV}9XLD7p8-7q0w8Uiuli5JL$C;!wuV45!iCT_<6|Nj2@{p;tC z@87({PcxqRv3h4bgmo;iK$ z#u35cm<%;FYmM&SmXyJnS^XAT( zJ!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3 zjP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|LV6Zqk*xT9KSX)_In46iJ z7#kTH=@}C@U!{$jiyfNJ~jdh>MAe2nz`c@bmHVaC32Tu(PqUFf%a% wONgH=z;c3tK?g*D$_@r5iJtzIs~KwUGz+zPEiKD<-x8T<*15Dbij~0{0O2}{jsO4v diff --git a/glyphs/icon_certificate.gif b/glyphs/icon_certificate.gif deleted file mode 100644 index 89b529f792aeb77c8cc3b4d4782d8280b3c6c204..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1133 zcmZ?wbhEHbh+i z#(Mch>H3D2mX`VkM*2oZxP`3=Lf^oD9vKom`v^ z4IGV}EX^$3V0vBhlS^|`^GaZPQxJOHaOwpmh};68%`T}$nPsUdZbkXI3Sf_0W#V>= zGfwlMdQ)(_#RaEceV}9XLD7p8-7q0w8Uiuli5JL$C;!wuV45!iCT_<6|Nj2@{p;tC z@87({PcxqRv3h4bgmo;iK$ z#u35cm<%;FYmM&SmXyJnS^XAT( zJ!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3 zjP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|LV6Zqk*xT9KSX)_In46iJ z7#kTH=@}C@U!{$jiyfNJ~jdh>MAe2nz`c@bmHVaC32Tu(PqUFf%a% zONgH=z;c3tK?g*D$_@r5rJnxG17}|h+i z#(Mch>H3D2mX`VkM*2oZxP`3=Lf^oD9vKom`v^ z4IGV}EX^$3V0vBhlS^|`^GaZPQxJMxaOwpmh};68%`T}$nPsUdZbkXI3Sf_0W#V>= zBTn<6dQ)(_#R;cgeV}9XLD7p8-7q0w8Uiuli5JL$C;!wuV45!iCT_<6|Nj2@{p;tC z@87({PcxqRv3h4bgmo;iK$ z#u35cm<%;FYmM&SmXyJnS^XAT( zJ!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3 zjP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|LU=%qz*xT9KSX)_In46iJ z7#kTH=@}C@U!{$jiyfNJ~jdh>MAe2nz`c@bmHVaC32Tu(PqUFf%a% zONgH=z;c3tK?g*D$_@r5g`R%S3EQ{LsG1P=G9yPZ?_TW!_O_JIo#INXvMrLH1~M>M F0{{d^jh+i z#(Mch>H3D2mX`VkM*2oZx|Z5PF?(>IEf;+ybD@E~!PCWvMA{Mftf3V2@j6;&zJ# zPV=C8Q*gV*5~p5$pkwqw(Tfz_Fd<+X0x{u<7s!Dp|I|ESnlAz-ZpQ!r{{H#>>*tT} z-@bnN{ORL|_wU}mdHw3;i|5atK6(7;;e-44?%uh5>*kH?*REcZ;0$^0LyB;-bQW{Jh+p?5xa; z^t9BJ|cQ;oTXD3GodplbjYb#3&b2C#D zVqwaWPR5VIe^Qem-6vZZ1v^b~aWPW+p~p z3GtH!SWYl7=zs`N*}=f1)WgepeBpkH7I)L>0efyf`cv6&*0!WWPeHu$lGW7Enz_D= G4Aua{vX6rR diff --git a/glyphs/icon_dashboard_x.gif b/glyphs/icon_dashboard_x.gif deleted file mode 100644 index 33d9b0a74a263937a8cbb3b7c4ccfd4bd4fd2a3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1126 zcmZ?wbhEHbh+i z#(Mch>H3D2mX`VkM*2oZx= z5l-`({PcxqRv3h4bgmo;iK$ z#u35cm<%;FYmM&SmXyJnS^XAT( zJ!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3 zjP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|L7iT9&2YWkP8*3{|3v)A5 z6JsMo1ARSR9c?X54RtkD6=fww1$jAH8EGj=32`w|5n&-g0e(JS9&Rp94t6$H7G@?! zUc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*btCX0MpOk6^Wap-qB64UF}T4Rno+txOE8OpFwuK*`RgC?(A*$i)q66_97Elu=SrV5P5L zUS6(Ou9shwu5V~*X{m2uq;F)T3sj(6T$u;-oo-&SvJ%j-AOl=di<65o3raHc^Aw8G ztP+#*OG|8(lob9$J&;=fH#M(V59}GeYG-AXPsowK%`DC^;3VTp46jft7PnYGO%#QAmD%4lD=*GV)9Ei!<^I z6r7#GL8hSLo0y!L2NcundS0ve;2nVDi`Y;NgdWMu4QWZ>pz zXy|I@XlQBVYUE;UXz6Nc_}|je8K&7KKe;qFHLnDwIR&BF8LAmYFGwpWEr5aq7{EoD zWvMA{Mftf3V1HX>!rg-I6icj50lNgEH3i8fKwls^#1W@feV|kH(V`kA1WZ04CM4AY z(t84%^TORUA=Po(!~qs&z(JU`qar2$B!L7a`@1}1N-;w-Lrew&K=vgZQZhY z)5ZeMTG_VdAT{+S(zE>X{jm6Nr?&Zaj`McQIQehVWA};$o%uI|73_73^0#s@+FtPL0rFC}Ia4}c|0Jk%O AU;qFB diff --git a/glyphs/icon_eye.gif b/glyphs/icon_eye.gif deleted file mode 100644 index df4bb829e6d06e0bde643b1b96fde45c093edef1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1130 zcmZ?wbhEHbh+i z#(Mch>H3D2mX`VkM*2oZxP`3=Lf^oD9vKom`v^ z4IGV}EX^$3V0vBhlS^|`^GaZPQxJOHaOwpmh};68%`T}$nPsUdZbkXI3Sf_0W#V>= zGfwlMdQ)(_#RaEceV}9XLD7p8-7q0w8Uiuli5JL$C;!wuV45!iCT_<6|Nj2@{p;tC z@87({PcxqRv3h4bgmo;iK$ z#u35cm<%;FYmM&SmXyJnS^XAT( zJ!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3 zjP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|LV6Zqk*xT9KSX)_In46iJ z7#kTH=@}C@U!{$jiyfNJ~jdh>MAe2nz`c@bmHVaC32Tu(PqUFf%a% zONgH=z;c3tK?g*D$_@r5`JVojvmYFo*YYB?T-40^%iq9xH)NNlPJ66kronvNgOR}+ E02G{#(EtDd diff --git a/glyphs/icon_left.gif b/glyphs/icon_left.gif deleted file mode 100644 index 524226ba11247d9c5f797801400fd630071a049a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1101 zcmZ?wbhEHbWMN=u_`m=H|NsA2{K*1lD*orL$SqJvNi0bO(*Nx%3KEmEQ%e+*Qqwc@ zY?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*btCX0MpOk6^Wap-qB64UF}T4Rno+txOE8OpFwuK*`RgC?(A*$i)q66_97Elu=SrV5P5L zUS6(Ou9shwu5V~*X{m2uq;F)T3sj(6T$u;-oo-&SvJ%j-AOl=di<65o3raHc^Aw8G ztP+#*OG|8(lob9$J&;=fH#M(V59}GeYG-AXPsowK%`DC^;3VTp46jft7PnYGO%#QAmD%4lD=*GV)9Ei!<^I z6r7#GL8hSLo0y!L2NcundS0ve;2nVDkcY~W;U?r3IeWZ>*# zXy|I@XlQBVYUE;UXz6Nc_}|je8K&7KKe;qFHLnDwIR&BF45}GLFGwpWEr5aq7{EoD zWvMA{Mftf3V1HX>!rg-I6l1JT0lNgEH3i8fKwls^!~~~SeV|kH(V`kA1WZ04CM4AY z(t84%^TORUA=Po(!~qs&z(JU`qar2$B!L7a`@1}1N-;w-Lrew&K=vgZQZhY z)5ZeMTG_VdAT{+S(zE>X{jm6Nr?&Zaj`McQIQehVWA};$o%uI|73_73^0#s@+FmbdLb7tJW=fuch4FGsN BgIfRq diff --git a/glyphs/icon_right.gif b/glyphs/icon_right.gif deleted file mode 100644 index 15ff3cf5994421fbd6e7d593aae8e438310f33ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1100 zcmZ?wbhEHbWMN=u_`m=H|NsA2{K*1lD*orL$SqJvNi0bO(*Nx%3KEmEQ%e+*Qqwc@ zY?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*btCX0MpOk6^Wap-qB64UF}T4Rno+txOE8OpFwuK*`RgC?(A*$i)q66_97Elu=SrV5P5L zUS6(Ou9shwu5V~*X{m2uq;F)T3sj(6T$u;-oo-&SvJ%j-AOl=di<65o3raHc^Aw8G ztP+#*OG|8(lob9$J&;=fH#M(V59}GeYG-AXPsowK%`DC^;3VTp46jft7PnYGO%#QAmD%4lD=*GV)9Ei!<^I z6r7#GL8hSLo0y!L2NcundS0ve;2nVDkcY~W;U?r3IcWZ>*# zXy|I@XlQBVYUE;UXz6Nc_}|je8K&7KKe;qFHLnDwIR&BF2&x%HFGwpWEr5aq7{EoD zWvMA{Mftf3V1HX>!rg-A6jL{>P64|FqBRA{B|u*wIm7^`R(+sT^wFXkCIn1AASNW$ z0@Eju15Nk;OB7P`fT_I*n5-H9|NHyr_phHnzJL4r<@2Wx@87+B^ZM1x7tfzPee(Fx z!w2{8-Mw@B*3BE&uU)-z`O?J;=g*xzbNbZD6UUDoJ#zTa!2|pE?cK9`*UlZ=w{6|B zdDF%X>({MavwGFa70Z_`U9x!5!Ugl^&7CuQ*322xr%jzQdD6rQ{e8VX-Cdm>?QN|s z%}tFB^>wv1)m4=h1nAc$w`R`@o}*+(NU2R;bEa6!9jrm z{(inb-d>&_?ryFw&Q6XF_I9>5)>f7l=4PfQ#zuw)`g*!L+FF_#>T0Sg%1Vj~@^Z2= z(o&KV;$osA!a{-q{CvDTJltHI9PDhYEX+)d3=BG;5&~3eFfg(6@U>OF>g8gv1_1YR Bf|mdQ diff --git a/glyphs/icon_up.gif b/glyphs/icon_up.gif deleted file mode 100644 index 4e13c064f7605feb2e6e04a48a3133e5c95912cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1100 zcmZ?wbhEHbWM^Pu_`m=H|NsA2{K*1lD*orL$SqJvNi0bO(*Nx%3KEmEQ%e+*Qqwc@ zY?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*btCX0MpOk6^Wap-qB64UF}T4Rno+txOE8OpFwuK*`RgC?(A*$i)q66_97Elu=SrV5P5L zUS6(Ou9shwu5V~*X{m2uq;F)T3sj(6T$u;-oo-&SvJ%j-AOl=di<65o3raHc^Aw8G ztP+#*OG|8(lob9$J&;=fH#M(V59}GeYG-AXPsowK%`DC^;3VTp46jft7PnYGO%#QAmD%4lD=*GV)9Ei!<^I z6r7#GL8hSLo0y!L2NcundS0ve;2nVDi`Y;NgdWMu4SWZ>pz zXy|I@XlQBVYUE;UXz6Nc_}|je8K&7KKe;qFHLnDwIR&oS!~m)pMK4GzC@p}31Q@_Y znPsUdZbkXI3SfU*Wy0Np?i3fSP64|FqBRA{B|u*w9AfN>Q>#AEDf(zp4HE(;9}p9g zYJuq!$bqK&|0N2kdBD_O1WeY9|Ns5{^ZVD&AK$-y{qp(KhxhN^zIpxX<%{Rfo<4c} z=;4F=_wL@gee33p>({PcxqRv3h4bgmo;iK$#u35cm<%;FYmM&SmXyJnS^XAT(J!|HS>C>i8nLKIYg#NzXp6;&Bj`p_J zmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3jP$hBl;otug!s7FnCPg;i14t`kl>)e z0DnJUA8#*D4|g|L7iT9&2YWkP8*3{|3v)A56JsMo1ARSR9c?X54RtkD6=fww1$jAH z8EGj=32`w|5n&-g0e(JS9v*HkP7Zc9Ru*O^Mg|5QPzeDlH5i!KTar5~xYlqnSOWmI C)q;Qk diff --git a/glyphs/icon_validate_14.gif b/glyphs/icon_validate_14.gif deleted file mode 100644 index ccb5cabe38d16ff857d540b64742e4b8346a6949..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1125 zcmZ?wbhEHbh+i z#(Mch>H3D2mX`VkM*2oZx= z0Z#LvdQ)(_#So`neV}9XLD7p8-7q0w8Uiuli5JL$C;!wuV45!iCT_<6|Nj2@{p;tC z@87({PcxqRv3h4bgmo;iK$ z#u35cm<%;FYmM&SmXyJnS^XAT( zJ!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3 zjP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|L7iT9&2YWkP8*3{|3v)A5 z6JsMo1ARSR9c?X54RtkD6=fww1$jAH8EGj=32`w|5n&-g0e(JS9&Rp94t6$H7G@?! zUh+i z#(Mch>H3D2mX`VkM*2oZxP`3=Lf^oD9vKom`v^ z4IGV}EX^$3V0vBhlS^|`^GaZPQxJMhaOwpmh};68%`T}$nPsUdZbkXI3Sf_0W#V>= zAx`t4dQ)(_#R#WfeV}9XLD7p8-7q0w8Uiuli5JL$C;!wuV45!iCT_<6|Nj2@{p;tC z@87({PcxqRv3h4bgmo;iK$ z#u35cm<%;FYmM&SmXyJnS^XAT( zJ!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3 zjP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|L7iT9&2YWkP8*3{|3v)A5 z6JsMo1ARSR9c?X54RtkD6=fww1$jAH8EGj=32`w|5n&-g0e(JS9&Rp94t6$H7G@?! zU Date: Tue, 14 Feb 2023 10:53:45 +0100 Subject: [PATCH 06/85] Use reusable workflow for swap tests --- .github/workflows/swap-ci-workflow.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/workflows/swap-ci-workflow.yml diff --git a/.github/workflows/swap-ci-workflow.yml b/.github/workflows/swap-ci-workflow.yml new file mode 100644 index 0000000..3999224 --- /dev/null +++ b/.github/workflows/swap-ci-workflow.yml @@ -0,0 +1,16 @@ +name: Swap functional tests + +on: + workflow_dispatch: + push: + branches: + - master + - develop + pull_request: + +jobs: + job_functional_tests: + uses: LedgerHQ/app-exchange/.github/workflows/reusable_swap_functional_tests.yml@develop + with: + branch_for_ethereum: ${{ github.ref }} + test_filter: '"ETH or eth or Ethereum or ethereum"' From 5c7614b2d9bdf8450625e581dd34322c8b9a9083 Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Fri, 28 Apr 2023 16:57:20 +0200 Subject: [PATCH 07/85] Reset BSS section at the start of the app in swap mode for signature --- src/handle_swap_sign_transaction.c | 2 ++ src/main.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/handle_swap_sign_transaction.c b/src/handle_swap_sign_transaction.c index 75e4d3a..39268f5 100644 --- a/src/handle_swap_sign_transaction.c +++ b/src/handle_swap_sign_transaction.c @@ -1,4 +1,5 @@ #include "os_io_seproxyhal.h" +#include "os.h" #include "ux.h" #include "handle_swap_sign_transaction.h" #include "shared_context.h" @@ -45,6 +46,7 @@ bool copy_transaction_parameters(create_transaction_parameters_t* sign_transacti stack_data.maxFee, sizeof(stack_data.maxFee)); + os_explicit_zero_BSS_segment(); memcpy(&strings.common, &stack_data, sizeof(stack_data)); return true; } diff --git a/src/main.c b/src/main.c index a483bf4..d66dbb1 100644 --- a/src/main.c +++ b/src/main.c @@ -1067,7 +1067,7 @@ void library_main(struct libargs_s *args) { init_coin_config(&coin_config); args->chain_config = &coin_config; } - bool end = false; + volatile bool end = false; /* This loop ensures that library_main_helper and os_lib_end are called * within a try context, even if an exception is thrown */ while (1) { From 6555b38eaaf73c68a58f6bbc8441898025662b83 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 2 May 2023 17:00:36 +0200 Subject: [PATCH 08/85] Version bump --- CHANGELOG.md | 2 ++ Makefile | 4 ++-- tests/speculos/test_configuration_cmd.py | 6 +++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 50c74f7..a8a3deb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [1.10.3](https://github.com/ledgerhq/app-ethereum/compare/1.10.2...1.10.3) - 2023-XX-XX + ## [1.10.2](https://github.com/ledgerhq/app-ethereum/compare/1.10.1...1.10.2) - 2023-04-24 ### Added diff --git a/Makefile b/Makefile index b7704d7..95c7120 100644 --- a/Makefile +++ b/Makefile @@ -34,9 +34,9 @@ APP_LOAD_PARAMS += --path "1517992542'/1101353413'" APPVERSION_M=1 APPVERSION_N=10 -APPVERSION_P=2 +APPVERSION_P=3 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) -APP_LOAD_FLAGS= --appFlags 0xa40 --dep Ethereum:$(APPVERSION) +APP_LOAD_FLAGS= --appFlags 0xa40 --dep Ethereum:$(APPVERSION)-dev ########################### # Set Chain environnement # diff --git a/tests/speculos/test_configuration_cmd.py b/tests/speculos/test_configuration_cmd.py index 1d84839..8027b2c 100644 --- a/tests/speculos/test_configuration_cmd.py +++ b/tests/speculos/test_configuration_cmd.py @@ -1,10 +1,10 @@ def test_configuration(cmd): if cmd.model == "nanos": - assert cmd.get_configuration() == (14, 1, 10, 2) + assert cmd.get_configuration() == (14, 1, 10, 3) if cmd.model == "nanox": - assert cmd.get_configuration() == (14, 1, 10, 2) + assert cmd.get_configuration() == (14, 1, 10, 3) if cmd.model == "nanosp": - assert cmd.get_configuration() == (14, 1, 10, 2) + assert cmd.get_configuration() == (14, 1, 10, 3) From 8c8612af134368dc44bc0248826f9454f6dd1de7 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 4 May 2023 17:01:50 +0200 Subject: [PATCH 09/85] Fix -dev version suffix --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 95c7120..a32c240 100644 --- a/Makefile +++ b/Makefile @@ -35,8 +35,8 @@ APP_LOAD_PARAMS += --path "1517992542'/1101353413'" APPVERSION_M=1 APPVERSION_N=10 APPVERSION_P=3 -APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) -APP_LOAD_FLAGS= --appFlags 0xa40 --dep Ethereum:$(APPVERSION)-dev +APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)-dev +APP_LOAD_FLAGS= --appFlags 0xa40 --dep Ethereum:$(APPVERSION) ########################### # Set Chain environnement # From 6e8007b771dbbcba3ddb62203dee53dc76d62fa7 Mon Sep 17 00:00:00 2001 From: Clement Bouvet Date: Tue, 21 Feb 2023 10:53:42 +0100 Subject: [PATCH 10/85] .gitignore: ignore build folder --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9443644..6779287 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ bin/ debug/ dep/ obj/ +build/ # Python *.pyc From 22c7254c9dfa30c087029aba4d4168a4c16695ab Mon Sep 17 00:00:00 2001 From: Clement Bouvet Date: Tue, 21 Feb 2023 10:53:54 +0100 Subject: [PATCH 11/85] Makefile: stax modifications --- Makefile | 47 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index a32c240..025a00d 100644 --- a/Makefile +++ b/Makefile @@ -54,6 +54,7 @@ include ./makefile_conf/chain/$(CHAIN).mk else $(error Unsupported CHAIN - use $(SUPPORTED_CHAINS)) endif +CFLAGS += -DAPPNAME=\"$(APPNAME)\" ######### # Other # @@ -65,6 +66,13 @@ DEFINES += $(DEFINES_LIB) #prepare hsm generation ifeq ($(TARGET_NAME),TARGET_NANOS) ICONNAME=icons/nanos_app_$(CHAIN).gif +else ifeq ($(TARGET_NAME),TARGET_STAX) +ICONNAME=icons/stax_app_$(CHAIN).gif +DEFINES += ICONGLYPH=C_stax_app_$(CHAIN)_64px +DEFINES += ICONBITMAP=C_stax_app_$(CHAIN)_64px_bitmap +DEFINES += ICONGLYPH_SMALL=C_stax_app_$(CHAIN) +GLYPH_FILES += icons/stax_app_$(CHAIN)_64px.gif +GLYPH_FILES += icons/stax_app_$(CHAIN).gif else ICONNAME=icons/nanox_app_$(CHAIN).gif endif @@ -79,7 +87,7 @@ all: default ############ DEFINES += OS_IO_SEPROXYHAL -DEFINES += HAVE_BAGL HAVE_SPRINTF HAVE_SNPRINTF_FORMAT_U +DEFINES += HAVE_SPRINTF HAVE_SNPRINTF_FORMAT_U DEFINES += HAVE_IO_USB HAVE_L4_USBLIB IO_USB_MAX_ENDPOINTS=4 IO_HID_EP_LENGTH=64 HAVE_USB_APDU DEFINES += LEDGER_MAJOR_VERSION=$(APPVERSION_M) LEDGER_MINOR_VERSION=$(APPVERSION_N) LEDGER_PATCH_VERSION=$(APPVERSION_P) @@ -97,23 +105,34 @@ DEFINES += HAVE_UX_FLOW DEFINES += HAVE_WEBUSB WEBUSB_URL_SIZE_B=0 WEBUSB_URL="" -ifeq ($(TARGET_NAME),TARGET_NANOX) +ifneq (,$(filter $(TARGET_NAME),TARGET_NANOX TARGET_STAX)) +DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=300 DEFINES += HAVE_BLE BLE_COMMAND_TIMEOUT_MS=2000 DEFINES += HAVE_BLE_APDU # basic ledger apdu transport over BLE +SDK_SOURCE_PATH += lib_blewbxx lib_blewbxx_impl endif -ifeq ($(TARGET_NAME),TARGET_NANOS) +ifneq (,$(filter $(TARGET_NAME),TARGET_NANOS TARGET_NANOS2)) DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=72 -DEFINES += HAVE_WALLET_ID_SDK +endif + +ifeq ($(TARGET_NAME),TARGET_STAX) +DEFINES += HAVE_NBGL +DEFINES += NBGL_QRCODE +else +DEFINES += HAVE_BAGL +ifeq ($(TARGET_NAME),TARGET_NANOS) +DEFINES += HAVE_WALLET_ID_SDK +DEFINES += BAGL_WIDTH=128 BAGL_HEIGHT=32 else -DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=300 DEFINES += HAVE_GLO096 -DEFINES += HAVE_BAGL BAGL_WIDTH=128 BAGL_HEIGHT=64 +DEFINES += BAGL_WIDTH=128 BAGL_HEIGHT=64 DEFINES += HAVE_BAGL_ELLIPSIS # long label truncation feature DEFINES += HAVE_BAGL_FONT_OPEN_SANS_REGULAR_11PX DEFINES += HAVE_BAGL_FONT_OPEN_SANS_EXTRABOLD_11PX DEFINES += HAVE_BAGL_FONT_OPEN_SANS_LIGHT_16PX endif +endif # Enables direct data signing without having to specify it in the settings. Useful when testing with speculos. ALLOW_DATA:=0 @@ -167,7 +186,7 @@ endif endif # Enabling debug PRINTF -DEBUG:=0 +DEBUG:=1 ifneq ($(DEBUG),0) DEFINES += HAVE_STACK_OVERFLOW_CHECK ifeq ($(TARGET_NAME),TARGET_NANOS) @@ -204,13 +223,13 @@ endif CC := $(CLANGPATH)clang -#CFLAGS += -O0 -CFLAGS += -Oz -Wno-format-invalid-specifier -Wno-format-extra-args +CFLAGS += -Og -g +# CFLAGS += -Oz -Wno-format-invalid-specifier -Wno-format-extra-args AS := $(GCCPATH)arm-none-eabi-gcc LD := $(GCCPATH)arm-none-eabi-gcc -LDFLAGS += -O3 -Os +LDFLAGS += -O0 LDLIBS += -lm -lgcc -lc # import rules to compile glyphs(/pone) @@ -219,11 +238,13 @@ include $(BOLOS_SDK)/Makefile.glyphs ### variables processed by the common makefile.rules of the SDK to grab source files and include dirs APP_SOURCE_PATH += src_common src src_features src_plugins SDK_SOURCE_PATH += lib_stusb lib_stusb_impl lib_u2f +ifeq ($(TARGET_NAME),TARGET_STAX) +SDK_SOURCE_PATH += lib_ux_stax +APP_SOURCE_PATH += src_nbgl +else SDK_SOURCE_PATH += lib_ux -ifeq ($(TARGET_NAME),TARGET_NANOX) -SDK_SOURCE_PATH += lib_blewbxx lib_blewbxx_impl -endif APP_SOURCE_PATH += src_bagl +endif ### initialize plugin SDK submodule if needed, rebuild it, and warn if a difference is noticed ifeq ($(CHAIN),ethereum) From b275067f4704553d8a6ea005481c83aa1f8aa882 Mon Sep 17 00:00:00 2001 From: Clement Bouvet Date: Tue, 21 Feb 2023 10:57:42 +0100 Subject: [PATCH 12/85] common_ui: remove non implemented function --- src/common_ui.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/common_ui.h b/src/common_ui.h index 9b2b0dc..e14f57b 100644 --- a/src/common_ui.h +++ b/src/common_ui.h @@ -9,7 +9,6 @@ void ui_display_public_eth2(void); void ui_display_privacy_public_key(void); void ui_display_privacy_shared_secret(void); void ui_display_public_key(void); -void ui_display_sign(void); void ui_sign_712_v0(void); void ui_display_stark_public(void); void ui_confirm_selector(void); From be029c642d42f41d70771995f796fe855ecf0dce Mon Sep 17 00:00:00 2001 From: Clement Bouvet Date: Tue, 21 Feb 2023 11:01:18 +0100 Subject: [PATCH 13/85] stax: add UI implementation --- src/handle_swap_sign_transaction.c | 6 + src/main.c | 25 ++- src/ui_callbacks.h | 4 + src_nbgl/ui_approve_tx.c | 235 ++++++++++++++++++++++++++++ src_nbgl/ui_confirm_parameter.c | 56 +++++++ src_nbgl/ui_confirm_selector.c | 56 +++++++ src_nbgl/ui_display_privacy.c | 68 ++++++++ src_nbgl/ui_get_eth2_public_key.c | 30 ++++ src_nbgl/ui_get_public_key.c | 28 ++++ src_nbgl/ui_get_stark_public_key.c | 29 ++++ src_nbgl/ui_idle.c | 61 ++++++++ src_nbgl/ui_nbgl.h | 19 +++ src_nbgl/ui_settings.c | 92 +++++++++++ src_nbgl/ui_sign_712.c | 80 ++++++++++ src_nbgl/ui_sign_712_v0.c | 66 ++++++++ src_nbgl/ui_sign_message.c | 166 ++++++++++++++++++++ src_nbgl/ui_stark_limit_order.c | 67 ++++++++ src_nbgl/ui_stark_transfer.c | 127 +++++++++++++++ src_nbgl/ui_stark_unsafe_sign.c | 70 +++++++++ src_nbgl/ui_warning_contract_data.c | 21 +++ 20 files changed, 1298 insertions(+), 8 deletions(-) create mode 100644 src_nbgl/ui_approve_tx.c create mode 100644 src_nbgl/ui_confirm_parameter.c create mode 100644 src_nbgl/ui_confirm_selector.c create mode 100644 src_nbgl/ui_display_privacy.c create mode 100644 src_nbgl/ui_get_eth2_public_key.c create mode 100644 src_nbgl/ui_get_public_key.c create mode 100644 src_nbgl/ui_get_stark_public_key.c create mode 100644 src_nbgl/ui_idle.c create mode 100644 src_nbgl/ui_nbgl.h create mode 100644 src_nbgl/ui_settings.c create mode 100644 src_nbgl/ui_sign_712.c create mode 100644 src_nbgl/ui_sign_712_v0.c create mode 100644 src_nbgl/ui_sign_message.c create mode 100644 src_nbgl/ui_stark_limit_order.c create mode 100644 src_nbgl/ui_stark_transfer.c create mode 100644 src_nbgl/ui_stark_unsafe_sign.c create mode 100644 src_nbgl/ui_warning_contract_data.c diff --git a/src/handle_swap_sign_transaction.c b/src/handle_swap_sign_transaction.c index 39268f5..7eb0e27 100644 --- a/src/handle_swap_sign_transaction.c +++ b/src/handle_swap_sign_transaction.c @@ -67,7 +67,13 @@ void handle_swap_sign_transaction(chain_config_t* config) { nvm_write((void*) &N_storage, (void*) &storage, sizeof(internalStorage_t)); } +#ifdef HAVE_BAGL UX_INIT(); +#endif // HAVE_BAGL +#ifdef HAVE_NBGL + nbgl_objInit(); +#endif // HAVE_NBGL + USB_power(0); USB_power(1); // ui_idle(); diff --git a/src/main.c b/src/main.c index d66dbb1..67442b0 100644 --- a/src/main.c +++ b/src/main.c @@ -877,9 +877,11 @@ void app_main(void) { } // override point, but nothing more to do +#ifdef HAVE_BAGL void io_seproxyhal_display(const bagl_element_t *element) { io_seproxyhal_display_default((bagl_element_t *) element); } +#endif unsigned char io_event(__attribute__((unused)) unsigned char channel) { // nothing done with the event, throw an error on the transport layer if @@ -890,10 +892,11 @@ unsigned char io_event(__attribute__((unused)) unsigned char channel) { case SEPROXYHAL_TAG_FINGER_EVENT: UX_FINGER_EVENT(G_io_seproxyhal_spi_buffer); break; - +#ifdef HAVE_BAGL case SEPROXYHAL_TAG_BUTTON_PUSH_EVENT: UX_BUTTON_PUSH_EVENT(G_io_seproxyhal_spi_buffer); break; +#endif // HAVE_BAGL case SEPROXYHAL_TAG_STATUS_EVENT: if (G_io_apdu_media == IO_APDU_MEDIA_USB_HID && @@ -907,16 +910,17 @@ unsigned char io_event(__attribute__((unused)) unsigned char channel) { break; case SEPROXYHAL_TAG_DISPLAY_PROCESSED_EVENT: +#ifdef HAVE_BAGL UX_DISPLAYED_EVENT({}); +#endif // HAVE_BAGL +#ifdef HAVE_NBGL + UX_DEFAULT_EVENT(); +#endif // HAVE_NBGL break; -#if 0 - case SEPROXYHAL_TAG_TICKER_EVENT: - UX_TICKER_EVENT(G_io_seproxyhal_spi_buffer, - { - }); - break; -#endif + case SEPROXYHAL_TAG_TICKER_EVENT: + UX_TICKER_EVENT(G_io_seproxyhal_spi_buffer, {}); + break; } // close the event if not done previously (by a display or whatever) @@ -958,7 +962,12 @@ void coin_main(chain_config_t *coin_config) { tmpCtx.transactionContext.currentItemIndex = 0; for (;;) { +#ifdef HAVE_BAGL UX_INIT(); +#endif // HAVE_BAGL +#ifdef HAVE_NBGL + nbgl_objInit(); +#endif // HAVE_NBGL BEGIN_TRY { TRY { diff --git a/src/ui_callbacks.h b/src/ui_callbacks.h index 2035c27..041f717 100644 --- a/src/ui_callbacks.h +++ b/src/ui_callbacks.h @@ -4,6 +4,10 @@ #include "shared_context.h" #include "ux.h" +#ifdef HAVE_NBGL +typedef int bagl_element_t; +#endif + unsigned int io_seproxyhal_touch_settings(const bagl_element_t *e); unsigned int io_seproxyhal_touch_exit(const bagl_element_t *e); unsigned int io_seproxyhal_touch_tx_ok(const bagl_element_t *e); diff --git a/src_nbgl/ui_approve_tx.c b/src_nbgl/ui_approve_tx.c new file mode 100644 index 0000000..e808cf2 --- /dev/null +++ b/src_nbgl/ui_approve_tx.c @@ -0,0 +1,235 @@ + +#include +#include "shared_context.h" +#include "ui_callbacks.h" +#include "ui_nbgl.h" +#include "network.h" +#include "plugins.h" + +// 1 more than actually displayed on screen, because of calculations in StaticReview +#define MAX_PLUGIN_ITEMS_PER_SCREEN 4 +#define TAG_MAX_LEN 43 +#define VALUE_MAX_LEN 79 +enum { + REJECT_TOKEN, + START_REVIEW_TOKEN, +}; + +static nbgl_layoutTagValue_t tlv; +// these buffers are used as circular +static char title_buffer[MAX_PLUGIN_ITEMS_PER_SCREEN][TAG_MAX_LEN]; +static char msg_buffer[MAX_PLUGIN_ITEMS_PER_SCREEN][VALUE_MAX_LEN]; +static char transaction_type[100]; +static nbgl_layoutTagValueList_t useCaseTagValueList; +static nbgl_pageInfoLongPress_t infoLongPress; + +struct tx_approval_context_t { + bool fromPlugin; + bool blindSigning; + bool displayNetwork; +}; + +static struct tx_approval_context_t tx_approval_context; + +static void reviewContinueCommon(void); + +static void reviewReject(void) { + io_seproxyhal_touch_tx_cancel(NULL); +} + +static void confirmTransation(void) { + io_seproxyhal_touch_tx_ok(NULL); +} + +static void onConfirmAbandon(void) { + nbgl_useCaseStatus("Transaction rejected", false, reviewReject); +} + +static void rejectTransactionQuestion(void) { + nbgl_useCaseConfirm("Reject transaction?", + NULL, + "Yes, reject", + "Go back to transaction", + onConfirmAbandon); +} + +static void reviewChoice(bool confirm) { + if (confirm) { + nbgl_useCaseStatus("TRANSACTION\nSIGNED", true, confirmTransation); + } else { + rejectTransactionQuestion(); + } +} + +// called by NBGL to get the tag/value pair corresponding to pairIndex +static nbgl_layoutTagValue_t *getTagValuePair(uint8_t pairIndex) { + static int counter = 0; + + if (tx_approval_context.fromPlugin) { + if (pairIndex < dataContext.tokenContext.pluginUiMaxItems) { + // for the next dataContext.tokenContext.pluginUiMaxItems items, get tag/value from + // plugin_ui_get_item_internal() + dataContext.tokenContext.pluginUiCurrentItem = pairIndex; + plugin_ui_get_item_internal((uint8_t *) title_buffer[counter], + TAG_MAX_LEN, + (uint8_t *) msg_buffer[counter], + VALUE_MAX_LEN); + tlv.item = title_buffer[counter]; + tlv.value = msg_buffer[counter]; + } else { + pairIndex -= dataContext.tokenContext.pluginUiMaxItems; + // for the last 1 (or 2), tags are fixed + if (tx_approval_context.displayNetwork && (pairIndex == 0)) { + tlv.item = "Network"; + tlv.value = strings.common.network_name; + } else { + tlv.item = "Max fees"; + tlv.value = strings.common.maxFee; + } + } + } else { + // if displayNonce is false, we skip index 2 + if ((pairIndex > 1) && (!N_storage.displayNonce)) { + pairIndex++; + } + + switch (pairIndex) { + case 0: + tlv.item = "Amount"; + tlv.value = strings.common.fullAmount; + break; + case 1: + tlv.item = "Address"; + tlv.value = strings.common.fullAddress; + break; + case 2: + tlv.item = "Nonce"; + tlv.value = strings.common.nonce; + break; + case 3: + tlv.item = "Max fees"; + tlv.value = strings.common.maxFee; + break; + case 4: + tlv.item = "Network"; + tlv.value = strings.common.network_name; + break; + } + } + // counter is used as index to circular buffer + counter++; + if (counter == MAX_PLUGIN_ITEMS_PER_SCREEN) { + counter = 0; + } + return &tlv; +} + +static void pageCallback(int token, uint8_t index) { + (void) index; + nbgl_pageRelease(pageContext); + if (token == REJECT_TOKEN) { + reviewReject(); + } else if (token == START_REVIEW_TOKEN) { + reviewContinueCommon(); + } +} + +static void reviewContinue(void) { + if (tx_approval_context.blindSigning) { + nbgl_pageInfoDescription_t info = { + .centeredInfo.icon = &C_round_warning_64px, + .centeredInfo.text1 = "Blind Signing", + .centeredInfo.text2 = + "This transaction cannot be\nsecurely interpreted by Ledger\nStax. It might put " + "your assets\nat risk.", + .centeredInfo.text3 = NULL, + .centeredInfo.style = LARGE_CASE_INFO, + .centeredInfo.offsetY = -32, + .footerText = "Reject transaction", + .footerToken = REJECT_TOKEN, + .tapActionText = "Tap to continue", + .tapActionToken = START_REVIEW_TOKEN, + .topRightStyle = NO_BUTTON_STYLE, + .actionButtonText = NULL, + .tuneId = TUNE_TAP_CASUAL}; + + if (pageContext != NULL) { + nbgl_pageRelease(pageContext); + pageContext = NULL; + } + pageContext = nbgl_pageDrawInfo(&pageCallback, NULL, &info); + } else { + reviewContinueCommon(); + } +} + +static void reviewContinueCommon(void) { + uint8_t nbPairs = 0; + + if (tx_approval_context.fromPlugin) { + // plugin id + max items + fees + nbPairs += dataContext.tokenContext.pluginUiMaxItems + 1; + if (tx_approval_context.displayNetwork) { + nbPairs++; + } + } else { + nbPairs += 3; + if (N_storage.displayNonce) { + nbPairs++; + } + if (tx_approval_context.displayNetwork) { + nbPairs++; + } + } + + useCaseTagValueList.pairs = NULL; + useCaseTagValueList.callback = getTagValuePair; + useCaseTagValueList.startIndex = 0; + useCaseTagValueList.nbPairs = nbPairs; ///< number of pairs in pairs array + useCaseTagValueList.smallCaseForValue = false; + useCaseTagValueList.wrapping = false; + infoLongPress.icon = get_app_chain_icon(); + infoLongPress.text = tx_approval_context.fromPlugin ? transaction_type : "Review transaction"; + infoLongPress.longPressText = "Hold to sign"; + nbgl_useCaseStaticReview(&useCaseTagValueList, + &infoLongPress, + "Reject transaction", + reviewChoice); +} + +static void buildFirstPage(void) { + if (tx_approval_context.fromPlugin) { + plugin_ui_get_id(); + SPRINTF(transaction_type, + "Review %s\ntransaction:\n%s", + strings.common.fullAddress, + strings.common.fullAmount); + nbgl_useCaseReviewStart(get_app_chain_icon(), + transaction_type, + NULL, + "Reject transaction", + reviewContinue, + rejectTransactionQuestion); + } else { + nbgl_useCaseReviewStart(get_app_chain_icon(), + "Review transaction", + NULL, + "Reject transaction", + reviewContinue, + rejectTransactionQuestion); + } +} + +void ux_approve_tx(bool fromPlugin) { + tx_approval_context.blindSigning = + !fromPlugin && tmpContent.txContent.dataPresent && !N_storage.contractDetails; + tx_approval_context.fromPlugin = fromPlugin; + tx_approval_context.displayNetwork = false; + + uint64_t chain_id = get_tx_chain_id(); + if (chainConfig->chainId == ETHEREUM_MAINNET_CHAINID && chain_id != chainConfig->chainId) { + tx_approval_context.displayNetwork = true; + } + + buildFirstPage(); +} diff --git a/src_nbgl/ui_confirm_parameter.c b/src_nbgl/ui_confirm_parameter.c new file mode 100644 index 0000000..81d2a8a --- /dev/null +++ b/src_nbgl/ui_confirm_parameter.c @@ -0,0 +1,56 @@ +#include "common_ui.h" +#include "ui_nbgl.h" +#include "network.h" + +static nbgl_layoutTagValue_t tlv; + +static void reviewReject(void) { + io_seproxyhal_touch_data_cancel(NULL); +} + +static void confirmTransation(void) { + io_seproxyhal_touch_data_ok(NULL); +} + +static void reviewChoice(bool confirm) { + if (confirm) { + confirmTransation(); + } else { + reviewReject(); + } +} + +static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { + if (page == 0) { + tlv.item = "Parameter"; + tlv.value = strings.tmp.tmp; + content->type = TAG_VALUE_LIST; + content->tagValueList.nbPairs = 1; + content->tagValueList.pairs = (nbgl_layoutTagValue_t *) &tlv; + } else if (page == 1) { + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_chain_icon(); + content->infoLongPress.text = "Confirm parameter"; + content->infoLongPress.longPressText = "Hold to confirm"; + } else { + return false; + } + // valid page so return true + return true; +} + +static void reviewContinue(void) { + nbgl_useCaseRegularReview(0, 2, "Reject parameter", NULL, displayTransactionPage, reviewChoice); +} + +static void buildScreen(void) { + nbgl_useCaseReviewStart(get_app_chain_icon(), + "Verify parameter", + NULL, + "Reject", + reviewContinue, + reviewReject); +} + +void ui_confirm_parameter(void) { + buildScreen(); +} diff --git a/src_nbgl/ui_confirm_selector.c b/src_nbgl/ui_confirm_selector.c new file mode 100644 index 0000000..3bf5a11 --- /dev/null +++ b/src_nbgl/ui_confirm_selector.c @@ -0,0 +1,56 @@ +#include "common_ui.h" +#include "ui_nbgl.h" +#include "network.h" + +static nbgl_layoutTagValue_t tlv; + +static void reviewReject(void) { + io_seproxyhal_touch_data_cancel(NULL); +} + +static void confirmTransation(void) { + io_seproxyhal_touch_data_ok(NULL); +} + +static void reviewChoice(bool confirm) { + if (confirm) { + confirmTransation(); + } else { + reviewReject(); + } +} + +static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { + if (page == 0) { + tlv.item = "Parameter"; + tlv.value = strings.tmp.tmp; + content->type = TAG_VALUE_LIST; + content->tagValueList.nbPairs = 1; + content->tagValueList.pairs = (nbgl_layoutTagValue_t *) &tlv; + } else if (page == 1) { + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_chain_icon(); + content->infoLongPress.text = "Confirm selector"; + content->infoLongPress.longPressText = "Hold to confirm"; + } else { + return false; + } + // valid page so return true + return true; +} + +static void reviewContinue(void) { + nbgl_useCaseRegularReview(0, 2, "Reject selector", NULL, displayTransactionPage, reviewChoice); +} + +static void buildScreen(void) { + nbgl_useCaseReviewStart(get_app_chain_icon(), + "Verify selector", + NULL, + "Reject", + reviewContinue, + reviewReject); +} + +void ui_confirm_selector(void) { + buildScreen(); +} diff --git a/src_nbgl/ui_display_privacy.c b/src_nbgl/ui_display_privacy.c new file mode 100644 index 0000000..b4a9d1c --- /dev/null +++ b/src_nbgl/ui_display_privacy.c @@ -0,0 +1,68 @@ +#include "common_ui.h" +#include "ui_nbgl.h" +#include "ui_callbacks.h" +#include "nbgl_use_case.h" +#include "network.h" + +static nbgl_layoutTagValue_t tlv[2]; +static char *review_string; + +static void reviewReject(void) { + io_seproxyhal_touch_privacy_cancel(NULL); +} + +static void confirmTransation(void) { + io_seproxyhal_touch_privacy_ok(NULL); +} + +static void reviewChoice(bool confirm) { + if (confirm) { + confirmTransation(); + } else { + reviewReject(); + } +} + +static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { + if (page == 0) { + tlv[0].item = "Address"; + tlv[0].value = strings.common.fullAddress; + tlv[1].item = "Key"; + tlv[1].value = strings.common.fullAmount; + + content->type = TAG_VALUE_LIST; + content->tagValueList.nbPairs = 2; + content->tagValueList.pairs = (nbgl_layoutTagValue_t *) tlv; + } else if (page == 1) { + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_chain_icon(); + content->infoLongPress.text = review_string; + content->infoLongPress.longPressText = "Hold to approve"; + } else { + return false; + } + // valid page so return true + return true; +} + +static void reviewContinue(void) { + nbgl_useCaseRegularReview(0, 2, "Reject", NULL, displayTransactionPage, reviewChoice); +} + +static void buildFirstPage(void) { + nbgl_useCaseReviewStart(get_app_chain_icon(), + review_string, + NULL, + "Reject", + reviewContinue, + reviewReject); +} + +void ui_display_privacy_public_key(void) { + review_string = "Provide public\nprivacy key"; + buildFirstPage(); +} + +void ui_display_privacy_shared_secret(void) { + review_string = "Provide public\nsecret key"; + buildFirstPage(); +} diff --git a/src_nbgl/ui_get_eth2_public_key.c b/src_nbgl/ui_get_eth2_public_key.c new file mode 100644 index 0000000..9f388df --- /dev/null +++ b/src_nbgl/ui_get_eth2_public_key.c @@ -0,0 +1,30 @@ +#include +#include "shared_context.h" +#include "ui_callbacks.h" +#include "ui_nbgl.h" + +static void reviewReject(void) { + io_seproxyhal_touch_address_cancel(NULL); +} + +static void confirmTransation(void) { + io_seproxyhal_touch_address_ok(NULL); +} + +static void reviewChoice(bool confirm) { + if (confirm) { + // display a status page and go back to main + nbgl_useCaseStatus("ADDRESS\nVERIFIED", true, confirmTransation); + } else { + nbgl_useCaseStatus("Address verification\ncancelled", false, reviewReject); + } +} + +static void buildScreen(void) { + snprintf(strings.tmp.tmp, 100, "0x%.*H", 48, tmpCtx.publicKeyContext.publicKey.W); + nbgl_useCaseAddressConfirmation(strings.tmp.tmp, reviewChoice); +} + +void ui_display_public_eth2(void) { + buildScreen(); +} \ No newline at end of file diff --git a/src_nbgl/ui_get_public_key.c b/src_nbgl/ui_get_public_key.c new file mode 100644 index 0000000..5966737 --- /dev/null +++ b/src_nbgl/ui_get_public_key.c @@ -0,0 +1,28 @@ +#include +#include "shared_context.h" +#include "ui_callbacks.h" +#include "ui_nbgl.h" + +static void reviewReject(void) { + io_seproxyhal_touch_address_cancel(NULL); +} + +static void confirmTransation(void) { + io_seproxyhal_touch_address_ok(NULL); +} + +static void reviewChoice(bool confirm) { + if (confirm) { + // display a status page and go back to main + nbgl_useCaseStatus("ADDRESS\nVERIFIED", true, confirmTransation); + } else { + nbgl_useCaseStatus("Address verification\ncancelled", false, reviewReject); + } +} + +static void buildScreen(void) { + nbgl_useCaseAddressConfirmation(strings.common.fullAddress, reviewChoice); +} +void ui_display_public_key(void) { + buildScreen(); +} \ No newline at end of file diff --git a/src_nbgl/ui_get_stark_public_key.c b/src_nbgl/ui_get_stark_public_key.c new file mode 100644 index 0000000..ce57787 --- /dev/null +++ b/src_nbgl/ui_get_stark_public_key.c @@ -0,0 +1,29 @@ +#include +#include "shared_context.h" +#include "ui_callbacks.h" +#include "ui_nbgl.h" + +static void reviewReject(void) { + io_seproxyhal_touch_address_cancel(NULL); +} + +static void confirmTransation(void) { + io_seproxyhal_touch_stark_pubkey_ok(NULL); +} + +static void reviewChoice(bool confirm) { + if (confirm) { + // display a status page and go back to main + nbgl_useCaseStatus("ADDRESS\nVERIFIED", true, confirmTransation); + } else { + nbgl_useCaseStatus("Address verification\ncancelled", false, reviewReject); + } +} + +static void buildScreen(void) { + nbgl_useCaseAddressConfirmation(strings.tmp.tmp, reviewChoice); +} + +void ui_display_stark_public(void) { + buildScreen(); +} \ No newline at end of file diff --git a/src_nbgl/ui_idle.c b/src_nbgl/ui_idle.c new file mode 100644 index 0000000..7e02101 --- /dev/null +++ b/src_nbgl/ui_idle.c @@ -0,0 +1,61 @@ +#include "common_ui.h" +#include "shared_context.h" +#include "ui_nbgl.h" +#include "nbgl_use_case.h" +#include "glyphs.h" +#include "network.h" + +uint8_t staxSharedBuffer[SHARED_BUFFER_SIZE] = {0}; + +nbgl_page_t* pageContext; + +void releaseContext(void) { + if (pageContext != NULL) { + nbgl_pageRelease(pageContext); + pageContext = NULL; + } +} +enum { BACK_TOKEN = 0, INFO_TOKEN, NEXT_TOKEN, CANCEL_TOKEN, QUIT_INFO_TOKEN, QUIT_APP_TOKEN }; + +void app_quit(void) { + // exit app here + os_sched_exit(-1); +} + +void ui_idle(void) { + if (plugin_name != NULL) { // plugin + nbgl_useCasePlugInHome((char*) plugin_name, + APPNAME, + &ICONGLYPH_SMALL, + NULL, + NULL, + true, + ui_menu_settings, + app_quit); + } else { + char* app_name = (char*) get_app_network_name(); + + switch (get_app_chain_id()) { + // Standalone apps + case 1: // Mainnet + case 3: // Ropsten + case 5: // Goerli + nbgl_useCaseHome(app_name, + get_app_chain_icon(), + NULL, + true, + ui_menu_settings, + app_quit); + break; + // Clones + default: + nbgl_useCaseHome(app_name, + get_app_chain_icon(), + NULL, + true, + ui_menu_settings, + app_quit); + break; + } + } +} diff --git a/src_nbgl/ui_nbgl.h b/src_nbgl/ui_nbgl.h new file mode 100644 index 0000000..66ffd4f --- /dev/null +++ b/src_nbgl/ui_nbgl.h @@ -0,0 +1,19 @@ +#ifndef _UI_NBGL_H_ +#define _UI_NBGL_H_ + +#include +#include +#include + +#define SHARED_BUFFER_SIZE SHARED_CTX_FIELD_1_SIZE +extern uint8_t staxSharedBuffer[SHARED_BUFFER_SIZE]; + +extern nbgl_page_t* pageContext; + +void releaseContext(void); + +void ui_idle(void); +void ui_menu_settings(void); +void ui_menu_about(void); + +#endif // _UI_NBGL_H_ \ No newline at end of file diff --git a/src_nbgl/ui_settings.c b/src_nbgl/ui_settings.c new file mode 100644 index 0000000..482d220 --- /dev/null +++ b/src_nbgl/ui_settings.c @@ -0,0 +1,92 @@ +#include "common_ui.h" +#include "ui_nbgl.h" +#include "nbgl_use_case.h" + +static const char* const infoTypes[] = {"Version", APPNAME " App"}; +static const char* const infoContents[] = {APPVERSION, "(c) 2022 Ledger"}; + +enum { BLIND_SIGNING_TOKEN = FIRST_USER_TOKEN, DEBUG_TOKEN, NONCE_TOKEN, EIP712_VERBOSE_TOKEN }; + +static nbgl_layoutSwitch_t switches[4]; + +static bool navCallback(uint8_t page, nbgl_pageContent_t* content) { + switch (page) { + case 0: + switches[0] = + (nbgl_layoutSwitch_t){.initState = N_storage.dataAllowed ? ON_STATE : OFF_STATE, + .text = "Blind signing", + .subText = "Enable transaction blind signing", + .token = BLIND_SIGNING_TOKEN, + .tuneId = TUNE_TAP_CASUAL}; + switches[1] = + (nbgl_layoutSwitch_t){.initState = N_storage.contractDetails ? ON_STATE : OFF_STATE, + .text = "Debug", + .subText = "Display contract data details", + .token = DEBUG_TOKEN, + .tuneId = TUNE_TAP_CASUAL}; + switches[2] = + (nbgl_layoutSwitch_t){.initState = N_storage.displayNonce ? ON_STATE : OFF_STATE, + .text = "Nonce", + .subText = "Display account nonce\nin transaction", + .token = NONCE_TOKEN, + .tuneId = TUNE_TAP_CASUAL}; + + content->type = SWITCHES_LIST; + content->switchesList.nbSwitches = 3; + content->switchesList.switches = (nbgl_layoutSwitch_t*) switches; + break; + + case 1: + switches[0] = + (nbgl_layoutSwitch_t){.initState = N_storage.verbose_eip712 ? ON_STATE : OFF_STATE, + .text = "Verbose EIP712", + .subText = "Ignore filtering and\ndisplay raw content", + .token = EIP712_VERBOSE_TOKEN, + .tuneId = TUNE_TAP_CASUAL}; + + content->type = SWITCHES_LIST; + content->switchesList.nbSwitches = 1; + content->switchesList.switches = (nbgl_layoutSwitch_t*) switches; + break; + + case 2: + content->type = INFOS_LIST; + content->infosList.nbInfos = 2; + content->infosList.infoTypes = (const char**) infoTypes; + content->infosList.infoContents = (const char**) infoContents; + break; + + default: + return false; + break; + } + + return true; +} + +static void controlsCallback(int token, uint8_t index) { + (void) index; + uint8_t value; + switch (token) { + case BLIND_SIGNING_TOKEN: + value = (N_storage.dataAllowed ? 0 : 1); + nvm_write((void*) &N_storage.dataAllowed, (void*) &value, sizeof(uint8_t)); + break; + case DEBUG_TOKEN: + value = (N_storage.contractDetails ? 0 : 1); + nvm_write((void*) &N_storage.contractDetails, (void*) &value, sizeof(uint8_t)); + break; + case NONCE_TOKEN: + value = (N_storage.displayNonce ? 0 : 1); + nvm_write((void*) &N_storage.displayNonce, (void*) &value, sizeof(uint8_t)); + break; + case EIP712_VERBOSE_TOKEN: + value = (N_storage.verbose_eip712 ? 0 : 1); + nvm_write((void*) &N_storage.verbose_eip712, (void*) &value, sizeof(uint8_t)); + break; + } +} + +void ui_menu_settings(void) { + nbgl_useCaseSettings(APPNAME " settings", 0, 3, true, ui_idle, navCallback, controlsCallback); +} diff --git a/src_nbgl/ui_sign_712.c b/src_nbgl/ui_sign_712.c new file mode 100644 index 0000000..c13a78a --- /dev/null +++ b/src_nbgl/ui_sign_712.c @@ -0,0 +1,80 @@ +#include "common_ui.h" +#include "ui_nbgl.h" +#include "ui_logic.h" +#include "common_712.h" +#include "nbgl_use_case.h" +#include "network.h" + +// 4 pairs of tag/value to display +static nbgl_layoutTagValue_t tlv; + +static void reject_message(void) { + ui_712_reject(NULL); +} + +static void sign_message() { + ui_712_approve(NULL); +} + +static void reviewChoice(bool confirm) { + if (confirm) { + sign_message(); + } else { + reject_message(); + } +} +static bool displaySignPage(uint8_t page, nbgl_pageContent_t *content) { + (void) page; + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_chain_icon(); + content->infoLongPress.text = "Sign typed message"; + content->infoLongPress.longPressText = "Hold to sign"; + return true; +} + +static uint32_t stringsIdx = 0; + +static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { + uint16_t len = 0; + if (stringsIdx < strlen(strings.tmp.tmp)) { + bool reached = nbgl_getTextMaxLenInNbLines(BAGL_FONT_INTER_REGULAR_32px, + strings.tmp.tmp + stringsIdx, + SCREEN_WIDTH - (2 * BORDER_MARGIN), + 9, + &len); + memset(staxSharedBuffer, 0, sizeof(staxSharedBuffer)); + memcpy(staxSharedBuffer, strings.tmp.tmp + stringsIdx, len); + stringsIdx += len; + tlv.item = strings.tmp.tmp2; + tlv.value = staxSharedBuffer; + content->type = TAG_VALUE_LIST; + content->tagValueList.nbPairs = 1; + content->tagValueList.pairs = &tlv; + return true; + } else { + stringsIdx = 0; + switch (ui_712_next_field()) { + case EIP712_NO_MORE_FIELD: + return displaySignPage(page, content); + break; + case EIP712_FIELD_INCOMING: + case EIP712_FIELD_LATER: + default: + break; + } + return false; + } +} + +void ui_712_switch_to_sign(void) { + nbgl_useCaseRegularReview(0, 0, "Reject", NULL, displaySignPage, reviewChoice); +} + +void ui_712_start(void) { + stringsIdx = 0; + nbgl_useCaseRegularReview(0, 0, "Reject", NULL, displayTransactionPage, reviewChoice); +} + +void ui_712_switch_to_message(void) { + stringsIdx = 0; + nbgl_useCaseRegularReview(0, 0, "Reject", NULL, displayTransactionPage, reviewChoice); +} diff --git a/src_nbgl/ui_sign_712_v0.c b/src_nbgl/ui_sign_712_v0.c new file mode 100644 index 0000000..34b529c --- /dev/null +++ b/src_nbgl/ui_sign_712_v0.c @@ -0,0 +1,66 @@ +#include "common_ui.h" +#include "ui_nbgl.h" +#include "common_712.h" +#include "network.h" + +static nbgl_layoutTagValue_t tlv[2]; + +static char domain_hash[70]; +static char message_hash[70]; + +static void reviewReject(void) { + ui_712_approve_cb(NULL); +} + +static void confirmTransation(void) { + ui_712_reject_cb(NULL); +} + +static void reviewChoice(bool confirm) { + if (confirm) { + // display a status page and go back to main + nbgl_useCaseStatus("MESSAGE\nSIGNED", true, confirmTransation); + } else { + nbgl_useCaseStatus("Message signing\ncancelled", false, reviewReject); + } +} + +static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { + snprintf(domain_hash, 70, "0x%.*H", 32, tmpCtx.messageSigningContext712.domainHash); + snprintf(message_hash, 70, "0x%.*H", 32, tmpCtx.messageSigningContext712.messageHash); + + if (page == 0) { + tlv[0].item = "Domain hash"; + tlv[0].value = domain_hash; + tlv[1].item = "Message hash"; + tlv[1].value = message_hash; + + content->type = TAG_VALUE_LIST; + content->tagValueList.nbPairs = 2; + content->tagValueList.pairs = (nbgl_layoutTagValue_t *) tlv; + } else if (page == 1) { + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_chain_icon(); + content->infoLongPress.text = "Sign typed message"; + content->infoLongPress.longPressText = "Hold to sign"; + } else { + return false; + } + // valid page so return true + return true; +} +static void reviewContinue(void) { + nbgl_useCaseRegularReview(0, 2, "Reject", NULL, displayTransactionPage, reviewChoice); +} + +static void buildFirstPage(void) { + nbgl_useCaseReviewStart(get_app_chain_icon(), + "Sign typed message", + NULL, + "Reject", + reviewContinue, + reviewReject); +} + +void ui_sign_712_v0(void) { + buildFirstPage(); +} diff --git a/src_nbgl/ui_sign_message.c b/src_nbgl/ui_sign_message.c new file mode 100644 index 0000000..7bcf541 --- /dev/null +++ b/src_nbgl/ui_sign_message.c @@ -0,0 +1,166 @@ +#include +#include "shared_context.h" +#include "ui_callbacks.h" +#include "ui_nbgl.h" +#include "sign_message.h" +#include "glyphs.h" +#include "nbgl_use_case.h" +#include "common_ui.h" + +typedef enum { + UI_191_NBGL_START_REVIEW_DISPLAYED = 0, + UI_191_NBGL_GO_TO_NEXT_CONTENT, + UI_191_NBGL_BACK_FROM_REJECT_CANCEL, + UI_191_NBGL_GO_TO_SIGN, + UI_191_NBGL_SIGN_DISPLAYED, +} e_ui_nbgl_191_state; + +static e_ui_nbgl_191_state state; +static e_ui_nbgl_191_state state_before_reject_cancel; + +static nbgl_layoutTagValue_t pair; + +// +static uint32_t eip191MessageIdx = 0; +static uint32_t stringsTmpTmpIdx = 0; + +static void reject_message(void) { + io_seproxyhal_touch_signMessage_cancel(); +} + +static void sign_message() { + io_seproxyhal_touch_signMessage_ok(); +} + +static bool nav_callback(uint8_t page, nbgl_pageContent_t *content) { + UNUSED(page); + + if ((state != UI_191_NBGL_GO_TO_SIGN) && (state != UI_191_NBGL_SIGN_DISPLAYED)) { + if (state != UI_191_NBGL_BACK_FROM_REJECT_CANCEL) { + memset(staxSharedBuffer + eip191MessageIdx, 0, SHARED_BUFFER_SIZE - eip191MessageIdx); + memcpy( + staxSharedBuffer + eip191MessageIdx, + strings.tmp.tmp + stringsTmpTmpIdx, + MIN(SHARED_BUFFER_SIZE - eip191MessageIdx, SHARED_BUFFER_SIZE - stringsTmpTmpIdx)); + uint16_t len = 0; + bool reached = nbgl_getTextMaxLenInNbLines(BAGL_FONT_INTER_REGULAR_32px, + staxSharedBuffer, + SCREEN_WIDTH - (2 * BORDER_MARGIN), + 9, + &len); + + stringsTmpTmpIdx = len - eip191MessageIdx; + eip191MessageIdx = len; + staxSharedBuffer[eip191MessageIdx] = '\0'; + + if (!reached && eip191MessageIdx < SHARED_BUFFER_SIZE) { + stringsTmpTmpIdx = 0; + question_switcher(); + + if (state != UI_191_NBGL_GO_TO_SIGN) { + return false; + } + } else if (reached || eip191MessageIdx == SHARED_BUFFER_SIZE) { + eip191MessageIdx = 0; + } + } + + pair.value = staxSharedBuffer; + pair.item = "Message"; + content->type = TAG_VALUE_LIST; + content->tagValueList.nbPairs = 1; + content->tagValueList.pairs = &pair; + content->tagValueList.smallCaseForValue = false; + content->tagValueList.nbMaxLinesForValue = 9; + content->tagValueList.wrapping = false; + + if (state == UI_191_NBGL_BACK_FROM_REJECT_CANCEL) { + // We come back from Reject screen. + // The previously displayed content must be redisplayed. + // Do not call question_switcher() to avoid replacing + // string.tmp.tmp content. + state = state_before_reject_cancel; + } else if (stringsTmpTmpIdx >= strlen(strings.tmp.tmp)) { + // Fetch the next content to display into strings.tmp.tmp buffer. + stringsTmpTmpIdx = 0; + question_switcher(); + return true; + } + } else { + // the last page must contain a long press button + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = &C_Message_64px; + content->infoLongPress.text = "Sign Message?"; + content->infoLongPress.longPressText = "Hold to sign"; + state = UI_191_NBGL_SIGN_DISPLAYED; + } + return true; +} + +static void choice_callback(bool confirm) { + if (confirm) { + nbgl_useCaseStatus("MESSAGE\nSIGNED", true, sign_message); + sign_message(); + } +} + +static void continue_review(void) { + nbgl_useCaseForwardOnlyReview("Reject", NULL, nav_callback, choice_callback); +} + +static void confirm_transaction_rejection_choice(bool confirm) { + if (confirm) { + reject_message(); + } else { + // Go to previous screen accordingly + if (state == UI_191_NBGL_START_REVIEW_DISPLAYED) { + ui_191_start(); + } else { + if (state != UI_191_NBGL_SIGN_DISPLAYED) { + state_before_reject_cancel = state; + state = UI_191_NBGL_BACK_FROM_REJECT_CANCEL; + } + continue_review(); + } + } +} + +static void confirm_transaction_rejection() { + nbgl_useCaseChoice(&C_warning64px, + "Reject message?", + NULL, + "Yes, Reject", + "Go back to message", + confirm_transaction_rejection_choice); +} + +void ui_191_start(void) { + state = UI_191_NBGL_START_REVIEW_DISPLAYED; + eip191MessageIdx = 0; + stringsTmpTmpIdx = 0; + + nbgl_useCaseReviewStart(&C_Message_64px, + "Review message", + NULL, + "Reject", + continue_review, + confirm_transaction_rejection); +} + +void ui_191_switch_to_message(void) { + // No question mechanism on Stax: + // Message is already displayed + state = UI_191_NBGL_GO_TO_NEXT_CONTENT; + continue_review(); +} + +void ui_191_switch_to_sign(void) { + // Next nav_callback callback must display + // the hold to approve screen + state = UI_191_NBGL_GO_TO_SIGN; +} + +void ui_191_switch_to_question(void) { + // No question mechanism on Stax: + // Always display the next message chunk. + continue_displaying_message(); +} \ No newline at end of file diff --git a/src_nbgl/ui_stark_limit_order.c b/src_nbgl/ui_stark_limit_order.c new file mode 100644 index 0000000..20277be --- /dev/null +++ b/src_nbgl/ui_stark_limit_order.c @@ -0,0 +1,67 @@ +#include "common_ui.h" +#include "ui_nbgl.h" +#include "ui_callbacks.h" +#include "nbgl_use_case.h" +#include "network.h" + +#ifdef HAVE_STARKWARE + +static nbgl_layoutTagValue_t tlv[3]; + +static void reviewReject(void) { + io_seproxyhal_touch_tx_cancel(NULL); +} + +static void confirmTransation(void) { + io_seproxyhal_touch_stark_ok(NULL); +} + +static void reviewChoice(bool confirm) { + if (confirm) { + confirmTransation(); + } else { + reviewReject(); + } +} + +static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { + if (page == 0) { + tlv[0].item = "Sell"; + tlv[0].value = strings.common.fullAmount; + tlv[1].item = "Buy"; + tlv[1].value = strings.common.maxFee; + tlv[2].item = "Token amount"; + tlv[2].value = strings.common.fullAddress; + + content->type = TAG_VALUE_LIST; + content->tagValueList.nbPairs = 3; + content->tagValueList.pairs = (nbgl_layoutTagValue_t *) tlv; + } else if (page == 1) { + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_chain_icon(); + content->infoLongPress.text = "Review stark limit order"; + content->infoLongPress.longPressText = "Hold to sign"; + } else { + return false; + } + // valid page so return true + return true; +} + +static void reviewContinue(void) { + nbgl_useCaseRegularReview(0, 2, "Reject", NULL, displayTransactionPage, reviewChoice); +} + +static void buildFirstPage(void) { + nbgl_useCaseReviewStart(get_app_chain_icon(), + "Review stark limit order", + NULL, + "Reject", + reviewContinue, + reviewReject); +} + +void ui_stark_limit_order(void) { + buildFirstPage(); +} + +#endif \ No newline at end of file diff --git a/src_nbgl/ui_stark_transfer.c b/src_nbgl/ui_stark_transfer.c new file mode 100644 index 0000000..3532c17 --- /dev/null +++ b/src_nbgl/ui_stark_transfer.c @@ -0,0 +1,127 @@ +#include +#include "shared_context.h" +#include "ui_callbacks.h" +#include "ui_nbgl.h" +#include "starkDisplayUtils.h" +#include "ethUtils.h" +#include "network.h" + +#ifdef HAVE_STARKWARE + +static nbgl_layoutTagValue_t tlv[3]; +static char condAddressBuffer[43]; +struct stark_transfer_context { + bool selfTransfer; + bool conditional; +}; + +static struct stark_transfer_context context; + +static void reviewReject(void) { + io_seproxyhal_touch_tx_cancel(NULL); +} + +static void confirmTransation(void) { + io_seproxyhal_touch_stark_ok(NULL); +} + +static void reviewChoice(bool confirm) { + if (confirm) { + confirmTransation(); + } else { + reviewReject(); + } +} + +static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { + uint8_t count = 0; + if (page == 0) { + tlv[count].item = "Amount"; + tlv[count].value = tmpContent.tmp; + count++; + + if (context.selfTransfer == false && context.conditional == false) { + tlv[count].item = "Master Account"; + tlv[count].value = strings.tmp.tmp; + count++; + } + if (context.conditional) { + stark_sign_display_master_account(); + tlv[count].item = "Master Account"; + tlv[count].value = strings.tmp.tmp; + count++; + } + tlv[count].item = "Token Account"; + tlv[count].value = strings.tmp.tmp2; + content->type = TAG_VALUE_LIST; + content->tagValueList.nbPairs = count; + content->tagValueList.pairs = (nbgl_layoutTagValue_t *) tlv; + + return true; + } + if (page == 1) { + if (context.conditional) { + getEthDisplayableAddress(dataContext.starkContext.conditionAddress, + condAddressBuffer, + sizeof(condAddressBuffer), + &global_sha3, + chainConfig->chainId), + tlv[0].item = "Cond. Address"; + tlv[0].value = condAddressBuffer; + + stark_sign_display_condition_fact(); + tlv[1].item = "Cond. Address"; + tlv[1].value = strings.tmp.tmp; + + content->type = TAG_VALUE_LIST; + content->tagValueList.nbPairs = 2; + content->tagValueList.pairs = (nbgl_layoutTagValue_t *) tlv; + + } else { + page++; + } + } + if (page == 2) { + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_chain_icon(); + content->infoLongPress.text = "Review transaction"; + content->infoLongPress.longPressText = "Hold to sign"; + } + + return false; +} + +static void reviewContinue(void) { + nbgl_useCaseRegularReview(0, + context.conditional ? 3 : 2, + "Reject", + NULL, + displayTransactionPage, + reviewChoice); +} + +void ui_stark_transfer(bool selfTransfer, bool conditional) { + context.selfTransfer = selfTransfer; + context.conditional = conditional; + char *subTitle; + if (conditional) { + if (selfTransfer) { + subTitle = "Conditionnal self transfer"; + } else { + subTitle = "Conditionnal transfer"; + } + } else { + if (selfTransfer) { + subTitle = "self transfer"; + } else { + subTitle = "Transfer"; + } + } + nbgl_useCaseReviewStart(get_app_chain_icon(), + "Review stark transaction", + subTitle, + "Reject", + reviewContinue, + reviewReject); +} + +#endif // #ifdef HAVE_STARKWARE diff --git a/src_nbgl/ui_stark_unsafe_sign.c b/src_nbgl/ui_stark_unsafe_sign.c new file mode 100644 index 0000000..59a6eac --- /dev/null +++ b/src_nbgl/ui_stark_unsafe_sign.c @@ -0,0 +1,70 @@ + +#include "common_ui.h" +#include "ui_nbgl.h" +#include "ui_callbacks.h" +#include "nbgl_use_case.h" +#include "network.h" + +#ifdef HAVE_STARKWARE + +static nbgl_layoutTagValue_t tlv[2]; +static char from_account[64]; +static char message_hash[64]; + +static void reviewReject(void) { + io_seproxyhal_touch_tx_cancel(NULL); +} + +static void confirmTransation(void) { + io_seproxyhal_touch_stark_unsafe_sign_ok(NULL); +} + +static void reviewChoice(bool confirm) { + if (confirm) { + confirmTransation(); + } else { + reviewReject(); + } +} + +static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { + snprintf(from_account, sizeof(from_account), "0x%.*H", 32, dataContext.starkContext.w1); + snprintf(message_hash, sizeof(message_hash), "0x%.*H", 32, dataContext.starkContext.w2); + + if (page == 0) { + tlv[0].item = "From Account"; + tlv[0].value = from_account; + tlv[1].item = "Hash"; + tlv[1].value = message_hash; + content->type = TAG_VALUE_LIST; + content->tagValueList.nbPairs = 2; + content->tagValueList.pairs = (nbgl_layoutTagValue_t *) tlv; + } else if (page == 1) { + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_chain_icon(); + content->infoLongPress.text = "Unsafe Stark Sign"; + content->infoLongPress.longPressText = "Hold to sign"; + } else { + return false; + } + // valid page so return true + return true; +} + +static void reviewContinue(void) { + nbgl_useCaseRegularReview(0, 2, "Reject", NULL, displayTransactionPage, reviewChoice); +} + +static void buildFirstPage(void) { + nbgl_useCaseReviewStart(get_app_chain_icon(), + "Unsafe Stark Sign", + NULL, + "Reject", + reviewContinue, + reviewReject); +} + +void ui_stark_unsafe_sign(void) { + buildFirstPage(); +} + +#endif // HAVE_STARKWARE \ No newline at end of file diff --git a/src_nbgl/ui_warning_contract_data.c b/src_nbgl/ui_warning_contract_data.c new file mode 100644 index 0000000..2619dce --- /dev/null +++ b/src_nbgl/ui_warning_contract_data.c @@ -0,0 +1,21 @@ +#include +#include "shared_context.h" +#include "ui_callbacks.h" +#include "ui_nbgl.h" + +static void ui_warning_contract_data_choice(bool confirm) { + if (confirm) { + ui_idle(); + } else { + ui_menu_settings(); + } +} + +void ui_warning_contract_data(void) { + nbgl_useCaseChoice(&C_warning64px, + "This message cannot\nbe clear-signed", + "Enable blind-signing in\nthe settings to sign\nthis transaction.", + "Exit", + "Go to settings", + ui_warning_contract_data_choice); +} From b5c58b59cf59b0d7561bd6220cd481c5654e0698 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 4 May 2023 11:52:16 +0200 Subject: [PATCH 14/85] network: cleanup --- src/eth_plugin_handler.c | 2 +- src_bagl/ui_flow_signTx.c | 4 +-- src_common/network.c | 40 ++++++++++++++++++++++++------ src_common/network.h | 17 ++++++++----- src_features/signTx/logic_signTx.c | 10 ++++---- 5 files changed, 52 insertions(+), 21 deletions(-) diff --git a/src/eth_plugin_handler.c b/src/eth_plugin_handler.c index 3aa6883..29e965f 100644 --- a/src/eth_plugin_handler.c +++ b/src/eth_plugin_handler.c @@ -64,7 +64,7 @@ void eth_plugin_prepare_query_contract_UI(ethQueryContractUI_t *queryContractUI, } queryContractUI->screenIndex = screenIndex; - strlcpy(queryContractUI->network_ticker, get_network_ticker(), MAX_TICKER_LEN); + strlcpy(queryContractUI->network_ticker, get_tx_network_ticker(), MAX_TICKER_LEN); queryContractUI->title = title; queryContractUI->titleLength = titleLength; queryContractUI->msg = msg; diff --git a/src_bagl/ui_flow_signTx.c b/src_bagl/ui_flow_signTx.c index 2b55922..c60f46d 100644 --- a/src_bagl/ui_flow_signTx.c +++ b/src_bagl/ui_flow_signTx.c @@ -220,7 +220,7 @@ void ux_approve_tx(bool fromPlugin) { // We're in a regular transaction, just show the amount and the address ux_approval_tx_flow[step++] = &ux_approval_amount_step; #ifdef HAVE_DOMAIN_NAME - uint64_t chain_id = get_chain_id(); + uint64_t chain_id = get_tx_chain_id(); if (has_domain_name(&chain_id, tmpContent.txContent.destination)) { ux_approval_tx_flow[step++] = &ux_domain_name_step; if (N_storage.verbose_domain_name) { @@ -238,7 +238,7 @@ void ux_approve_tx(bool fromPlugin) { ux_approval_tx_flow[step++] = &ux_approval_nonce_step; } - uint64_t chain_id = get_chain_id(); + uint64_t chain_id = get_tx_chain_id(); if (chainConfig->chainId == ETHEREUM_MAINNET_CHAINID && chain_id != chainConfig->chainId) { ux_approval_tx_flow[step++] = &ux_approval_network_step; } diff --git a/src_common/network.c b/src_common/network.c index f0dc4d1..1111134 100644 --- a/src_common/network.c +++ b/src_common/network.c @@ -7,6 +7,8 @@ #include "shared_context.h" #include "utils.h" +typedef enum { APP, TX } e_net_type; + // Mappping of chain ids to networks. static const network_info_t NETWORK_MAPPING[] = { {.chain_id = 1, .name = "Ethereum", .ticker = "ETH"}, @@ -64,7 +66,7 @@ static const network_info_t NETWORK_MAPPING[] = { {.chain_id = 39797, .name = "Energi", .ticker = "NRG"}, {.chain_id = 248, .name = "Oasys", .ticker = "OAS"}}; -uint64_t get_chain_id(void) { +uint64_t get_tx_chain_id(void) { uint64_t chain_id = 0; switch (txContext.txType) { @@ -83,8 +85,16 @@ uint64_t get_chain_id(void) { return chain_id; } -const network_info_t *get_network(void) { - uint64_t chain_id = get_chain_id(); +uint64_t get_app_chain_id(void) { + return chainConfig->chainId; +} + +static uint64_t get_chain_id(e_net_type type) { + return (type == APP) ? get_app_chain_id() : get_tx_chain_id(); +} + +static const network_info_t *get_network(e_net_type type) { + uint64_t chain_id = get_chain_id(type); for (size_t i = 0; i < sizeof(NETWORK_MAPPING) / sizeof(*NETWORK_MAPPING); i++) { if (NETWORK_MAPPING[i].chain_id == chain_id) { return (const network_info_t *) PIC(&NETWORK_MAPPING[i]); @@ -93,8 +103,8 @@ const network_info_t *get_network(void) { return NULL; } -const char *get_network_name(void) { - const network_info_t *network = get_network(); +static const char *get_network_name(e_net_type type) { + const network_info_t *network = get_network(type); if (network == NULL) { return NULL; } else { @@ -102,11 +112,27 @@ const char *get_network_name(void) { } } -const char *get_network_ticker(void) { - const network_info_t *network = get_network(); +const char *get_app_network_name(void) { + return get_network_name(APP); +} + +const char *get_tx_network_name(void) { + return get_network_name(TX); +} + +static const char *get_network_ticker(e_net_type type) { + const network_info_t *network = get_network(type); if (network == NULL) { return chainConfig->coinName; } else { return (char *) PIC(network->ticker); } } + +const char *get_app_network_ticker(void) { + return get_network_ticker(APP); +} + +const char *get_tx_network_ticker(void) { + return get_network_ticker(TX); +} \ No newline at end of file diff --git a/src_common/network.h b/src_common/network.h index b9ce7f3..e9069f5 100644 --- a/src_common/network.h +++ b/src_common/network.h @@ -11,13 +11,18 @@ typedef struct network_info_s { uint64_t chain_id; } network_info_t; -// Returns the current chain id. Defaults to 0 if txType was not found. -uint64_t get_chain_id(void); -// Returns a pointer to the network struct, or NULL if there is none. -const network_info_t *get_network(void); +// Returns the chain ID. Defaults to 0 if txType was not found (For TX). +uint64_t get_tx_chain_id(void); +uint64_t get_app_chain_id(void); +#ifdef HAVE_NBGL +const nbgl_icon_details_t *get_app_chain_icon(void); +#endif // HAVE_NBGL // Returns a pointer to the network name, or NULL if there is none. -const char *get_network_name(void); +const char *get_tx_network_name(void); +const char *get_app_network_name(void); + // Returns a pointer to the network ticker, or chainConfig->coinName if there is none. -const char *get_network_ticker(void); +const char *get_tx_network_ticker(void); +const char *get_app_network_ticker(void); #endif // _NETWORK_H_ diff --git a/src_features/signTx/logic_signTx.c b/src_features/signTx/logic_signTx.c index 199ccbb..c3074db 100644 --- a/src_features/signTx/logic_signTx.c +++ b/src_features/signTx/logic_signTx.c @@ -195,7 +195,7 @@ static void address_to_string(uint8_t *in, } static void raw_fee_to_string(uint256_t *rawFee, char *displayBuffer, uint32_t displayBufferSize) { - const char *feeTicker = get_network_ticker(); + const char *feeTicker = get_tx_network_ticker(); uint8_t tickerOffset = 0; uint32_t i; @@ -262,10 +262,10 @@ static void nonce_to_string(const txInt256_t *nonce, char *out, size_t out_size) } static void get_network_as_string(char *out, size_t out_size) { - const char *name = get_network_name(); + const char *name = get_tx_network_name(); if (name == NULL) { // No network name found so simply copy the chain ID as the network name. - uint64_t chain_id = get_chain_id(); + uint64_t chain_id = get_tx_chain_id(); u64_to_string(chain_id, out, out_size); } else { // Network name found, simply copy it. @@ -312,13 +312,13 @@ static int strcasecmp_workaround(const char *str1, const char *str2) { void finalizeParsing(bool direct) { char displayBuffer[50]; uint8_t decimals = WEI_TO_ETHER; - const char *ticker = get_network_ticker(); + const char *ticker = get_tx_network_ticker(); ethPluginFinalize_t pluginFinalize; bool use_standard_UI = true; // Verify the chain if (chainConfig->chainId != ETHEREUM_MAINNET_CHAINID) { - uint64_t id = get_chain_id(); + uint64_t id = get_tx_chain_id(); if (chainConfig->chainId != id) { PRINTF("Invalid chainID %u expected %u\n", id, chainConfig->chainId); From 0414a043c8e3f338528ffa897cd9b441d5e6cbde Mon Sep 17 00:00:00 2001 From: Clement Bouvet Date: Tue, 21 Feb 2023 11:15:20 +0100 Subject: [PATCH 15/85] rework plugin start so name and icon can be passed to eth --- src/chainConfig.h | 7 +++++++ src/main.c | 43 +++++++++++++++++++++++-------------------- src/shared_context.h | 2 ++ src/swap_lib_calls.h | 13 +++++++++++++ src_common/network.c | 13 ++++++++++++- 5 files changed, 57 insertions(+), 21 deletions(-) diff --git a/src/chainConfig.h b/src/chainConfig.h index 070de49..63a4324 100644 --- a/src/chainConfig.h +++ b/src/chainConfig.h @@ -77,10 +77,17 @@ typedef enum chain_kind_e { CHAIN_KIND_OASYS } chain_kind_t; +#ifdef HAVE_NBGL +#include "nbgl_types.h" +#endif // HAVE_NBGL + typedef struct chain_config_s { char coinName[10]; // ticker uint64_t chainId; chain_kind_t kind; +#ifdef HAVE_NBGL + nbgl_icon_details_t coinIconDetails; +#endif // HAVE_NBGL } chain_config_t; #define ETHEREUM_MAINNET_CHAINID 1 diff --git a/src/main.c b/src/main.c index 67442b0..7032183 100644 --- a/src/main.c +++ b/src/main.c @@ -69,7 +69,8 @@ bolos_ux_params_t G_ux_params; const internalStorage_t N_storage_real; -chain_config_t *chainConfig; +const char *plugin_name = NULL; +chain_config_t *chainConfig = NULL; void reset_app_context() { // PRINTF("!!RESET_APP_CONTEXT\n"); @@ -950,14 +951,19 @@ void init_coin_config(chain_config_t *coin_config) { coin_config->kind = CHAIN_KIND; } -void coin_main(chain_config_t *coin_config) { +void coin_main(libargs_t *args) { chain_config_t config; - if (coin_config == NULL) { + if (args) { + if (args->chain_config != NULL) { + chainConfig = args->chain_config; + } + plugin_name = args->plugin_name; + } + if (chainConfig == NULL) { init_coin_config(&config); chainConfig = &config; - } else { - chainConfig = coin_config; } + reset_app_context(); tmpCtx.transactionContext.currentItemIndex = 0; @@ -1031,18 +1037,7 @@ void coin_main(chain_config_t *coin_config) { app_exit(); } -struct libargs_s { - unsigned int id; - unsigned int command; - chain_config_t *chain_config; - union { - check_address_parameters_t *check_address; - create_transaction_parameters_t *create_transaction; - get_printable_amount_parameters_t *get_printable_amount; - }; -}; - -static void library_main_helper(struct libargs_s *args) { +static void library_main_helper(libargs_t *args) { check_api_level(CX_COMPAT_APILEVEL); PRINTF("Inside a library \n"); switch (args->command) { @@ -1070,7 +1065,7 @@ static void library_main_helper(struct libargs_s *args) { } } -void library_main(struct libargs_s *args) { +void library_main(libargs_t *args) { chain_config_t coin_config; if (args->chain_config == NULL) { init_coin_config(&coin_config); @@ -1102,6 +1097,13 @@ __attribute__((section(".boot"))) int main(int arg0) { unsigned int libcall_params[5]; chain_config_t local_chainConfig; init_coin_config(&local_chainConfig); +#ifdef HAVE_NBGL + uint8_t coinIcon[sizeof(ICONBITMAP)]; + memcpy(coinIcon, &ICONBITMAP, sizeof(ICONBITMAP)); + memcpy(&local_chainConfig.coinIconDetails, &ICONGLYPH, sizeof(ICONGLYPH)); + local_chainConfig.coinIconDetails.bitmap = coinIcon; +#endif // HAVE_NBGL + PRINTF("Hello from Eth-clone\n"); check_api_level(CX_COMPAT_APILEVEL); // delegate to Ethereum app/lib @@ -1110,6 +1112,7 @@ __attribute__((section(".boot"))) int main(int arg0) { libcall_params[2] = RUN_APPLICATION; libcall_params[3] = (unsigned int) &local_chainConfig; libcall_params[4] = 0; + if (arg0) { // call as a library libcall_params[2] = ((unsigned int *) arg0)[1]; @@ -1141,7 +1144,7 @@ __attribute__((section(".boot"))) int main(int arg0) { return 0; } - struct libargs_s *args = (struct libargs_s *) arg0; + libargs_t *args = (libargs_t *) arg0; if (args->id != 0x100) { app_exit(); return 0; @@ -1149,7 +1152,7 @@ __attribute__((section(".boot"))) int main(int arg0) { switch (args->command) { case RUN_APPLICATION: // called as ethereum from altcoin or plugin - coin_main(args->chain_config); + coin_main(args); break; default: // called as ethereum or altcoin library diff --git a/src/shared_context.h b/src/shared_context.h index ce907dd..e4d3c4d 100644 --- a/src/shared_context.h +++ b/src/shared_context.h @@ -229,6 +229,8 @@ extern bool quantumSet; extern uint32_t eth2WithdrawalIndex; #endif +extern const char *plugin_name; + void reset_app_context(void); const uint8_t *parseBip32(const uint8_t *dataBuffer, uint8_t *dataLength, bip32_path_t *bip32); diff --git a/src/swap_lib_calls.h b/src/swap_lib_calls.h index 9bdb115..1bca6c2 100644 --- a/src/swap_lib_calls.h +++ b/src/swap_lib_calls.h @@ -2,6 +2,7 @@ #define _SWAP_LIB_CALLS_H_ #include "stdbool.h" +#include "chainConfig.h" #define RUN_APPLICATION 1 @@ -52,4 +53,16 @@ typedef struct create_transaction_parameters_s { const char* const destination_address_extra_id; } create_transaction_parameters_t; +typedef struct libargs_s { + unsigned int id; + unsigned int command; + chain_config_t* chain_config; + union { + check_address_parameters_t* check_address; + create_transaction_parameters_t* create_transaction; + get_printable_amount_parameters_t* get_printable_amount; + char* plugin_name; + }; +} libargs_t; + #endif // _SWAP_LIB_CALLS_H_ diff --git a/src_common/network.c b/src_common/network.c index 1111134..7366179 100644 --- a/src_common/network.c +++ b/src_common/network.c @@ -135,4 +135,15 @@ const char *get_app_network_ticker(void) { const char *get_tx_network_ticker(void) { return get_network_ticker(TX); -} \ No newline at end of file +} + +#ifdef HAVE_NBGL +#include "glyphs.h" +const nbgl_icon_details_t *get_app_chain_icon(void) { + if (chainConfig->coinIconDetails.bitmap) { + return &chainConfig->coinIconDetails; // if called from a clone, the bitmap is correct + } else { + return &ICONGLYPH; // else, jsu return the ETH icon + } +} +#endif // HAVE_NBGL \ No newline at end of file From 8361e349b754e6296dd739ea1fa8ed8f0b4a81c7 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Mon, 20 Mar 2023 10:27:19 +0100 Subject: [PATCH 16/85] Now has a separate struct for caller app name & icon - New home screen wording - Removed duplicate RUN_APPLICATION macro --- src/chainConfig.h | 7 ---- src/eth_plugin_internal.h | 1 - src/main.c | 32 ++++++++++----- src/shared_context.h | 15 ++++++- src/swap_lib_calls.h | 3 +- src_common/network.c | 11 ------ src_common/network.h | 3 -- src_nbgl/ui_approve_tx.c | 6 +-- src_nbgl/ui_confirm_parameter.c | 4 +- src_nbgl/ui_confirm_selector.c | 4 +- src_nbgl/ui_display_privacy.c | 4 +- src_nbgl/ui_idle.c | 70 ++++++++++++++++----------------- src_nbgl/ui_nbgl.h | 6 ++- src_nbgl/ui_sign_712.c | 2 +- src_nbgl/ui_sign_712_v0.c | 2 +- src_nbgl/ui_stark_limit_order.c | 6 +-- src_nbgl/ui_stark_transfer.c | 4 +- src_nbgl/ui_stark_unsafe_sign.c | 6 +-- tools/build_sdk.py | 10 +++-- 19 files changed, 103 insertions(+), 93 deletions(-) diff --git a/src/chainConfig.h b/src/chainConfig.h index 63a4324..070de49 100644 --- a/src/chainConfig.h +++ b/src/chainConfig.h @@ -77,17 +77,10 @@ typedef enum chain_kind_e { CHAIN_KIND_OASYS } chain_kind_t; -#ifdef HAVE_NBGL -#include "nbgl_types.h" -#endif // HAVE_NBGL - typedef struct chain_config_s { char coinName[10]; // ticker uint64_t chainId; chain_kind_t kind; -#ifdef HAVE_NBGL - nbgl_icon_details_t coinIconDetails; -#endif // HAVE_NBGL } chain_config_t; #define ETHEREUM_MAINNET_CHAINID 1 diff --git a/src/eth_plugin_internal.h b/src/eth_plugin_internal.h index 692c9b6..2d2ca03 100644 --- a/src/eth_plugin_internal.h +++ b/src/eth_plugin_internal.h @@ -7,7 +7,6 @@ #define SELECTOR_SIZE 4 #define PARAMETER_LENGTH 32 -#define RUN_APPLICATION 1 void copy_address(uint8_t* dst, const uint8_t* parameter, uint8_t dst_size); diff --git a/src/main.c b/src/main.c index 7032183..36dbdf6 100644 --- a/src/main.c +++ b/src/main.c @@ -69,7 +69,7 @@ bolos_ux_params_t G_ux_params; const internalStorage_t N_storage_real; -const char *plugin_name = NULL; +caller_app_t *caller_app = NULL; chain_config_t *chainConfig = NULL; void reset_app_context() { @@ -957,7 +957,13 @@ void coin_main(libargs_t *args) { if (args->chain_config != NULL) { chainConfig = args->chain_config; } - plugin_name = args->plugin_name; + if ((caller_app = args->caller_app) != NULL) { + if (chainConfig != NULL) { + caller_app->type = CALLER_TYPE_CLONE; + } else { + caller_app->type = CALLER_TYPE_PLUGIN; + } + } } if (chainConfig == NULL) { init_coin_config(&config); @@ -1097,12 +1103,6 @@ __attribute__((section(".boot"))) int main(int arg0) { unsigned int libcall_params[5]; chain_config_t local_chainConfig; init_coin_config(&local_chainConfig); -#ifdef HAVE_NBGL - uint8_t coinIcon[sizeof(ICONBITMAP)]; - memcpy(coinIcon, &ICONBITMAP, sizeof(ICONBITMAP)); - memcpy(&local_chainConfig.coinIconDetails, &ICONGLYPH, sizeof(ICONGLYPH)); - local_chainConfig.coinIconDetails.bitmap = coinIcon; -#endif // HAVE_NBGL PRINTF("Hello from Eth-clone\n"); check_api_level(CX_COMPAT_APILEVEL); @@ -1111,7 +1111,21 @@ __attribute__((section(".boot"))) int main(int arg0) { libcall_params[1] = 0x100; libcall_params[2] = RUN_APPLICATION; libcall_params[3] = (unsigned int) &local_chainConfig; - libcall_params[4] = 0; +#ifdef HAVE_NBGL + const char app_name[] = APPNAME; + caller_app_t capp; + nbgl_icon_details_t icon_details; + uint8_t bitmap[sizeof(ICONBITMAP)]; + + memcpy(&icon_details, &ICONGLYPH, sizeof(ICONGLYPH)); + memcpy(&bitmap, &ICONBITMAP, sizeof(bitmap)); + icon_details.bitmap = (const uint8_t *) bitmap; + capp.name = app_name; + capp.icon = &icon_details; + libcall_params[4] = (unsigned int) &capp; +#else + libcall_params[4] = NULL; +#endif // HAVE_NBGL if (arg0) { // call as a library diff --git a/src/shared_context.h b/src/shared_context.h index e4d3c4d..c2fc66a 100644 --- a/src/shared_context.h +++ b/src/shared_context.h @@ -7,6 +7,9 @@ #include "tokens.h" #include "chainConfig.h" #include "nft.h" +#ifdef HAVE_NBGL +#include "nbgl_types.h" +#endif #define MAX_BIP32_PATH 10 @@ -221,6 +224,16 @@ typedef enum { extern pluginType_t pluginType; +typedef enum { CALLER_TYPE_CLONE, CALLER_TYPE_PLUGIN } e_caller_type; + +typedef struct caller_app_t { + const char *name; +#ifdef HAVE_NBGL + const nbgl_icon_details_t *icon; +#endif + char type; // does not have to be set by the caller app +} caller_app_t; + extern uint8_t appState; #ifdef HAVE_STARKWARE extern bool quantumSet; @@ -229,7 +242,7 @@ extern bool quantumSet; extern uint32_t eth2WithdrawalIndex; #endif -extern const char *plugin_name; +extern caller_app_t *caller_app; void reset_app_context(void); const uint8_t *parseBip32(const uint8_t *dataBuffer, uint8_t *dataLength, bip32_path_t *bip32); diff --git a/src/swap_lib_calls.h b/src/swap_lib_calls.h index 1bca6c2..4fd0284 100644 --- a/src/swap_lib_calls.h +++ b/src/swap_lib_calls.h @@ -3,6 +3,7 @@ #include "stdbool.h" #include "chainConfig.h" +#include "shared_context.h" #define RUN_APPLICATION 1 @@ -61,7 +62,7 @@ typedef struct libargs_s { check_address_parameters_t* check_address; create_transaction_parameters_t* create_transaction; get_printable_amount_parameters_t* get_printable_amount; - char* plugin_name; + caller_app_t* caller_app; }; } libargs_t; diff --git a/src_common/network.c b/src_common/network.c index 7366179..dbb8f6b 100644 --- a/src_common/network.c +++ b/src_common/network.c @@ -136,14 +136,3 @@ const char *get_app_network_ticker(void) { const char *get_tx_network_ticker(void) { return get_network_ticker(TX); } - -#ifdef HAVE_NBGL -#include "glyphs.h" -const nbgl_icon_details_t *get_app_chain_icon(void) { - if (chainConfig->coinIconDetails.bitmap) { - return &chainConfig->coinIconDetails; // if called from a clone, the bitmap is correct - } else { - return &ICONGLYPH; // else, jsu return the ETH icon - } -} -#endif // HAVE_NBGL \ No newline at end of file diff --git a/src_common/network.h b/src_common/network.h index e9069f5..a2ce262 100644 --- a/src_common/network.h +++ b/src_common/network.h @@ -14,9 +14,6 @@ typedef struct network_info_s { // Returns the chain ID. Defaults to 0 if txType was not found (For TX). uint64_t get_tx_chain_id(void); uint64_t get_app_chain_id(void); -#ifdef HAVE_NBGL -const nbgl_icon_details_t *get_app_chain_icon(void); -#endif // HAVE_NBGL // Returns a pointer to the network name, or NULL if there is none. const char *get_tx_network_name(void); const char *get_app_network_name(void); diff --git a/src_nbgl/ui_approve_tx.c b/src_nbgl/ui_approve_tx.c index e808cf2..eb872ac 100644 --- a/src_nbgl/ui_approve_tx.c +++ b/src_nbgl/ui_approve_tx.c @@ -188,7 +188,7 @@ static void reviewContinueCommon(void) { useCaseTagValueList.nbPairs = nbPairs; ///< number of pairs in pairs array useCaseTagValueList.smallCaseForValue = false; useCaseTagValueList.wrapping = false; - infoLongPress.icon = get_app_chain_icon(); + infoLongPress.icon = get_app_icon(true); infoLongPress.text = tx_approval_context.fromPlugin ? transaction_type : "Review transaction"; infoLongPress.longPressText = "Hold to sign"; nbgl_useCaseStaticReview(&useCaseTagValueList, @@ -204,14 +204,14 @@ static void buildFirstPage(void) { "Review %s\ntransaction:\n%s", strings.common.fullAddress, strings.common.fullAmount); - nbgl_useCaseReviewStart(get_app_chain_icon(), + nbgl_useCaseReviewStart(get_app_icon(true), transaction_type, NULL, "Reject transaction", reviewContinue, rejectTransactionQuestion); } else { - nbgl_useCaseReviewStart(get_app_chain_icon(), + nbgl_useCaseReviewStart(get_app_icon(true), "Review transaction", NULL, "Reject transaction", diff --git a/src_nbgl/ui_confirm_parameter.c b/src_nbgl/ui_confirm_parameter.c index 81d2a8a..bebe5ae 100644 --- a/src_nbgl/ui_confirm_parameter.c +++ b/src_nbgl/ui_confirm_parameter.c @@ -28,7 +28,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { content->tagValueList.nbPairs = 1; content->tagValueList.pairs = (nbgl_layoutTagValue_t *) &tlv; } else if (page == 1) { - content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_chain_icon(); + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); content->infoLongPress.text = "Confirm parameter"; content->infoLongPress.longPressText = "Hold to confirm"; } else { @@ -43,7 +43,7 @@ static void reviewContinue(void) { } static void buildScreen(void) { - nbgl_useCaseReviewStart(get_app_chain_icon(), + nbgl_useCaseReviewStart(get_app_icon(true), "Verify parameter", NULL, "Reject", diff --git a/src_nbgl/ui_confirm_selector.c b/src_nbgl/ui_confirm_selector.c index 3bf5a11..c268d28 100644 --- a/src_nbgl/ui_confirm_selector.c +++ b/src_nbgl/ui_confirm_selector.c @@ -28,7 +28,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { content->tagValueList.nbPairs = 1; content->tagValueList.pairs = (nbgl_layoutTagValue_t *) &tlv; } else if (page == 1) { - content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_chain_icon(); + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); content->infoLongPress.text = "Confirm selector"; content->infoLongPress.longPressText = "Hold to confirm"; } else { @@ -43,7 +43,7 @@ static void reviewContinue(void) { } static void buildScreen(void) { - nbgl_useCaseReviewStart(get_app_chain_icon(), + nbgl_useCaseReviewStart(get_app_icon(true), "Verify selector", NULL, "Reject", diff --git a/src_nbgl/ui_display_privacy.c b/src_nbgl/ui_display_privacy.c index b4a9d1c..d2b2841 100644 --- a/src_nbgl/ui_display_privacy.c +++ b/src_nbgl/ui_display_privacy.c @@ -34,7 +34,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { content->tagValueList.nbPairs = 2; content->tagValueList.pairs = (nbgl_layoutTagValue_t *) tlv; } else if (page == 1) { - content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_chain_icon(); + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); content->infoLongPress.text = review_string; content->infoLongPress.longPressText = "Hold to approve"; } else { @@ -49,7 +49,7 @@ static void reviewContinue(void) { } static void buildFirstPage(void) { - nbgl_useCaseReviewStart(get_app_chain_icon(), + nbgl_useCaseReviewStart(get_app_icon(true), review_string, NULL, "Reject", diff --git a/src_nbgl/ui_idle.c b/src_nbgl/ui_idle.c index 7e02101..b14ca9b 100644 --- a/src_nbgl/ui_idle.c +++ b/src_nbgl/ui_idle.c @@ -5,9 +5,10 @@ #include "glyphs.h" #include "network.h" -uint8_t staxSharedBuffer[SHARED_BUFFER_SIZE] = {0}; +char staxSharedBuffer[SHARED_BUFFER_SIZE] = {0}; +nbgl_page_t *pageContext; -nbgl_page_t* pageContext; +#define FORMAT_PLUGIN "This app enables clear\nsigning transactions for\nthe %s dApp." void releaseContext(void) { if (pageContext != NULL) { @@ -15,47 +16,44 @@ void releaseContext(void) { pageContext = NULL; } } -enum { BACK_TOKEN = 0, INFO_TOKEN, NEXT_TOKEN, CANCEL_TOKEN, QUIT_INFO_TOKEN, QUIT_APP_TOKEN }; void app_quit(void) { // exit app here os_sched_exit(-1); } -void ui_idle(void) { - if (plugin_name != NULL) { // plugin - nbgl_useCasePlugInHome((char*) plugin_name, - APPNAME, - &ICONGLYPH_SMALL, - NULL, - NULL, - true, - ui_menu_settings, - app_quit); - } else { - char* app_name = (char*) get_app_network_name(); +const nbgl_icon_details_t *get_app_icon(bool caller_icon) { + const nbgl_icon_details_t *icon = NULL; - switch (get_app_chain_id()) { - // Standalone apps - case 1: // Mainnet - case 3: // Ropsten - case 5: // Goerli - nbgl_useCaseHome(app_name, - get_app_chain_icon(), - NULL, - true, - ui_menu_settings, - app_quit); - break; - // Clones - default: - nbgl_useCaseHome(app_name, - get_app_chain_icon(), - NULL, - true, - ui_menu_settings, - app_quit); - break; + if (caller_icon && caller_app) { + if (caller_app->icon) { + icon = caller_app->icon; } + } else { + icon = &ICONGLYPH; } + return icon; +} + +void ui_idle(void) { + const char *app_name = NULL; + const char *tagline = NULL; + + if (caller_app) { + app_name = caller_app->name; + + if (caller_app->type == CALLER_TYPE_PLUGIN) { + snprintf(staxSharedBuffer, sizeof(staxSharedBuffer), FORMAT_PLUGIN, app_name); + tagline = staxSharedBuffer; + } + } else { // Ethereum app + app_name = get_app_network_name(); + } + + nbgl_useCaseHome((char *) app_name, + get_app_icon(true), + tagline, + true, + ui_menu_settings, + app_quit); } diff --git a/src_nbgl/ui_nbgl.h b/src_nbgl/ui_nbgl.h index 66ffd4f..d7db175 100644 --- a/src_nbgl/ui_nbgl.h +++ b/src_nbgl/ui_nbgl.h @@ -6,14 +6,16 @@ #include #define SHARED_BUFFER_SIZE SHARED_CTX_FIELD_1_SIZE -extern uint8_t staxSharedBuffer[SHARED_BUFFER_SIZE]; +extern char staxSharedBuffer[SHARED_BUFFER_SIZE]; extern nbgl_page_t* pageContext; void releaseContext(void); +const nbgl_icon_details_t* get_app_icon(bool caller_icon); + void ui_idle(void); void ui_menu_settings(void); void ui_menu_about(void); -#endif // _UI_NBGL_H_ \ No newline at end of file +#endif // _UI_NBGL_H_ diff --git a/src_nbgl/ui_sign_712.c b/src_nbgl/ui_sign_712.c index c13a78a..ab40a9e 100644 --- a/src_nbgl/ui_sign_712.c +++ b/src_nbgl/ui_sign_712.c @@ -25,7 +25,7 @@ static void reviewChoice(bool confirm) { } static bool displaySignPage(uint8_t page, nbgl_pageContent_t *content) { (void) page; - content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_chain_icon(); + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); content->infoLongPress.text = "Sign typed message"; content->infoLongPress.longPressText = "Hold to sign"; return true; diff --git a/src_nbgl/ui_sign_712_v0.c b/src_nbgl/ui_sign_712_v0.c index 34b529c..df9a547 100644 --- a/src_nbgl/ui_sign_712_v0.c +++ b/src_nbgl/ui_sign_712_v0.c @@ -39,7 +39,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { content->tagValueList.nbPairs = 2; content->tagValueList.pairs = (nbgl_layoutTagValue_t *) tlv; } else if (page == 1) { - content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_chain_icon(); + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); content->infoLongPress.text = "Sign typed message"; content->infoLongPress.longPressText = "Hold to sign"; } else { diff --git a/src_nbgl/ui_stark_limit_order.c b/src_nbgl/ui_stark_limit_order.c index 20277be..1270706 100644 --- a/src_nbgl/ui_stark_limit_order.c +++ b/src_nbgl/ui_stark_limit_order.c @@ -37,7 +37,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { content->tagValueList.nbPairs = 3; content->tagValueList.pairs = (nbgl_layoutTagValue_t *) tlv; } else if (page == 1) { - content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_chain_icon(); + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(false); content->infoLongPress.text = "Review stark limit order"; content->infoLongPress.longPressText = "Hold to sign"; } else { @@ -52,7 +52,7 @@ static void reviewContinue(void) { } static void buildFirstPage(void) { - nbgl_useCaseReviewStart(get_app_chain_icon(), + nbgl_useCaseReviewStart(get_app_icon(false), "Review stark limit order", NULL, "Reject", @@ -64,4 +64,4 @@ void ui_stark_limit_order(void) { buildFirstPage(); } -#endif \ No newline at end of file +#endif diff --git a/src_nbgl/ui_stark_transfer.c b/src_nbgl/ui_stark_transfer.c index 3532c17..463b835 100644 --- a/src_nbgl/ui_stark_transfer.c +++ b/src_nbgl/ui_stark_transfer.c @@ -82,7 +82,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { } } if (page == 2) { - content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_chain_icon(); + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(false); content->infoLongPress.text = "Review transaction"; content->infoLongPress.longPressText = "Hold to sign"; } @@ -116,7 +116,7 @@ void ui_stark_transfer(bool selfTransfer, bool conditional) { subTitle = "Transfer"; } } - nbgl_useCaseReviewStart(get_app_chain_icon(), + nbgl_useCaseReviewStart(get_app_icon(false), "Review stark transaction", subTitle, "Reject", diff --git a/src_nbgl/ui_stark_unsafe_sign.c b/src_nbgl/ui_stark_unsafe_sign.c index 59a6eac..05bf256 100644 --- a/src_nbgl/ui_stark_unsafe_sign.c +++ b/src_nbgl/ui_stark_unsafe_sign.c @@ -40,7 +40,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { content->tagValueList.nbPairs = 2; content->tagValueList.pairs = (nbgl_layoutTagValue_t *) tlv; } else if (page == 1) { - content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_chain_icon(); + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(false); content->infoLongPress.text = "Unsafe Stark Sign"; content->infoLongPress.longPressText = "Hold to sign"; } else { @@ -55,7 +55,7 @@ static void reviewContinue(void) { } static void buildFirstPage(void) { - nbgl_useCaseReviewStart(get_app_chain_icon(), + nbgl_useCaseReviewStart(get_app_icon(false), "Unsafe Stark Sign", NULL, "Reject", @@ -67,4 +67,4 @@ void ui_stark_unsafe_sign(void) { buildFirstPage(); } -#endif // HAVE_STARKWARE \ No newline at end of file +#endif // HAVE_STARKWARE diff --git a/tools/build_sdk.py b/tools/build_sdk.py index a808e4a..552bb25 100755 --- a/tools/build_sdk.py +++ b/tools/build_sdk.py @@ -82,10 +82,13 @@ def extract_from_c_files(sources, nodes_to_extract): def merge_headers(sources, nodes_to_extract): includes = [ + '#include ', + '#include ', '#include "os.h"', '#include "cx.h"', - '#include ', - '#include ' + '#ifdef HAVE_NBGL', + '#include "nbgl_types.h"', + '#endif' ] body = extract_from_headers(sources, nodes_to_extract) @@ -156,11 +159,12 @@ if __name__ == "__main__": "src/shared_context.h", "src/eth_plugin_internal.h", "src/nft.h", + "src/swap_lib_calls.h" ] nodes_to_extract = { "#define": ["MAX_TICKER_LEN", "ADDRESS_LENGTH", "INT256_LENGTH", "WEI_TO_ETHER", "SELECTOR_SIZE", "PARAMETER_LENGTH", "RUN_APPLICATION", "COLLECTION_NAME_MAX_LEN"], "typedef enum": [], - "typedef struct": ["tokenDefinition_t", "txInt256_t", "txContent_t", "nftInfo_t"], + "typedef struct": ["tokenDefinition_t", "txInt256_t", "txContent_t", "nftInfo_t", "caller_app_t"], "typedef union": ["extraInfo_t"], "__attribute__((no_instrument_function)) inline": ["int allzeroes"], "const": ["HEXDIGITS"], From 6326a4a9f205a35d41c4ff7ad40f940fb3a94014 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 14 Mar 2023 18:47:50 +0100 Subject: [PATCH 17/85] EIP-191 fixes Skip button did not work --- src_nbgl/ui_sign_message.c | 130 ++++++++++++++++++++++--------------- 1 file changed, 76 insertions(+), 54 deletions(-) diff --git a/src_nbgl/ui_sign_message.c b/src_nbgl/ui_sign_message.c index 7bcf541..587bb68 100644 --- a/src_nbgl/ui_sign_message.c +++ b/src_nbgl/ui_sign_message.c @@ -17,6 +17,7 @@ typedef enum { static e_ui_nbgl_191_state state; static e_ui_nbgl_191_state state_before_reject_cancel; +static bool skip_message; static nbgl_layoutTagValue_t pair; @@ -28,72 +29,89 @@ static void reject_message(void) { io_seproxyhal_touch_signMessage_cancel(); } -static void sign_message() { +static void sign_message(void) { io_seproxyhal_touch_signMessage_ok(); } -static bool nav_callback(uint8_t page, nbgl_pageContent_t *content) { - UNUSED(page); +static bool display_message(nbgl_pageContent_t *content) { + uint16_t len = 0; + bool reached; - if ((state != UI_191_NBGL_GO_TO_SIGN) && (state != UI_191_NBGL_SIGN_DISPLAYED)) { - if (state != UI_191_NBGL_BACK_FROM_REJECT_CANCEL) { - memset(staxSharedBuffer + eip191MessageIdx, 0, SHARED_BUFFER_SIZE - eip191MessageIdx); - memcpy( - staxSharedBuffer + eip191MessageIdx, + if (state != UI_191_NBGL_BACK_FROM_REJECT_CANCEL) { + strncpy(staxSharedBuffer + eip191MessageIdx, strings.tmp.tmp + stringsTmpTmpIdx, - MIN(SHARED_BUFFER_SIZE - eip191MessageIdx, SHARED_BUFFER_SIZE - stringsTmpTmpIdx)); - uint16_t len = 0; - bool reached = nbgl_getTextMaxLenInNbLines(BAGL_FONT_INTER_REGULAR_32px, - staxSharedBuffer, - SCREEN_WIDTH - (2 * BORDER_MARGIN), - 9, - &len); + SHARED_BUFFER_SIZE - eip191MessageIdx); + reached = nbgl_getTextMaxLenInNbLines(BAGL_FONT_INTER_REGULAR_32px, + (char *) staxSharedBuffer, + SCREEN_WIDTH - (2 * BORDER_MARGIN), + 9, + &len); - stringsTmpTmpIdx = len - eip191MessageIdx; - eip191MessageIdx = len; - staxSharedBuffer[eip191MessageIdx] = '\0'; + stringsTmpTmpIdx = len - eip191MessageIdx; + eip191MessageIdx = len; + staxSharedBuffer[eip191MessageIdx] = '\0'; - if (!reached && eip191MessageIdx < SHARED_BUFFER_SIZE) { - stringsTmpTmpIdx = 0; - question_switcher(); - - if (state != UI_191_NBGL_GO_TO_SIGN) { - return false; - } - } else if (reached || eip191MessageIdx == SHARED_BUFFER_SIZE) { - eip191MessageIdx = 0; - } - } - - pair.value = staxSharedBuffer; - pair.item = "Message"; - content->type = TAG_VALUE_LIST; - content->tagValueList.nbPairs = 1; - content->tagValueList.pairs = &pair; - content->tagValueList.smallCaseForValue = false; - content->tagValueList.nbMaxLinesForValue = 9; - content->tagValueList.wrapping = false; - - if (state == UI_191_NBGL_BACK_FROM_REJECT_CANCEL) { - // We come back from Reject screen. - // The previously displayed content must be redisplayed. - // Do not call question_switcher() to avoid replacing - // string.tmp.tmp content. - state = state_before_reject_cancel; - } else if (stringsTmpTmpIdx >= strlen(strings.tmp.tmp)) { - // Fetch the next content to display into strings.tmp.tmp buffer. + if (!reached && eip191MessageIdx < SHARED_BUFFER_SIZE) { stringsTmpTmpIdx = 0; question_switcher(); - return true; + + if (state != UI_191_NBGL_GO_TO_SIGN) { + return false; + } + } else if (reached || eip191MessageIdx == SHARED_BUFFER_SIZE) { + eip191MessageIdx = 0; + } + } + + pair.value = staxSharedBuffer; + pair.item = "Message"; + content->type = TAG_VALUE_LIST; + content->tagValueList.nbPairs = 1; + content->tagValueList.pairs = &pair; + content->tagValueList.smallCaseForValue = false; + content->tagValueList.nbMaxLinesForValue = 9; + content->tagValueList.wrapping = false; + + if (state == UI_191_NBGL_BACK_FROM_REJECT_CANCEL) { + // We come back from Reject screen. + // The previously displayed content must be redisplayed. + // Do not call question_switcher() to avoid replacing + // string.tmp.tmp content. + state = state_before_reject_cancel; + } else if (stringsTmpTmpIdx >= strlen(strings.tmp.tmp)) { + // Fetch the next content to display into strings.tmp.tmp buffer. + stringsTmpTmpIdx = 0; + question_switcher(); + } + return true; +} + +static void display_sign(nbgl_pageContent_t *content) { + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = &C_Message_64px; + content->infoLongPress.text = "Sign Message?"; + content->infoLongPress.longPressText = "Hold to sign"; + state = UI_191_NBGL_SIGN_DISPLAYED; +} + +static bool nav_callback(uint8_t page, nbgl_pageContent_t *content) { + bool ret = true; + + if (page == LAST_PAGE_FOR_REVIEW) { // was skipped + skip_message = true; + skip_rest_of_message(); + } + if ((state != UI_191_NBGL_GO_TO_SIGN) && (state != UI_191_NBGL_SIGN_DISPLAYED)) { + if (skip_message) { + // do not refresh when this callback triggers after user validation + ret = false; + } else { + ret = display_message(content); } } else { // the last page must contain a long press button - content->type = INFO_LONG_PRESS, content->infoLongPress.icon = &C_Message_64px; - content->infoLongPress.text = "Sign Message?"; - content->infoLongPress.longPressText = "Hold to sign"; - state = UI_191_NBGL_SIGN_DISPLAYED; + display_sign(content); } - return true; + return ret; } static void choice_callback(bool confirm) { @@ -135,6 +153,7 @@ static void confirm_transaction_rejection() { void ui_191_start(void) { state = UI_191_NBGL_START_REVIEW_DISPLAYED; + skip_message = false; eip191MessageIdx = 0; stringsTmpTmpIdx = 0; @@ -157,10 +176,13 @@ void ui_191_switch_to_sign(void) { // Next nav_callback callback must display // the hold to approve screen state = UI_191_NBGL_GO_TO_SIGN; + if (skip_message) { + continue_review(); // to force screen refresh + } } void ui_191_switch_to_question(void) { // No question mechanism on Stax: // Always display the next message chunk. continue_displaying_message(); -} \ No newline at end of file +} From 8881471a8e567cf1d76182826d757965c9a48278 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 16 Mar 2023 18:16:35 +0100 Subject: [PATCH 18/85] EIP-712 fixes - Now displays a Review page before showing the fields - Now asks for confirmation before rejecting - Now does not refresh the screen twice after a signature approval/rejection - Both EIP-712 implementations on par UX-wise - Fixed v0 approve/reject status word mismatch - Unified NBGL UI of both implementations --- src_features/signMessageEIP712/context_712.c | 1 - src_nbgl/ui_712_common.c | 48 +++++++++ src_nbgl/ui_712_common.h | 13 +++ src_nbgl/ui_sign_712.c | 108 +++++++++---------- src_nbgl/ui_sign_712_v0.c | 53 ++++----- 5 files changed, 134 insertions(+), 89 deletions(-) create mode 100644 src_nbgl/ui_712_common.c create mode 100644 src_nbgl/ui_712_common.h diff --git a/src_features/signMessageEIP712/context_712.c b/src_features/signMessageEIP712/context_712.c index 82abd09..57d5be6 100644 --- a/src_features/signMessageEIP712/context_712.c +++ b/src_features/signMessageEIP712/context_712.c @@ -72,7 +72,6 @@ void eip712_context_deinit(void) { mem_reset(); eip712_context = NULL; reset_app_context(); - ui_idle(); } #endif diff --git a/src_nbgl/ui_712_common.c b/src_nbgl/ui_712_common.c new file mode 100644 index 0000000..a1b13e3 --- /dev/null +++ b/src_nbgl/ui_712_common.c @@ -0,0 +1,48 @@ +#include "ui_nbgl.h" +#include "ui_712_common.h" +#include "common_712.h" + +static void (*g_resume_func)(void) = NULL; + +void nbgl_712_review_approve(void) { + ui_712_approve_cb(NULL); +} + +void nbgl_712_review_reject(void) { + ui_712_reject_cb(NULL); +} + +void nbgl_712_confirm_rejection_cb(bool confirm) { + if (confirm) { + nbgl_useCaseStatus("Message signing\ncancelled", false, nbgl_712_review_reject); + } else { + (*g_resume_func)(); + } +} + +void nbgl_712_confirm_rejection(void) { + nbgl_useCaseChoice(&C_warning64px, + "Reject message?", + NULL, + "Yes, reject", + "Go back to message", + nbgl_712_confirm_rejection_cb); +} + +void nbgl_712_review_choice(bool confirm) { + if (confirm) { + nbgl_useCaseStatus("MESSAGE\nSIGNED", true, nbgl_712_review_approve); + } else { + nbgl_712_confirm_rejection(); + } +} + +void nbgl_712_start(void (*resume_func)(void), const char *title) { + g_resume_func = resume_func; + nbgl_useCaseReviewStart(&C_Message_64px, + title, + NULL, + "Reject", + resume_func, + nbgl_712_confirm_rejection); +} diff --git a/src_nbgl/ui_712_common.h b/src_nbgl/ui_712_common.h new file mode 100644 index 0000000..ab8bd4f --- /dev/null +++ b/src_nbgl/ui_712_common.h @@ -0,0 +1,13 @@ +#ifndef UI_712_COMMON_H_ +#define UI_712_COMMON_H_ + +#include + +void nbgl_712_approve(void); +void nbgl_712_reject(void); +void nbgl_712_confirm_rejection_cb(bool confirm); +void nbgl_712_confirm_rejection(void); +void nbgl_712_review_choice(bool confirm); +void nbgl_712_start(void (*resume_func)(void), const char *title); + +#endif // UI_712_COMMON_H_ diff --git a/src_nbgl/ui_sign_712.c b/src_nbgl/ui_sign_712.c index ab40a9e..094fdb6 100644 --- a/src_nbgl/ui_sign_712.c +++ b/src_nbgl/ui_sign_712.c @@ -1,29 +1,16 @@ +#ifdef HAVE_EIP712_FULL_SUPPORT + #include "common_ui.h" #include "ui_nbgl.h" #include "ui_logic.h" #include "common_712.h" #include "nbgl_use_case.h" #include "network.h" +#include "ui_712_common.h" -// 4 pairs of tag/value to display -static nbgl_layoutTagValue_t tlv; +static nbgl_layoutTagValue_t pair; -static void reject_message(void) { - ui_712_reject(NULL); -} - -static void sign_message() { - ui_712_approve(NULL); -} - -static void reviewChoice(bool confirm) { - if (confirm) { - sign_message(); - } else { - reject_message(); - } -} -static bool displaySignPage(uint8_t page, nbgl_pageContent_t *content) { +static bool display_sign_page(uint8_t page, nbgl_pageContent_t *content) { (void) page; content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); content->infoLongPress.text = "Sign typed message"; @@ -31,50 +18,63 @@ static bool displaySignPage(uint8_t page, nbgl_pageContent_t *content) { return true; } -static uint32_t stringsIdx = 0; +static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { + bool ret; + uint16_t len; -static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { - uint16_t len = 0; - if (stringsIdx < strlen(strings.tmp.tmp)) { - bool reached = nbgl_getTextMaxLenInNbLines(BAGL_FONT_INTER_REGULAR_32px, - strings.tmp.tmp + stringsIdx, - SCREEN_WIDTH - (2 * BORDER_MARGIN), - 9, - &len); - memset(staxSharedBuffer, 0, sizeof(staxSharedBuffer)); - memcpy(staxSharedBuffer, strings.tmp.tmp + stringsIdx, len); - stringsIdx += len; - tlv.item = strings.tmp.tmp2; - tlv.value = staxSharedBuffer; - content->type = TAG_VALUE_LIST; - content->tagValueList.nbPairs = 1; - content->tagValueList.pairs = &tlv; - return true; - } else { - stringsIdx = 0; - switch (ui_712_next_field()) { - case EIP712_NO_MORE_FIELD: - return displaySignPage(page, content); - break; - case EIP712_FIELD_INCOMING: - case EIP712_FIELD_LATER: - default: - break; - } - return false; + switch (page) { + case 0: + // limit the value to one page + nbgl_getTextMaxLenInNbLines(BAGL_FONT_INTER_REGULAR_32px, + strings.tmp.tmp, + SCREEN_WIDTH - (2 * BORDER_MARGIN), + 9, + &len); + strings.tmp.tmp[len] = '\0'; + + pair.item = strings.tmp.tmp2; + pair.value = strings.tmp.tmp; + content->type = TAG_VALUE_LIST; + content->tagValueList.nbPairs = 1; + content->tagValueList.pairs = &pair; + content->tagValueList.wrapping = false; + content->tagValueList.nbMaxLinesForValue = 0; + ret = true; + break; + + case 1: + switch (ui_712_next_field()) { + case EIP712_NO_MORE_FIELD: + return display_sign_page(page, content); + break; + case EIP712_FIELD_INCOMING: + case EIP712_FIELD_LATER: + default: + break; + } + __attribute__((fallthrough)); + + default: + ret = false; + break; } + return ret; } -void ui_712_switch_to_sign(void) { - nbgl_useCaseRegularReview(0, 0, "Reject", NULL, displaySignPage, reviewChoice); +static void handle_display(nbgl_navCallback_t cb) { + nbgl_useCaseRegularReview(0, 0, "Reject", NULL, cb, nbgl_712_review_choice); } void ui_712_start(void) { - stringsIdx = 0; - nbgl_useCaseRegularReview(0, 0, "Reject", NULL, displayTransactionPage, reviewChoice); + nbgl_712_start(&ui_712_switch_to_message, "Review typed message"); } void ui_712_switch_to_message(void) { - stringsIdx = 0; - nbgl_useCaseRegularReview(0, 0, "Reject", NULL, displayTransactionPage, reviewChoice); + handle_display(display_review_page); } + +void ui_712_switch_to_sign(void) { + handle_display(display_sign_page); +} + +#endif // HAVE_EIP712_FULL_SUPPORT diff --git a/src_nbgl/ui_sign_712_v0.c b/src_nbgl/ui_sign_712_v0.c index df9a547..feca3bf 100644 --- a/src_nbgl/ui_sign_712_v0.c +++ b/src_nbgl/ui_sign_712_v0.c @@ -2,41 +2,34 @@ #include "ui_nbgl.h" #include "common_712.h" #include "network.h" +#include "ethUtils.h" +#include "ui_712_common.h" static nbgl_layoutTagValue_t tlv[2]; -static char domain_hash[70]; -static char message_hash[70]; +static void start_review(void); // forward declaration -static void reviewReject(void) { - ui_712_approve_cb(NULL); +static char *format_hash(const uint8_t *hash, char *buffer, size_t buffer_size, size_t offset) { + snprintf(buffer + offset, buffer_size - offset, "0x%.*H", KECCAK256_HASH_BYTESIZE, hash); + return buffer + offset; } -static void confirmTransation(void) { - ui_712_reject_cb(NULL); -} - -static void reviewChoice(bool confirm) { - if (confirm) { - // display a status page and go back to main - nbgl_useCaseStatus("MESSAGE\nSIGNED", true, confirmTransation); - } else { - nbgl_useCaseStatus("Message signing\ncancelled", false, reviewReject); - } -} - -static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { - snprintf(domain_hash, 70, "0x%.*H", 32, tmpCtx.messageSigningContext712.domainHash); - snprintf(message_hash, 70, "0x%.*H", 32, tmpCtx.messageSigningContext712.messageHash); - +static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { if (page == 0) { tlv[0].item = "Domain hash"; - tlv[0].value = domain_hash; + tlv[0].value = format_hash(tmpCtx.messageSigningContext712.domainHash, + strings.tmp.tmp, + sizeof(strings.tmp.tmp), + 0); tlv[1].item = "Message hash"; - tlv[1].value = message_hash; + tlv[1].value = format_hash(tmpCtx.messageSigningContext712.messageHash, + strings.tmp.tmp, + sizeof(strings.tmp.tmp), + 70); content->type = TAG_VALUE_LIST; content->tagValueList.nbPairs = 2; + content->tagValueList.nbMaxLinesForValue = 0; content->tagValueList.pairs = (nbgl_layoutTagValue_t *) tlv; } else if (page == 1) { content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); @@ -48,19 +41,11 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { // valid page so return true return true; } -static void reviewContinue(void) { - nbgl_useCaseRegularReview(0, 2, "Reject", NULL, displayTransactionPage, reviewChoice); -} -static void buildFirstPage(void) { - nbgl_useCaseReviewStart(get_app_chain_icon(), - "Sign typed message", - NULL, - "Reject", - reviewContinue, - reviewReject); +static void start_review(void) { + nbgl_useCaseRegularReview(0, 2, "Reject", NULL, display_review_page, nbgl_712_review_choice); } void ui_sign_712_v0(void) { - buildFirstPage(); + nbgl_712_start(&start_review, "Sign typed message"); } From 3810cbd852f301a511eb08e3d253b00dcd413295 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 21 Mar 2023 11:55:51 +0100 Subject: [PATCH 19/85] Fix Makefile configuration - Removed DEBUG enabled by default - Removed optimization & debug levels and use ones from SDK - Disable PRINTF formatting warnings again (for the custom %.*H format) --- Makefile | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 025a00d..2ed9286 100644 --- a/Makefile +++ b/Makefile @@ -186,7 +186,6 @@ endif endif # Enabling debug PRINTF -DEBUG:=1 ifneq ($(DEBUG),0) DEFINES += HAVE_STACK_OVERFLOW_CHECK ifeq ($(TARGET_NAME),TARGET_NANOS) @@ -223,13 +222,11 @@ endif CC := $(CLANGPATH)clang -CFLAGS += -Og -g -# CFLAGS += -Oz -Wno-format-invalid-specifier -Wno-format-extra-args +CFLAGS += -Wno-format-invalid-specifier -Wno-format-extra-args AS := $(GCCPATH)arm-none-eabi-gcc LD := $(GCCPATH)arm-none-eabi-gcc -LDFLAGS += -O0 LDLIBS += -lm -lgcc -lc # import rules to compile glyphs(/pone) From 4cce06ca2cc76a1e75116ed8ff78b3166f33e6e2 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 4 Apr 2023 17:12:58 +0200 Subject: [PATCH 20/85] Fix compilation warnings --- src/main.c | 2 +- src_nbgl/ui_display_privacy.c | 4 ++-- src_nbgl/ui_stark_transfer.c | 8 ++++---- src_plugins/eth2/eth2_plugin.c | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main.c b/src/main.c index 36dbdf6..08113ae 100644 --- a/src/main.c +++ b/src/main.c @@ -905,7 +905,7 @@ unsigned char io_event(__attribute__((unused)) unsigned char channel) { SEPROXYHAL_TAG_STATUS_EVENT_FLAG_USB_POWERED)) { THROW(EXCEPTION_IO_RESET); } - // no break is intentional + __attribute__((fallthrough)); default: UX_DEFAULT_EVENT(); break; diff --git a/src_nbgl/ui_display_privacy.c b/src_nbgl/ui_display_privacy.c index d2b2841..3e52d5f 100644 --- a/src_nbgl/ui_display_privacy.c +++ b/src_nbgl/ui_display_privacy.c @@ -58,11 +58,11 @@ static void buildFirstPage(void) { } void ui_display_privacy_public_key(void) { - review_string = "Provide public\nprivacy key"; + review_string = (char *) "Provide public\nprivacy key"; buildFirstPage(); } void ui_display_privacy_shared_secret(void) { - review_string = "Provide public\nsecret key"; + review_string = (char *) "Provide public\nsecret key"; buildFirstPage(); } diff --git a/src_nbgl/ui_stark_transfer.c b/src_nbgl/ui_stark_transfer.c index 463b835..99726f3 100644 --- a/src_nbgl/ui_stark_transfer.c +++ b/src_nbgl/ui_stark_transfer.c @@ -105,15 +105,15 @@ void ui_stark_transfer(bool selfTransfer, bool conditional) { char *subTitle; if (conditional) { if (selfTransfer) { - subTitle = "Conditionnal self transfer"; + subTitle = (char *) "Conditionnal self transfer"; } else { - subTitle = "Conditionnal transfer"; + subTitle = (char *) "Conditionnal transfer"; } } else { if (selfTransfer) { - subTitle = "self transfer"; + subTitle = (char *) "self transfer"; } else { - subTitle = "Transfer"; + subTitle = (char *) "Transfer"; } } nbgl_useCaseReviewStart(get_app_icon(false), diff --git a/src_plugins/eth2/eth2_plugin.c b/src_plugins/eth2/eth2_plugin.c index 29ea299..c93c82e 100644 --- a/src_plugins/eth2/eth2_plugin.c +++ b/src_plugins/eth2/eth2_plugin.c @@ -212,7 +212,7 @@ void eth2_plugin_call(int message, void *parameters) { strlcpy(msg->title, "Validator", msg->titleLength); strlcpy(msg->msg, context->deposit_address, msg->msgLength); msg->result = ETH_PLUGIN_RESULT_OK; - } + } break; default: break; } From cb7334ceede9e1f098cc9d6bb03ea46cdde5e8f5 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 4 Apr 2023 17:50:40 +0200 Subject: [PATCH 21/85] Fix settings word split --- src_nbgl/ui_settings.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src_nbgl/ui_settings.c b/src_nbgl/ui_settings.c index 482d220..4ca3f3e 100644 --- a/src_nbgl/ui_settings.c +++ b/src_nbgl/ui_settings.c @@ -15,13 +15,13 @@ static bool navCallback(uint8_t page, nbgl_pageContent_t* content) { switches[0] = (nbgl_layoutSwitch_t){.initState = N_storage.dataAllowed ? ON_STATE : OFF_STATE, .text = "Blind signing", - .subText = "Enable transaction blind signing", + .subText = "Enable transaction blind\nsigning", .token = BLIND_SIGNING_TOKEN, .tuneId = TUNE_TAP_CASUAL}; switches[1] = (nbgl_layoutSwitch_t){.initState = N_storage.contractDetails ? ON_STATE : OFF_STATE, .text = "Debug", - .subText = "Display contract data details", + .subText = "Display contract data\ndetails", .token = DEBUG_TOKEN, .tuneId = TUNE_TAP_CASUAL}; switches[2] = From e0bb1225fe67fc2bc8b2e22b3b21692eb40a8f2d Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Fri, 7 Apr 2023 11:29:27 +0200 Subject: [PATCH 22/85] Unified nbgl layoutTagValue variable naming --- src_nbgl/ui_approve_tx.c | 36 ++++++++++++++++----------------- src_nbgl/ui_display_privacy.c | 12 +++++------ src_nbgl/ui_settings.c | 2 +- src_nbgl/ui_sign_712_v0.c | 24 +++++++++++----------- src_nbgl/ui_stark_limit_order.c | 16 +++++++-------- src_nbgl/ui_stark_transfer.c | 30 +++++++++++++-------------- src_nbgl/ui_stark_unsafe_sign.c | 12 +++++------ 7 files changed, 66 insertions(+), 66 deletions(-) diff --git a/src_nbgl/ui_approve_tx.c b/src_nbgl/ui_approve_tx.c index eb872ac..78c9d81 100644 --- a/src_nbgl/ui_approve_tx.c +++ b/src_nbgl/ui_approve_tx.c @@ -15,7 +15,7 @@ enum { START_REVIEW_TOKEN, }; -static nbgl_layoutTagValue_t tlv; +static nbgl_layoutTagValue_t pair; // these buffers are used as circular static char title_buffer[MAX_PLUGIN_ITEMS_PER_SCREEN][TAG_MAX_LEN]; static char msg_buffer[MAX_PLUGIN_ITEMS_PER_SCREEN][VALUE_MAX_LEN]; @@ -74,17 +74,17 @@ static nbgl_layoutTagValue_t *getTagValuePair(uint8_t pairIndex) { TAG_MAX_LEN, (uint8_t *) msg_buffer[counter], VALUE_MAX_LEN); - tlv.item = title_buffer[counter]; - tlv.value = msg_buffer[counter]; + pair.item = title_buffer[counter]; + pair.value = msg_buffer[counter]; } else { pairIndex -= dataContext.tokenContext.pluginUiMaxItems; // for the last 1 (or 2), tags are fixed if (tx_approval_context.displayNetwork && (pairIndex == 0)) { - tlv.item = "Network"; - tlv.value = strings.common.network_name; + pair.item = "Network"; + pair.value = strings.common.network_name; } else { - tlv.item = "Max fees"; - tlv.value = strings.common.maxFee; + pair.item = "Max fees"; + pair.value = strings.common.maxFee; } } } else { @@ -95,24 +95,24 @@ static nbgl_layoutTagValue_t *getTagValuePair(uint8_t pairIndex) { switch (pairIndex) { case 0: - tlv.item = "Amount"; - tlv.value = strings.common.fullAmount; + pair.item = "Amount"; + pair.value = strings.common.fullAmount; break; case 1: - tlv.item = "Address"; - tlv.value = strings.common.fullAddress; + pair.item = "Address"; + pair.value = strings.common.fullAddress; break; case 2: - tlv.item = "Nonce"; - tlv.value = strings.common.nonce; + pair.item = "Nonce"; + pair.value = strings.common.nonce; break; case 3: - tlv.item = "Max fees"; - tlv.value = strings.common.maxFee; + pair.item = "Max fees"; + pair.value = strings.common.maxFee; break; case 4: - tlv.item = "Network"; - tlv.value = strings.common.network_name; + pair.item = "Network"; + pair.value = strings.common.network_name; break; } } @@ -121,7 +121,7 @@ static nbgl_layoutTagValue_t *getTagValuePair(uint8_t pairIndex) { if (counter == MAX_PLUGIN_ITEMS_PER_SCREEN) { counter = 0; } - return &tlv; + return &pair; } static void pageCallback(int token, uint8_t index) { diff --git a/src_nbgl/ui_display_privacy.c b/src_nbgl/ui_display_privacy.c index 3e52d5f..fb014ba 100644 --- a/src_nbgl/ui_display_privacy.c +++ b/src_nbgl/ui_display_privacy.c @@ -4,7 +4,7 @@ #include "nbgl_use_case.h" #include "network.h" -static nbgl_layoutTagValue_t tlv[2]; +static nbgl_layoutTagValue_t pairs[2]; static char *review_string; static void reviewReject(void) { @@ -25,14 +25,14 @@ static void reviewChoice(bool confirm) { static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { if (page == 0) { - tlv[0].item = "Address"; - tlv[0].value = strings.common.fullAddress; - tlv[1].item = "Key"; - tlv[1].value = strings.common.fullAmount; + pairs[0].item = "Address"; + pairs[0].value = strings.common.fullAddress; + pairs[1].item = "Key"; + pairs[1].value = strings.common.fullAmount; content->type = TAG_VALUE_LIST; content->tagValueList.nbPairs = 2; - content->tagValueList.pairs = (nbgl_layoutTagValue_t *) tlv; + content->tagValueList.pairs = (nbgl_layoutTagValue_t *) pairs; } else if (page == 1) { content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); content->infoLongPress.text = review_string; diff --git a/src_nbgl/ui_settings.c b/src_nbgl/ui_settings.c index 4ca3f3e..b55d323 100644 --- a/src_nbgl/ui_settings.c +++ b/src_nbgl/ui_settings.c @@ -7,7 +7,7 @@ static const char* const infoContents[] = {APPVERSION, "(c) 2022 Ledger"}; enum { BLIND_SIGNING_TOKEN = FIRST_USER_TOKEN, DEBUG_TOKEN, NONCE_TOKEN, EIP712_VERBOSE_TOKEN }; -static nbgl_layoutSwitch_t switches[4]; +static nbgl_layoutSwitch_t switches[3]; static bool navCallback(uint8_t page, nbgl_pageContent_t* content) { switch (page) { diff --git a/src_nbgl/ui_sign_712_v0.c b/src_nbgl/ui_sign_712_v0.c index feca3bf..e5dc92e 100644 --- a/src_nbgl/ui_sign_712_v0.c +++ b/src_nbgl/ui_sign_712_v0.c @@ -5,7 +5,7 @@ #include "ethUtils.h" #include "ui_712_common.h" -static nbgl_layoutTagValue_t tlv[2]; +static nbgl_layoutTagValue_t pairs[2]; static void start_review(void); // forward declaration @@ -16,21 +16,21 @@ static char *format_hash(const uint8_t *hash, char *buffer, size_t buffer_size, static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { if (page == 0) { - tlv[0].item = "Domain hash"; - tlv[0].value = format_hash(tmpCtx.messageSigningContext712.domainHash, - strings.tmp.tmp, - sizeof(strings.tmp.tmp), - 0); - tlv[1].item = "Message hash"; - tlv[1].value = format_hash(tmpCtx.messageSigningContext712.messageHash, - strings.tmp.tmp, - sizeof(strings.tmp.tmp), - 70); + pairs[0].item = "Domain hash"; + pairs[0].value = format_hash(tmpCtx.messageSigningContext712.domainHash, + strings.tmp.tmp, + sizeof(strings.tmp.tmp), + 0); + pairs[1].item = "Message hash"; + pairs[1].value = format_hash(tmpCtx.messageSigningContext712.messageHash, + strings.tmp.tmp, + sizeof(strings.tmp.tmp), + 70); content->type = TAG_VALUE_LIST; content->tagValueList.nbPairs = 2; content->tagValueList.nbMaxLinesForValue = 0; - content->tagValueList.pairs = (nbgl_layoutTagValue_t *) tlv; + content->tagValueList.pairs = (nbgl_layoutTagValue_t *) pairs; } else if (page == 1) { content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); content->infoLongPress.text = "Sign typed message"; diff --git a/src_nbgl/ui_stark_limit_order.c b/src_nbgl/ui_stark_limit_order.c index 1270706..4c164c5 100644 --- a/src_nbgl/ui_stark_limit_order.c +++ b/src_nbgl/ui_stark_limit_order.c @@ -6,7 +6,7 @@ #ifdef HAVE_STARKWARE -static nbgl_layoutTagValue_t tlv[3]; +static nbgl_layoutTagValue_t pairs[3]; static void reviewReject(void) { io_seproxyhal_touch_tx_cancel(NULL); @@ -26,16 +26,16 @@ static void reviewChoice(bool confirm) { static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { if (page == 0) { - tlv[0].item = "Sell"; - tlv[0].value = strings.common.fullAmount; - tlv[1].item = "Buy"; - tlv[1].value = strings.common.maxFee; - tlv[2].item = "Token amount"; - tlv[2].value = strings.common.fullAddress; + pairs[0].item = "Sell"; + pairs[0].value = strings.common.fullAmount; + pairs[1].item = "Buy"; + pairs[1].value = strings.common.maxFee; + pairs[2].item = "Token amount"; + pairs[2].value = strings.common.fullAddress; content->type = TAG_VALUE_LIST; content->tagValueList.nbPairs = 3; - content->tagValueList.pairs = (nbgl_layoutTagValue_t *) tlv; + content->tagValueList.pairs = (nbgl_layoutTagValue_t *) pairs; } else if (page == 1) { content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(false); content->infoLongPress.text = "Review stark limit order"; diff --git a/src_nbgl/ui_stark_transfer.c b/src_nbgl/ui_stark_transfer.c index 99726f3..0b752eb 100644 --- a/src_nbgl/ui_stark_transfer.c +++ b/src_nbgl/ui_stark_transfer.c @@ -8,7 +8,7 @@ #ifdef HAVE_STARKWARE -static nbgl_layoutTagValue_t tlv[3]; +static nbgl_layoutTagValue_t pairs[3]; static char condAddressBuffer[43]; struct stark_transfer_context { bool selfTransfer; @@ -36,26 +36,26 @@ static void reviewChoice(bool confirm) { static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { uint8_t count = 0; if (page == 0) { - tlv[count].item = "Amount"; - tlv[count].value = tmpContent.tmp; + pairs[count].item = "Amount"; + pairs[count].value = tmpContent.tmp; count++; if (context.selfTransfer == false && context.conditional == false) { - tlv[count].item = "Master Account"; - tlv[count].value = strings.tmp.tmp; + pairs[count].item = "Master Account"; + pairs[count].value = strings.tmp.tmp; count++; } if (context.conditional) { stark_sign_display_master_account(); - tlv[count].item = "Master Account"; - tlv[count].value = strings.tmp.tmp; + pairs[count].item = "Master Account"; + pairs[count].value = strings.tmp.tmp; count++; } - tlv[count].item = "Token Account"; - tlv[count].value = strings.tmp.tmp2; + pairs[count].item = "Token Account"; + pairs[count].value = strings.tmp.tmp2; content->type = TAG_VALUE_LIST; content->tagValueList.nbPairs = count; - content->tagValueList.pairs = (nbgl_layoutTagValue_t *) tlv; + content->tagValueList.pairs = (nbgl_layoutTagValue_t *) pairs; return true; } @@ -66,16 +66,16 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { sizeof(condAddressBuffer), &global_sha3, chainConfig->chainId), - tlv[0].item = "Cond. Address"; - tlv[0].value = condAddressBuffer; + pairs[0].item = "Cond. Address"; + pairs[0].value = condAddressBuffer; stark_sign_display_condition_fact(); - tlv[1].item = "Cond. Address"; - tlv[1].value = strings.tmp.tmp; + pairs[1].item = "Cond. Address"; + pairs[1].value = strings.tmp.tmp; content->type = TAG_VALUE_LIST; content->tagValueList.nbPairs = 2; - content->tagValueList.pairs = (nbgl_layoutTagValue_t *) tlv; + content->tagValueList.pairs = (nbgl_layoutTagValue_t *) pairs; } else { page++; diff --git a/src_nbgl/ui_stark_unsafe_sign.c b/src_nbgl/ui_stark_unsafe_sign.c index 05bf256..70579bb 100644 --- a/src_nbgl/ui_stark_unsafe_sign.c +++ b/src_nbgl/ui_stark_unsafe_sign.c @@ -7,7 +7,7 @@ #ifdef HAVE_STARKWARE -static nbgl_layoutTagValue_t tlv[2]; +static nbgl_layoutTagValue_t pairs[2]; static char from_account[64]; static char message_hash[64]; @@ -32,13 +32,13 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { snprintf(message_hash, sizeof(message_hash), "0x%.*H", 32, dataContext.starkContext.w2); if (page == 0) { - tlv[0].item = "From Account"; - tlv[0].value = from_account; - tlv[1].item = "Hash"; - tlv[1].value = message_hash; + pairs[0].item = "From Account"; + pairs[0].value = from_account; + pairs[1].item = "Hash"; + pairs[1].value = message_hash; content->type = TAG_VALUE_LIST; content->tagValueList.nbPairs = 2; - content->tagValueList.pairs = (nbgl_layoutTagValue_t *) tlv; + content->tagValueList.pairs = (nbgl_layoutTagValue_t *) pairs; } else if (page == 1) { content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(false); content->infoLongPress.text = "Unsafe Stark Sign"; From 12fb8c6a3ae7721d9d610aa2f6bf334d8ee7b818 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Fri, 7 Apr 2023 11:30:40 +0200 Subject: [PATCH 23/85] Merged confirm_parameter & confirm_selector UI code --- ...eter.c => ui_confirm_parameter_selector.c} | 35 +++++++++--- src_nbgl/ui_confirm_selector.c | 56 ------------------- 2 files changed, 28 insertions(+), 63 deletions(-) rename src_nbgl/{ui_confirm_parameter.c => ui_confirm_parameter_selector.c} (50%) delete mode 100644 src_nbgl/ui_confirm_selector.c diff --git a/src_nbgl/ui_confirm_parameter.c b/src_nbgl/ui_confirm_parameter_selector.c similarity index 50% rename from src_nbgl/ui_confirm_parameter.c rename to src_nbgl/ui_confirm_parameter_selector.c index bebe5ae..43f93fc 100644 --- a/src_nbgl/ui_confirm_parameter.c +++ b/src_nbgl/ui_confirm_parameter_selector.c @@ -2,7 +2,10 @@ #include "ui_nbgl.h" #include "network.h" -static nbgl_layoutTagValue_t tlv; +typedef enum { PARAMETER_CONFIRMATION, SELECTOR_CONFIRMATION } e_confirmation_type; + +static nbgl_layoutTagValue_t pair; +static e_confirmation_type confirm_type; static void reviewReject(void) { io_seproxyhal_touch_data_cancel(NULL); @@ -22,14 +25,18 @@ static void reviewChoice(bool confirm) { static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { if (page == 0) { - tlv.item = "Parameter"; - tlv.value = strings.tmp.tmp; + pair.item = (confirm_type == PARAMETER_CONFIRMATION) ? "Parameter" : "Selector"; + pair.value = strings.tmp.tmp; content->type = TAG_VALUE_LIST; content->tagValueList.nbPairs = 1; - content->tagValueList.pairs = (nbgl_layoutTagValue_t *) &tlv; + content->tagValueList.pairs = (nbgl_layoutTagValue_t *) &pair; } else if (page == 1) { + snprintf(staxSharedBuffer, + sizeof(staxSharedBuffer), + "Confirm %s", + (confirm_type == PARAMETER_CONFIRMATION) ? "parameter" : "selector"); content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); - content->infoLongPress.text = "Confirm parameter"; + content->infoLongPress.text = staxSharedBuffer; content->infoLongPress.longPressText = "Hold to confirm"; } else { return false; @@ -39,12 +46,20 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { } static void reviewContinue(void) { - nbgl_useCaseRegularReview(0, 2, "Reject parameter", NULL, displayTransactionPage, reviewChoice); + snprintf(staxSharedBuffer, + sizeof(staxSharedBuffer), + "Reject %s", + (confirm_type == PARAMETER_CONFIRMATION) ? "parameter" : "selector"); + nbgl_useCaseRegularReview(0, 2, staxSharedBuffer, NULL, displayTransactionPage, reviewChoice); } static void buildScreen(void) { + snprintf(staxSharedBuffer, + sizeof(staxSharedBuffer), + "Verify %s", + (confirm_type == PARAMETER_CONFIRMATION) ? "parameter" : "selector"); nbgl_useCaseReviewStart(get_app_icon(true), - "Verify parameter", + staxSharedBuffer, NULL, "Reject", reviewContinue, @@ -52,5 +67,11 @@ static void buildScreen(void) { } void ui_confirm_parameter(void) { + confirm_type = PARAMETER_CONFIRMATION; + buildScreen(); +} + +void ui_confirm_selector(void) { + confirm_type = SELECTOR_CONFIRMATION; buildScreen(); } diff --git a/src_nbgl/ui_confirm_selector.c b/src_nbgl/ui_confirm_selector.c deleted file mode 100644 index c268d28..0000000 --- a/src_nbgl/ui_confirm_selector.c +++ /dev/null @@ -1,56 +0,0 @@ -#include "common_ui.h" -#include "ui_nbgl.h" -#include "network.h" - -static nbgl_layoutTagValue_t tlv; - -static void reviewReject(void) { - io_seproxyhal_touch_data_cancel(NULL); -} - -static void confirmTransation(void) { - io_seproxyhal_touch_data_ok(NULL); -} - -static void reviewChoice(bool confirm) { - if (confirm) { - confirmTransation(); - } else { - reviewReject(); - } -} - -static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { - if (page == 0) { - tlv.item = "Parameter"; - tlv.value = strings.tmp.tmp; - content->type = TAG_VALUE_LIST; - content->tagValueList.nbPairs = 1; - content->tagValueList.pairs = (nbgl_layoutTagValue_t *) &tlv; - } else if (page == 1) { - content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); - content->infoLongPress.text = "Confirm selector"; - content->infoLongPress.longPressText = "Hold to confirm"; - } else { - return false; - } - // valid page so return true - return true; -} - -static void reviewContinue(void) { - nbgl_useCaseRegularReview(0, 2, "Reject selector", NULL, displayTransactionPage, reviewChoice); -} - -static void buildScreen(void) { - nbgl_useCaseReviewStart(get_app_icon(true), - "Verify selector", - NULL, - "Reject", - reviewContinue, - reviewReject); -} - -void ui_confirm_selector(void) { - buildScreen(); -} From a5e1d2960d650e0f18e73298db3e16e8092a9466 Mon Sep 17 00:00:00 2001 From: abonnaudet-ledger Date: Wed, 26 Apr 2023 09:23:29 +0200 Subject: [PATCH 24/85] Fat: INTER_REGULAR_32 is now INTER_MEDIUM_32 Replace BAGL_FONT_INTER_REGULAR_32px by BAGL_FONT_INTER_MEDIUM_32px. This change is valid starting from API_LEVEL_9 --- src_nbgl/ui_sign_712.c | 2 +- src_nbgl/ui_sign_message.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src_nbgl/ui_sign_712.c b/src_nbgl/ui_sign_712.c index 094fdb6..bfe53fd 100644 --- a/src_nbgl/ui_sign_712.c +++ b/src_nbgl/ui_sign_712.c @@ -25,7 +25,7 @@ static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { switch (page) { case 0: // limit the value to one page - nbgl_getTextMaxLenInNbLines(BAGL_FONT_INTER_REGULAR_32px, + nbgl_getTextMaxLenInNbLines(BAGL_FONT_INTER_MEDIUM_32px, strings.tmp.tmp, SCREEN_WIDTH - (2 * BORDER_MARGIN), 9, diff --git a/src_nbgl/ui_sign_message.c b/src_nbgl/ui_sign_message.c index 587bb68..5ea2c89 100644 --- a/src_nbgl/ui_sign_message.c +++ b/src_nbgl/ui_sign_message.c @@ -41,7 +41,7 @@ static bool display_message(nbgl_pageContent_t *content) { strncpy(staxSharedBuffer + eip191MessageIdx, strings.tmp.tmp + stringsTmpTmpIdx, SHARED_BUFFER_SIZE - eip191MessageIdx); - reached = nbgl_getTextMaxLenInNbLines(BAGL_FONT_INTER_REGULAR_32px, + reached = nbgl_getTextMaxLenInNbLines(BAGL_FONT_INTER_MEDIUM_32px, (char *) staxSharedBuffer, SCREEN_WIDTH - (2 * BORDER_MARGIN), 9, From ee8c8e357cc0959c410e94e7fdd04b4d1aee32f0 Mon Sep 17 00:00:00 2001 From: Clement Bouvet Date: Tue, 21 Feb 2023 10:54:38 +0100 Subject: [PATCH 25/85] New stax icons --- Makefile | 9 ++++----- glyphs/stax_akroma_64px.gif | Bin 0 -> 886 bytes glyphs/stax_apothemnetwork_64px.gif | Bin 0 -> 815 bytes glyphs/stax_artis_sigma1_64px.gif | Bin 0 -> 997 bytes glyphs/stax_artis_tau1_64px.gif | Bin 0 -> 985 bytes glyphs/stax_astar_64px.gif | Bin 0 -> 1019 bytes glyphs/stax_atheios_64px.gif | Bin 0 -> 584 bytes glyphs/stax_bsc_64px.gif | Bin 0 -> 885 bytes glyphs/stax_bttc_64px.gif | Bin 0 -> 1070 bytes glyphs/stax_callisto_64px.gif | Bin 0 -> 773 bytes glyphs/stax_conflux_espace_64px.gif | Bin 0 -> 641 bytes glyphs/stax_cube_64px.gif | Bin 0 -> 966 bytes glyphs/stax_dexon_64px.gif | Bin 0 -> 914 bytes glyphs/stax_ellaism_64px.gif | Bin 0 -> 639 bytes glyphs/stax_energywebchain_64px.gif | Bin 0 -> 836 bytes glyphs/stax_ether1_64px.gif | Bin 0 -> 622 bytes glyphs/stax_ethereum_64px.gif | Bin 0 -> 556 bytes glyphs/stax_ethereum_classic_64px.gif | Bin 0 -> 618 bytes glyphs/stax_ethergem_64px.gif | Bin 0 -> 649 bytes glyphs/stax_ethersocial_64px.gif | Bin 0 -> 265 bytes glyphs/stax_expanse_64px.gif | Bin 0 -> 384 bytes glyphs/stax_flare_64px.gif | Bin 0 -> 199 bytes glyphs/stax_flare_coston_64px.gif | Bin 0 -> 210 bytes glyphs/stax_gochain_64px.gif | Bin 0 -> 314 bytes glyphs/stax_goerli_64px.gif | Bin 0 -> 339 bytes glyphs/stax_hpb_64px.gif | Bin 0 -> 354 bytes glyphs/stax_id4good_64px.gif | Bin 0 -> 339 bytes glyphs/stax_kardiachain_64px.gif | Bin 0 -> 310 bytes glyphs/stax_kusd_64px.gif | Bin 0 -> 283 bytes glyphs/stax_meter_64px.gif | Bin 0 -> 311 bytes glyphs/stax_mix_64px.gif | Bin 0 -> 246 bytes glyphs/stax_moonbeam_64px.gif | Bin 0 -> 212 bytes glyphs/stax_moonriver_64px.gif | Bin 0 -> 294 bytes glyphs/stax_multivac_64px.gif | Bin 0 -> 349 bytes glyphs/stax_musicoin_64px.gif | Bin 0 -> 300 bytes glyphs/stax_oasys_64px.gif | Bin 0 -> 340 bytes glyphs/stax_okc_64px.gif | Bin 0 -> 247 bytes glyphs/stax_pirl_64px.gif | Bin 0 -> 293 bytes glyphs/stax_poa_64px.gif | Bin 0 -> 299 bytes glyphs/stax_polygon_64px.gif | Bin 0 -> 681 bytes glyphs/stax_reosc_64px.gif | Bin 0 -> 314 bytes glyphs/stax_ropsten_64px.gif | Bin 0 -> 248 bytes glyphs/stax_rsk_64px.gif | Bin 0 -> 295 bytes glyphs/stax_rsk_testnet_64px.gif | Bin 0 -> 295 bytes glyphs/stax_shiden_64px.gif | Bin 0 -> 342 bytes glyphs/stax_shyft_64px.gif | Bin 0 -> 339 bytes glyphs/stax_songbird_64px.gif | Bin 0 -> 251 bytes glyphs/stax_tecracoin_64px.gif | Bin 0 -> 389 bytes glyphs/stax_tecratestnet_64px.gif | Bin 0 -> 389 bytes glyphs/stax_thundercore_64px.gif | Bin 0 -> 287 bytes glyphs/stax_tobalaba_64px.gif | Bin 0 -> 228 bytes glyphs/stax_tomochain_64px.gif | Bin 0 -> 227 bytes glyphs/stax_ubiq_64px.gif | Bin 0 -> 295 bytes glyphs/stax_volta_64px.gif | Bin 0 -> 339 bytes glyphs/stax_wanchain_64px.gif | Bin 0 -> 313 bytes glyphs/stax_webchain_64px.gif | Bin 0 -> 217 bytes glyphs/stax_wethio_64px.gif | Bin 0 -> 305 bytes glyphs/stax_xdcnetwork_64px.gif | Bin 0 -> 287 bytes icons/stax_app_akroma.gif | Bin 0 -> 467 bytes icons/stax_app_apothemnetwork.gif | Bin 0 -> 410 bytes icons/stax_app_artis_sigma1.gif | Bin 0 -> 476 bytes icons/stax_app_artis_tau1.gif | Bin 0 -> 481 bytes icons/stax_app_astar.gif | Bin 0 -> 506 bytes icons/stax_app_atheios.gif | Bin 0 -> 340 bytes icons/stax_app_bsc.gif | Bin 0 -> 473 bytes icons/stax_app_bttc.gif | Bin 0 -> 471 bytes icons/stax_app_callisto.gif | Bin 0 -> 404 bytes icons/stax_app_conflux_espace.gif | Bin 0 -> 347 bytes icons/stax_app_cube.gif | Bin 0 -> 438 bytes icons/stax_app_dexon.gif | Bin 0 -> 469 bytes icons/stax_app_ellaism.gif | Bin 0 -> 381 bytes icons/stax_app_energywebchain.gif | Bin 0 -> 446 bytes icons/stax_app_ether1.gif | Bin 0 -> 337 bytes icons/stax_app_ethereum.gif | Bin 0 -> 309 bytes icons/stax_app_ethereum_classic.gif | Bin 0 -> 328 bytes icons/stax_app_ethergem.gif | Bin 0 -> 328 bytes icons/stax_app_ethersocial.gif | Bin 0 -> 136 bytes icons/stax_app_expanse.gif | Bin 0 -> 165 bytes icons/stax_app_flare.gif | Bin 0 -> 110 bytes icons/stax_app_flare_coston.gif | Bin 0 -> 116 bytes icons/stax_app_gochain.gif | Bin 0 -> 150 bytes icons/stax_app_goerli.gif | Bin 0 -> 157 bytes icons/stax_app_hpb.gif | Bin 0 -> 161 bytes icons/stax_app_id4good.gif | Bin 0 -> 151 bytes icons/stax_app_kardiachain.gif | Bin 0 -> 153 bytes icons/stax_app_kusd.gif | Bin 0 -> 133 bytes icons/stax_app_meter.gif | Bin 0 -> 148 bytes icons/stax_app_mix.gif | Bin 0 -> 126 bytes icons/stax_app_moonbeam.gif | Bin 0 -> 107 bytes icons/stax_app_moonriver.gif | Bin 0 -> 142 bytes icons/stax_app_multivac.gif | Bin 0 -> 161 bytes icons/stax_app_musicoin.gif | Bin 0 -> 146 bytes icons/stax_app_oasys.gif | Bin 0 -> 149 bytes icons/stax_app_okc.gif | Bin 0 -> 131 bytes icons/stax_app_pirl.gif | Bin 0 -> 145 bytes icons/stax_app_poa.gif | Bin 0 -> 147 bytes icons/stax_app_polygon.gif | Bin 0 -> 362 bytes icons/stax_app_reosc.gif | Bin 0 -> 148 bytes icons/stax_app_ropsten.gif | Bin 0 -> 127 bytes icons/stax_app_rsk.gif | Bin 0 -> 144 bytes icons/stax_app_rsk_testnet.gif | Bin 0 -> 144 bytes icons/stax_app_shiden.gif | Bin 0 -> 156 bytes icons/stax_app_shyft.gif | Bin 0 -> 150 bytes icons/stax_app_songbird.gif | Bin 0 -> 132 bytes icons/stax_app_tecracoin.gif | Bin 0 -> 174 bytes icons/stax_app_tecratestnet.gif | Bin 0 -> 174 bytes icons/stax_app_thundercore.gif | Bin 0 -> 141 bytes icons/stax_app_tobalaba.gif | Bin 0 -> 116 bytes icons/stax_app_tomochain.gif | Bin 0 -> 126 bytes icons/stax_app_ubiq.gif | Bin 0 -> 143 bytes icons/stax_app_volta.gif | Bin 0 -> 158 bytes icons/stax_app_wanchain.gif | Bin 0 -> 153 bytes icons/stax_app_webchain.gif | Bin 0 -> 116 bytes icons/stax_app_wethio.gif | Bin 0 -> 149 bytes icons/stax_app_xdcnetwork.gif | Bin 0 -> 146 bytes 115 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 glyphs/stax_akroma_64px.gif create mode 100644 glyphs/stax_apothemnetwork_64px.gif create mode 100644 glyphs/stax_artis_sigma1_64px.gif create mode 100644 glyphs/stax_artis_tau1_64px.gif create mode 100644 glyphs/stax_astar_64px.gif create mode 100644 glyphs/stax_atheios_64px.gif create mode 100644 glyphs/stax_bsc_64px.gif create mode 100644 glyphs/stax_bttc_64px.gif create mode 100644 glyphs/stax_callisto_64px.gif create mode 100644 glyphs/stax_conflux_espace_64px.gif create mode 100644 glyphs/stax_cube_64px.gif create mode 100644 glyphs/stax_dexon_64px.gif create mode 100644 glyphs/stax_ellaism_64px.gif create mode 100644 glyphs/stax_energywebchain_64px.gif create mode 100644 glyphs/stax_ether1_64px.gif create mode 100644 glyphs/stax_ethereum_64px.gif create mode 100644 glyphs/stax_ethereum_classic_64px.gif create mode 100644 glyphs/stax_ethergem_64px.gif create mode 100644 glyphs/stax_ethersocial_64px.gif create mode 100644 glyphs/stax_expanse_64px.gif create mode 100644 glyphs/stax_flare_64px.gif create mode 100644 glyphs/stax_flare_coston_64px.gif create mode 100644 glyphs/stax_gochain_64px.gif create mode 100644 glyphs/stax_goerli_64px.gif create mode 100644 glyphs/stax_hpb_64px.gif create mode 100644 glyphs/stax_id4good_64px.gif create mode 100644 glyphs/stax_kardiachain_64px.gif create mode 100644 glyphs/stax_kusd_64px.gif create mode 100644 glyphs/stax_meter_64px.gif create mode 100644 glyphs/stax_mix_64px.gif create mode 100644 glyphs/stax_moonbeam_64px.gif create mode 100644 glyphs/stax_moonriver_64px.gif create mode 100644 glyphs/stax_multivac_64px.gif create mode 100644 glyphs/stax_musicoin_64px.gif create mode 100644 glyphs/stax_oasys_64px.gif create mode 100644 glyphs/stax_okc_64px.gif create mode 100644 glyphs/stax_pirl_64px.gif create mode 100644 glyphs/stax_poa_64px.gif create mode 100644 glyphs/stax_polygon_64px.gif create mode 100644 glyphs/stax_reosc_64px.gif create mode 100644 glyphs/stax_ropsten_64px.gif create mode 100644 glyphs/stax_rsk_64px.gif create mode 100644 glyphs/stax_rsk_testnet_64px.gif create mode 100644 glyphs/stax_shiden_64px.gif create mode 100644 glyphs/stax_shyft_64px.gif create mode 100644 glyphs/stax_songbird_64px.gif create mode 100644 glyphs/stax_tecracoin_64px.gif create mode 100644 glyphs/stax_tecratestnet_64px.gif create mode 100644 glyphs/stax_thundercore_64px.gif create mode 100644 glyphs/stax_tobalaba_64px.gif create mode 100644 glyphs/stax_tomochain_64px.gif create mode 100644 glyphs/stax_ubiq_64px.gif create mode 100644 glyphs/stax_volta_64px.gif create mode 100644 glyphs/stax_wanchain_64px.gif create mode 100644 glyphs/stax_webchain_64px.gif create mode 100644 glyphs/stax_wethio_64px.gif create mode 100644 glyphs/stax_xdcnetwork_64px.gif create mode 100644 icons/stax_app_akroma.gif create mode 100644 icons/stax_app_apothemnetwork.gif create mode 100644 icons/stax_app_artis_sigma1.gif create mode 100644 icons/stax_app_artis_tau1.gif create mode 100644 icons/stax_app_astar.gif create mode 100644 icons/stax_app_atheios.gif create mode 100644 icons/stax_app_bsc.gif create mode 100644 icons/stax_app_bttc.gif create mode 100644 icons/stax_app_callisto.gif create mode 100644 icons/stax_app_conflux_espace.gif create mode 100644 icons/stax_app_cube.gif create mode 100644 icons/stax_app_dexon.gif create mode 100644 icons/stax_app_ellaism.gif create mode 100644 icons/stax_app_energywebchain.gif create mode 100644 icons/stax_app_ether1.gif create mode 100644 icons/stax_app_ethereum.gif create mode 100644 icons/stax_app_ethereum_classic.gif create mode 100644 icons/stax_app_ethergem.gif create mode 100644 icons/stax_app_ethersocial.gif create mode 100644 icons/stax_app_expanse.gif create mode 100644 icons/stax_app_flare.gif create mode 100644 icons/stax_app_flare_coston.gif create mode 100644 icons/stax_app_gochain.gif create mode 100644 icons/stax_app_goerli.gif create mode 100644 icons/stax_app_hpb.gif create mode 100644 icons/stax_app_id4good.gif create mode 100644 icons/stax_app_kardiachain.gif create mode 100644 icons/stax_app_kusd.gif create mode 100644 icons/stax_app_meter.gif create mode 100644 icons/stax_app_mix.gif create mode 100644 icons/stax_app_moonbeam.gif create mode 100644 icons/stax_app_moonriver.gif create mode 100644 icons/stax_app_multivac.gif create mode 100644 icons/stax_app_musicoin.gif create mode 100644 icons/stax_app_oasys.gif create mode 100644 icons/stax_app_okc.gif create mode 100644 icons/stax_app_pirl.gif create mode 100644 icons/stax_app_poa.gif create mode 100644 icons/stax_app_polygon.gif create mode 100644 icons/stax_app_reosc.gif create mode 100644 icons/stax_app_ropsten.gif create mode 100644 icons/stax_app_rsk.gif create mode 100644 icons/stax_app_rsk_testnet.gif create mode 100644 icons/stax_app_shiden.gif create mode 100644 icons/stax_app_shyft.gif create mode 100644 icons/stax_app_songbird.gif create mode 100644 icons/stax_app_tecracoin.gif create mode 100644 icons/stax_app_tecratestnet.gif create mode 100644 icons/stax_app_thundercore.gif create mode 100644 icons/stax_app_tobalaba.gif create mode 100644 icons/stax_app_tomochain.gif create mode 100644 icons/stax_app_ubiq.gif create mode 100644 icons/stax_app_volta.gif create mode 100644 icons/stax_app_wanchain.gif create mode 100644 icons/stax_app_webchain.gif create mode 100644 icons/stax_app_wethio.gif create mode 100644 icons/stax_app_xdcnetwork.gif diff --git a/Makefile b/Makefile index 2ed9286..d037261 100644 --- a/Makefile +++ b/Makefile @@ -68,11 +68,10 @@ ifeq ($(TARGET_NAME),TARGET_NANOS) ICONNAME=icons/nanos_app_$(CHAIN).gif else ifeq ($(TARGET_NAME),TARGET_STAX) ICONNAME=icons/stax_app_$(CHAIN).gif -DEFINES += ICONGLYPH=C_stax_app_$(CHAIN)_64px -DEFINES += ICONBITMAP=C_stax_app_$(CHAIN)_64px_bitmap -DEFINES += ICONGLYPH_SMALL=C_stax_app_$(CHAIN) -GLYPH_FILES += icons/stax_app_$(CHAIN)_64px.gif -GLYPH_FILES += icons/stax_app_$(CHAIN).gif +DEFINES += ICONGLYPH=C_stax_$(CHAIN)_64px +DEFINES += ICONBITMAP=C_stax_$(CHAIN)_64px_bitmap +DEFINES += ICONGLYPH_SMALL=C_stax_$(CHAIN) +GLYPH_FILES += $(ICONNAME) else ICONNAME=icons/nanox_app_$(CHAIN).gif endif diff --git a/glyphs/stax_akroma_64px.gif b/glyphs/stax_akroma_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..d092851dfbc8c87dc78769abb970463a2fbd45ed GIT binary patch literal 886 zcmV-+1Bv`cNk%w1VL$*t0P_F<000051qBNW3l|p`FfcG*Utgi2q0!ON=jZ41^Yi)n z`Tzg_000000000000000A^8LV00000A^!_WZDD6+O<`wgV`~m)VQp<;JuogbH8eFe zH2^FC0000$06+i$1paWzNvpj$>&?6WU?`53F%(BauHhj7FoCLUoe^*@41|%|z{wz& z3&2i3MX-h=IspMBLb((bo=_t(ATuDUAk(%$7zDIi+2IS`9EL>i!9aLD0|GUzZ9x#w z00k2X2Ul1yTs{bUdV`Y%GLuIR&)~27m)>$CZ_OETBXL#S3p+1`~dE06YR`TLOYB z3a;VVjzlLEn^AKG$egMq>H*#GW5v6Ost_2U7l*~a9Q!7?iZVq4f_mo`uxbS<6Np>9 zDquvEupJ}|{@cRc6Y(&Oq>=?E9PCsfU9uG(IkBt5iv}TZ01~Q%lr2O)oeK&$Q^o30 zpgwT)tvCn+XtOONU14h}^wrWz5ha8~sLP#!Oa{h@B(XIHBb3Q%mF0or2QY-oK3JR8 zQ{7aDM%@*Fg(%Vpm)t6-6L6r`LT5XQj0B-Br^ZTORRR*0QUueZ6v|?DIIs*JM8fX2 zcp`ei+!#F<5bA6OXAz(t&>k6?Zm5Pytc{?_`XS~KoeD0)&M@x}Y7v0rFroygN8#R8 z9fwG8xmV_ToVxtj@HCJ`4&5t$Y8*;?25T%^U{9~`5Rn&Av}f8he1mK#PTd!<1F zo*^Xu$JKR+fQHHwtz9C0j3J4S@ihlZ)*1<-zaj+U4 zAA%UzMc66jfiD7eHsK)`+Lu>O-*NB@YfxCSn0<{6U;rio+T@`u^<{8bcBHJa$_R6y zsD*VOEO|$NUc{wi0s`sqV+O~l7)pO@@wuy)u_{L_NWZt6y z75}*Cfs_^A2?cy)E}{(_?|h&DA@f9tMxb}dvO^b5aM6$ldrG8QheJk)6QphGRv8eS z?&Vn)g3<`aq7t1*22H8D^JN=cM(Js)X*M#*0gawo;Q)M0$7yGOIFn?sv3V$DoX7|^ M>+G}8Y7hYcJ0ZDeWB>pF literal 0 HcmV?d00001 diff --git a/glyphs/stax_apothemnetwork_64px.gif b/glyphs/stax_apothemnetwork_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..974f8bb31c28bc7acb2565fb186c128e0edb70b7 GIT binary patch literal 815 zcmV+~1JL|ONk%w1VL$*t0P_j}0RaIE3kw$)7cMR?U|?XLo}SUs(dXyq^z`)l`uhL> z{{R30000000000000000A^8LV00000A^!_WZDD6+O<`wgV`~m)VQp<;JuogbH8eFe zH2^FC0000$06+i$1pZLTNvpj$>&?6WU?`4cg%|}f3<2N*!b%iIa+Kw%3UB-NfxwD} zz=2S#UTjuqHVHdGP%tYRHHQMv6@VIU3PfUJRiIR_+4yQIBmo10L6l8)=j?>eHz!nr5c#691t4K3N;K^LaZ%=KE%~D*8(@CiCzVQk*(9%A5p=f z4HCHmfgnOcYdGO!%Th^i@JfY2_@mN3N<)%FX~Ae^44%sR(g<_J%Y;rt(99Oj+iwgk zEf^5;yuwN!$~58|5nY$v#urxAB-6|p9TuTYseaY0c)+;Zk5CT}r@91<>C4K#Y5u~o z0F^AjlL8cOSrCf~oh_zYLj8e&R06{w_8MG5fLD(t>S@50M;BfL2Y9vMV_z{)J$G7y z9ZFM?g6nC605?HcIKd~qq$t4&2aTw}Ju+fqlvaT$)MFv<3`s#rHIl=PUGC8#OKq-{ z)CG_pl;li+SJZI|l^-lA1d30kAc!xy&;%Bj7EH6*9olGl3JnjX=}!tiRCuAAQpmuB t6Hr9-16VdHz?5D;6j~=0Gz3b44QE8;gA_|NVSpHlR%+>`m{Je{06VElLgWAd literal 0 HcmV?d00001 diff --git a/glyphs/stax_artis_sigma1_64px.gif b/glyphs/stax_artis_sigma1_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..05c4f221cd8eb02251f821b7ef454598713e7309 GIT binary patch literal 997 zcmV z{{R30000000000000000A^8LV00000A^!_WZDD6+O<`wgV`~m)VQp<;JuogbH8eFe zH2^FC0000$06+i$1pZLTNvpj$>&?6WU?`4cX`X0WCR}nH#=)v0n@_av|(4zQX+~T zjs*zV$X^IX{`aczyF^442v*Z7KB4DRre+^a`qL&JTjG5Vzjl=hugQywhnO0 zaAn*J_5dg<*MyUWk@0dW7&SrM#9{>RR+zV=%Mii_KM?>5dBQ+hi>Ge8caWvoE(JA| zT3O(c=|fsGUjmI01Gj!qCk2ibABOmY%3lX0-!GWJ1Mjv9}B;8JoL{KwKfg0V*%CJMsS8gTTP0aa{;Q3r(p z6k2eGGarHoph0$3m5y+vnWq4CkJ!XRQ=?c&MqPS!@SrrWk)}%(v!&5QYTAX!mjE_e z5DgusIC9@sX?SHEfVhRW!5MSJFl0ZNxbW7QXA-uceIK|0j||4-2iui|W!EHt+-ziE z3)I|0j4^F^fs36QcrwvWEpG78EI3pts6Hm`gPwrn^~R_RL$-lS3}RKa(>NtuCJjbc z94F`_lVn)Ie^OW%f-QQk3RM^bJkpelP>^_FSQJE)2tLRlQmZnN`qWR9AmphPKO1-H zazz%$1v>1l#_AdZZ{O52Oa%z+kVP0m@Nf#UufFM$t}YleW0qc`Fd@$=m~i#sVNYB>=;QI8Hkf`j*uKM)F=W|oP)*` Thb;2QB$sUR$tb7%K?DFhiBOzZ literal 0 HcmV?d00001 diff --git a/glyphs/stax_artis_tau1_64px.gif b/glyphs/stax_artis_tau1_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..87b527dae34f16890d7365a5c34a2374cada11e8 GIT binary patch literal 985 zcmV;~119`ONk%w1VL$*t0P_F<0RaIE3kwz&7A`I>U|?XLo}SRq(C6pp^Yioh`T76< z{{R30000000000000000A^8LV00000A^!_WZDD6+O<`wgV`~m)VQp<;JuogbH8eFe zH2^FC0000$06+i$1pZLTNvpj$>&?6WU?`4cX`X0WCR}nH#=)v0nA0(LYBX>J66F$gn~5(ou^js^${jZZ@~2AEF-GYX}q2?YaR1e!Mr1z-e} zD2+j0iWLb4t8N1YrwXB91)C=agaHM%#uEmEU5RBD2!{Z@i72txyUD;Tf}#Rs!4!=? zo(qR00Y~R*=W@+>KYJ8@KV4wUeW`7)ouUY#}HVJ!?c}7B#Awheo_B3>)yM`7%tr zZ5vhD&Uj`g1B|D_j@zxM$S~Ux21#hZDKw)%cfmM5!^#cI;|}|3p(+5L?TNNCat~fJ zlw)B2Aj&UCQRk3bfDjZ^c2@AEiD};@7Tz_gz|$R43`*b{Y?X=8N`4f)g@|h8U1N+v zPRV7PNMwMZ6D|s3cT_*^@v@#2#e8tZBL)n$oFsFBg$Z+C5V%w&*0Chxb{2ZDjWQKx z0^&;Gp%aJ(( zR6HRd&l>RHH>EJ;xi$hLPB?YL6_~v7iz{vJQQ8O%-DQQBA~9FYCLB_LloThlG+l_0 ziJ|F(*F}*WNAy$>%NxtAV&6fUS{D*#CRpM{ilXjgNfvn&`UeZX-KPS2*YwDVjH_$y zK-wI?T!s)RG$qu;st5wxn6X6!H3no^nvw$`e*D1L9BlFfs27hclSL4GZ7UI+RiG5b zxxX>i#1=sK@JM$mh#1DcKrq)XBrlvYXqZ9t+XoM66=+5XIUJDW#29C+@x~l??D5AR HM*sjjv>us8 literal 0 HcmV?d00001 diff --git a/glyphs/stax_astar_64px.gif b/glyphs/stax_astar_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..60fb1e8fc4a3bd527e96ab21e917f4d67b930681 GIT binary patch literal 1019 zcmVNk%w1VL$*t0P_F<000061_lcY3mF+1EiElhPEK!cZ=9T*(b3W9=;-zJ z_4@ky|Ns900000000000A^8LV00000A^!_WZDD6+O<`wgV`~m)VQp<;JuogbH8eFe zH2^FC0000$06+i$1pbi8Nvpj$>&?6WU?`5Hg&amf3;_TH0#O(TQr^;846N(BEugH1 z3n2`HpK_@j6cCG|W`QUKnb>8(X_HnI3S@Si9n_*;MwQIYKBbGrA&I??1!FV1q&VQQ zJXta{DRfK%2MQ$#27gKc1P60W1qTUHaSI6t1X%_oa*jU(1_=rUT0~SSGd7!sKLH0L zew1AYb^wT(lR#z+3TsRUaUTe^ns7i>6616`B2@?g< zE(Bd+0=Wg{9R^y;5(@@)0@?}9!xNk6pEw*_63`#A0^k_zbF(MRl586mSW)t>0xl)9 zD0E{2(ceZN{spE)^QLXWfhHvx^wNSr!JdIX@?~&{agRBQ373gml99qmB?fF#IA({O z1#UnUno7Vln2KCICm`VGqN9bMK4e{3_+y3&0xM+9Sm`3FNuC!@q1=j$%r&z)r~(LS zLTMrDAW51*F@5FWpI|~oL~T_>jPTDPiFC^WBZ63Bu9-t|at#cdW-CG{W$enS zA{wILsV>FgKo*rwRB~)-d6>tXb>w%{b?*^Ue_f06Wn|oR|Or literal 0 HcmV?d00001 diff --git a/glyphs/stax_atheios_64px.gif b/glyphs/stax_atheios_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..051e9c37e73fcb24e8ff820bf4c7b8a7b54e6c46 GIT binary patch literal 584 zcmZ?wbhEHbbYO5`_{_}!1gxyAJUl#-l9GCQdJz#3vuDq~aN)x9=g+@<`SSDU&;S4b zgA~Dl;!hSZQ}I8yXKrG8s&8U?W^y)PdSY&FqOF0Ri75y&=z!FKY+zvdS8&pE^H8~1CQQ$hB5wamCO(bBY zn8Vg2p60jH3OB3ZLbDjB1upV672PS~zqNOFh4`$b zx%pC&C9DUIiL$dCS*63V{tDY^(Z-}cJyxb7rmTD0CEKU#o?GB?F@E2+#TpYkZc9H6 zVtlQ}o*m*NGrxJGmxjYu*PHAqIe%t&6e!HK;%An=Bxs=UfTJmD%GcKo8!vX|+=$j{ zOW5J*Z75hdFZ1?_?ohtzY$0NMo;?hg(=*u(YMv$Q*u=di%sr>dLR=yppA{3{A-XjrtX{Ozr^ z-aZT4>Q`Fv_)KUoNIV?CxLI)J!%mf1s#a1HgB7&Q+TGp=q%Gw99Ke&Y&?6WU?`3xR}6!JAW7+R1`*5xp}x3v6awJ?gTf(~ zOPqd4Um%Dek`l3`^k-{1KL^=V(392-R}SLnwMD1QFy<7HE(h_!;+YihoIaK0Rtz&(bwuisyGy&Y>Ow)pbv3? zs97pTuG1%d{s*c7pm+favVSoW1z40JB@&hr4m=8wFx?(;RzlVhAWKuAa07J$@Yi9E zoqHC;IWt;kXiz%IJnXPH!N9vIX7)5iI3WwW4=WHHSe3M?BC|heP7s^GTL`OY<60XC z5v(`3a`TQn)xs@>7&Y@9(`z_) zCBRKwmQT%;2y?Ec%nHhFq=R^pHTRM(8P>wK56=hvAkvxdcMe3(HKuS4?JvexG@pE0 z=Kpp6HPHt79i^IkRr$wXRgd5%6g=xC2n0$52vXlZS1l+V9hW5Z;7Acl_Z=&+pa5PS z=*jd^1rO5Xmjd7%MA;4}PJ!MSV~N%rIpz?h0dj+G{1L;wIgm1|}B literal 0 HcmV?d00001 diff --git a/glyphs/stax_bttc_64px.gif b/glyphs/stax_bttc_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..99e51ff0174ef78b77c3ce9994e90e9246209375 GIT binary patch literal 1070 zcmV+}1kw9PNk%w1VL$*t0P_F<0RaIE3kw(+7%VI-US3|Eot@Co(CFys^z`)n{QUp_ z{{R30000000000000000A^8LV00000A^!_WZDD6+O<`wgV`~m)VQp<;JuogbH8eFe zH2^FC0000$06+i$1pZLTNvpj$>&?6WU?`4cg%|}v3hp-rx>iq&!>m_k0v|Qd=r@i|Pv1$d@FtDdX z2}y4Ne@6)kZZCx;T5kdccqIsl00RY8R+D`I0hc9hOH&AuYFeCxB?UhOMu&M4Y+IZK zfC>enuNGJc1TVCt8VP(Z1ehKOMj!{hU2=2GtQ{vQD~r!A1I8N615_I*EN24AAj1H( z9K)R%dn-Uo0?r;-x6K@~#lRD7g8>3EU%ZLnMeJLPco>oZv1EXpzIg@?8gO+1+Cv5A zDizUlfQ$+v{xr00=!Hhlg#$ehUMR2$jgchb;P~)oiK0P!x>OM|wkskWbd9*Y^EdGr zGjtY?Uf|>7kpxO`WDrp?AcjZ{^@>>-rji1|F6d-o3t6F~ybeCcS;)F_NmwBpJAMJ# z@ajlTXKisJU;)7qPzC3S&xLOq1_Tw-Kq*iK^(Y%BB$aP~melAf{E zfco!a%)NHE3br88tAVC9WW}5G22GJe2&N6vn(m;5rsN0{L-vNRxktfGDr9_d0-Mdh zy9EDAOD95R>ohDw%^@^^-~NK5#QU|_YsMU63Ebd4`heiCV}#jEi(B$F&2^0rz#8XM z!6(4}ra)CgOrd=(l1M?;%Hk_#Ix47Qkr5y`h-eZvizS%^DH z5E^F#`rzOT9+D7f4aPJAMi(P8VE;G6^} zyn$mvf3>32akS9(4nP4JAgiojAhwKP_hsM{DhfPG%cRk0QPnADz|aE>Ft9=pQ6a$8 z6Xh_LOvcG!H%zj^u|aUcLq4)d2!c+6=I9SC%M1%@uVIi;Ypt@zGSej}o&;_hTHJU; zy~xH<7bdykVM-TT#fyQnmgL4#40RPIj#M8_L60M+T3TBg*2*A<4p4AGgc0@rCJAgR8lmGw# literal 0 HcmV?d00001 diff --git a/glyphs/stax_callisto_64px.gif b/glyphs/stax_callisto_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..44a6b888aef10eff738ac64add7d5c5e2a80c659 GIT binary patch literal 773 zcmV+g1N!_&Nk%w1VL$*t0P_F<000061_lic4Hgy_EiElzU|^k{ozKtD>FMe8^z`}p z`Tzg_000000000000000A^8LV00000A^!_WZDD6+O<`wgV`~m)VQp<;JuogbH8eFe zH2^FC0000$06+i$1paWzNvpj$>&?6WU?`4RVhjOcB&x>~^2aLM zcNIthds|E^ffjjVgoImeUWtNwR0ReG1O${@1(FksN}Uo42?qxSK2rvtXmN7@s})2& zN(2WIr8t3e1GgBdG_eW>0ztlDpfm-56epAfIS0TheqeL47Q|H81yfB}YrPi=-9H6R zr30H>c1N4%76}ODGvW&g^n5})gUYQG2h5Gq#wLjhW+0LQD09jZ8hkSdRO_*BOqCa} z^aQ}RK$?mP{stV)u#}IAF%b&AotYqSg0vqJOO)g;D&}o2`}l`V$mVx z6nGb8m_rkkQKSwK1tbX|fGX88|5zF*z_p#rir$WGKwzq@SyM#EZ7>10R@Mt|!OWau zZ$lAMag@>#AXY8evuES7yn^sVAp(MN&68S#5M!wvE10-+shZ0Hh3aZJfSJy@w;`9h z1ZL5z2BS(=AzYw0;*|uN*w_S-)2HPHWG}&?6WU?`5{mLx@ilq`rCf>0!Ft-S#N$h7TG34;z0 z2=IQk6KpsP6p*zSb1H+Da8v5c8VY8!#x0kVcnQ8==h);$r>kpB+l@ZPDdu`AmlnsB zd{a3F3J3*(T6cv)dOe12PCZ;$U;+k`g#~VQP;*%_D;0)_Iz^mGd0%iBk7#N>O0Jfn z7^8ZyjA(utt*W~sWlO4;9=2dkv?7#WPcE8`Bc4>mA;yBIWI<<@%@#BVgtgDU2$&iP z2c$!@wFd(O;jH6X0|y`m>N>v^?mFNQURYHhLcu9ug>#14SL!_+`{ZlB2+s96|;dnZdwJX5}^*+j%dC zC5IChf>BZI*+3BKVk#)3Gz-%YqlkJ4GN9Xqs#C5y6L6rW9B@b__;jNptiQ8rQ+Ln&l3Co b=|j{K_a6t3?1bKch_!{_f($lzM+5*n$ngyo literal 0 HcmV?d00001 diff --git a/glyphs/stax_cube_64px.gif b/glyphs/stax_cube_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..81867228589bc0447a852e77d9fcc253c17543fc GIT binary patch literal 966 zcmV;%13COhNk%w1VL$*t0P_F<000061_lWU2^AF;E-o%!US5!pkgu<=&CSi{=jZeD z^ZNSw|Ns900000000000A^8LV00000A^!_WZDD6+O<`wgV`~m)VQp<;JuogbH8eFe zH2^FC0000$06+i$1pbi8Nvpj$>&?6WU?`4cX`X1RuH1qga11NdlE`>ISFcWY2mv54 zED~-DiGm;qIEO@M^m#-~mc?h_m}nIM;4naNKoAZRgLusz!_JJwmpv#GteS&x9VjTi z1ug__gj;d|fd>O^1qp)%8d!8NV19Fid;>2+mTj7f0Gb(Uj7tHZdzfpD1g9@VY<`24 z2}wM&Ye%Gkm#Sg9M67Lh2B`rDwiE>d%wR+U24(<92Sd!w0YcB$(9*ix*ur8*7B2|r z=m>vc1}^Aj>FMxRbC3z|=?tV|eHI4>00RO{u#3Szfd~^CAjrv}!iB}2gn?9{mzZcw z>g@9cMu4zS{)EK+>QccGEHS7MC9vqLjvkeBvcV#QV9`Vj#Tcy|0>dW9A%1$ei-BOy zkxS$*m|{bd+0m06{T%#v5W#|V0Wh-DP?OCT1O~P!==$@{OJ~-~lv#9i+7Aqe+F(48 zfFM*t&>ZP3aFo*@1019kai$5uN|Bh_GCj9QtAKNFxf-A)T1~ifKwSdnsStZEEe14j5 z5wZdPpcNZc+&7VXd}Ie-D|8@t7b0dPmlA=IiLk%{4xfJD<9|CQ1S5hnB zw#GsR>H?aKVko$RcVTD}R+rJ-*Uf!?upq&OAvv;#A2+~YAA8Ti0*9GO$o7~XrOG}m8i@e~)LQEz9olB9tlBY?O)9di$0)Cv;wah+u~bNGrVm(o z>eZ#oT5wN1kg0c3v=>OD1rd`HND{Uc5GkN{Wb7I(k|Ays2)Gzvs1t*CunU*5y@9f> oycfLqouswkivf?uFcS^5{+46w!Il=R@WKo??C`@7V;TVfJApTrr~m)} literal 0 HcmV?d00001 diff --git a/glyphs/stax_dexon_64px.gif b/glyphs/stax_dexon_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..d37f6b26b2329c277f146a93b9f89539ad142f8c GIT binary patch literal 914 zcmV;D18w|ANk%w1VL$*t0P_F<000061_lcY3m6y}FfcG+U|^u2pwZFM=jZ42^z{1r z`uzO-|Ns900000000000A^8LV00000A^!_WZDD6+O<`wgV`~m)VQp<;JuogbH8eFe zH2^FC0000$06+i$1pbi8Nvpj$>&?6WU?`4cX_m;brQ3m=T~TbZk|i?S27!?ogMklY z;Hh*M8~{K-D4rFvpm|Ng zIa@OXo`MMy9!m}=#a&|1lOd`DE35sBqY)s6U9B#0YgAx>PmN`LVsw@8qK1cAoKQeE zgQi6#>M9HbWI>;#OMX@KZ1f`NT9m}H6_lY2Tm?pS}x! zEg3xi5!7%!@h1RQ_0P;Yk5rH~Y!V`a60mYwC z9C$$)NNjl$oqcQIfJ-Yj(GvhbA^BlkgW|0*U&K z)DA!^br^yowv;m#G@^BcVL6*A=oJY0E%6SCU%Yb)I?rVWLSS1q^Ts##;PGP#E(P<< zKL4F_g)IiyhJrGa`Q%*y=;;znLL->~S0k!m7)zw59LPn5FcImA4cth|ln#Rdz+kAQ z4JM`&?6WU?`4cXB1^B9zkHJFozHTKpb&?6+sOY3Y~Ca z==lJK;1Grw9BTsHGNmXyeT2lcWVjw*+m*oU6M(~>8TmLspgrC75%u20$G2!&n*G-L&dZwd!)nO>izSDy+9feV5{2}P=? zKA#e5bEE`j2wFo2oj;_Shzbc>xWcQ%QZWjQjeqibGcgP43K+gj(L$mCGOLs5OD-6&KA*v^5Rxmkc zx?xC$C!wEf{tDOJfXGjxn*<>}>3W3k;Q}6yCZeSD1KCA60q78-WNRi*Oewt(yin55 zM24oOag>8E!$E{fgD#YMB)~`wjEvwpN)@D`j2%P`&|@NtAJPHnz!H+_q6pFdi#J5pD0-~^)no=wL3qq ZHu-H35FUO3>c@yq1tzHAf*wQw06WyX2f+XU literal 0 HcmV?d00001 diff --git a/glyphs/stax_energywebchain_64px.gif b/glyphs/stax_energywebchain_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..5cd4c4da1eed3dcb278b2727ab1204f666919094 GIT binary patch literal 836 zcmV-K1H1f3Nk%w1VL$*t0P_F<000051qBNW3l|p`EG#TsTwI@@pV86L=jZ42^z{1r z`v3p`000000000000000A^8LV00000A^!_WZDD6+O<`wgV`~m)VQp<;JuogbH8eFe zH2^FC0000$06+i$1paWzNvpj$>&?6WU?`5Hg&amf5JEewg>fKBX)j1h1VG>OK0rV~ zh#_tvgbEmJIsrr(l5;2wp4e>hFumli%&a&_FdVy*Y9Ksr`wHBy;p(nC%hS1i-xL@W zB?$&>e0zQgfFTM7g^fXeBL)JFlu!mC2LzRr0R(X!N}HPnXB>>8o0n9Rs96CqbWa1H z7zzcgS$=?eSOpsgvA9mY5~s4X7PrD!0tJAfPp=ukgv&jU3xik$2#FQO)=vdB37XM= z7PgyfLpSI z&PkX!EEy|D{;KA9sv)n*r5sqKRmj+g8;%{Xjs)zbU{SSB7Csg_n2nVHE)Tb*={F#! zm`*w$5z}UAK?08Rb|v*8z=D`E7_&HAa0F2?`Pi?VF*@jKWjp z*5583Lx8fJSFB&v3S)a1&{xt2ff@%U1(@|xYq2avS32&ArJ(`@bPg*>oQ1BIWLg2u zbn+9CvccJi9)TtfbY-A*0fdCoHZ;I@K~zyFs4<%s#4lFw?Hbar?g?3YAxciVtxMj0 zT(Z6s5iGoXHfg>jRTmrQUKkklqxTfzt^u*h*X41X0=1N?s`NU-b$+qHod#Bj4ZxEG zB}oz0L5v{ppm&BnlVLF06D~QW0}Lo&1CRkLY>|k3kVQm+bLkSB~-%% z2&VLp1`9H1hBqkQ@`{Fnu&_`=9Te6?Co+hLf(k*P*W(EkF62Xd83ZMU06YxfB$G}I zLBs%o4Wl26xP`-DJ|IA+r7VBInB$ksprgoIWOk*?2#H8yBq{@#X#+3I08z$?NMQKp z9z1x61`cynSxB6CqES;7S@MA%c7K|%L?KaV*eC@#sKCk^q_t3l8IyiMqzdl10K<@- OmTKy$sHW;c1OPky#8K1$ literal 0 HcmV?d00001 diff --git a/glyphs/stax_ether1_64px.gif b/glyphs/stax_ether1_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..ec41146ed8950fcac0dd976223540fd69d4a454f GIT binary patch literal 622 zcmV-!0+IbkNk%w1VL$*t0P_j}0000B3kw$)7cMR?UteFMqN3H+)#&Kx^Yioh`T76< z{{R30000000000000000A^8LV00000A^!_WZDD6+O<`wgV`~m)VQp<;JuogbH8eFe zH2^FC0000$06+i$1pZLTNvpj$>&?6WU?`4cXB1^R8pNT#o*@u$t;vF6@0A=72%b;| z2%v;JB4FS`)|5ZzQxE_EazSZIX>Dn@0;|>d^&k?xuz0B}ZwdzV#J2_j-I>B5PT`7k zcozo)0c~??Yd=|m3JC}WR!4_*Vv>wXmI`!~OpFQ$1XXrvlw&l32nGS7r<0{chGm0m ztrC8mi(imy18JhAWM#LVuCHug2?UgY#l{43P6fYWg?)&|%t(XNW0sr70mM9y#@^Sj ztC>^f*2Z;vLdxvT?om6^?zP|Uusia`0~X!lSL?-r0#twnq(@2AfC9OmglZ_DiKcTD z3B;~8hFJ^ zBLf5OBoQ#9O#-A5#T^iV1gSIVq+8~0A5isx3gpKt3V zE<-NSk;@GsM*L!yS^=8}X45I5h*g^z;lF~|@XKLgV8^_d6G&%eL_ I4-o(WJEu(u&Hw-a literal 0 HcmV?d00001 diff --git a/glyphs/stax_ethereum_64px.gif b/glyphs/stax_ethereum_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..48fa1ac7ea659bc6b4e0b2b6076f5e561a7a2e1f GIT binary patch literal 556 zcmZ?wbhEHbbYO5`_{_}!1gxyAJUl$&;^O-H`f+h_3l=Q6aN)wsmoGnm{`~jv-~a#r zgA~Dl;!hSZQ}I8yXKrG8s&8U?W^y)PdSY&FqOF0Ri75y&=z!FKY+zvdS8&pE^1q! zF;iBNjZwGv!|SfLq(v8byq0w`>s3#7*x!A1=P`kOmzm6}Bz5b8^trj3#8|yrUAa2D zI=HR->Y3~&371ZbV&$CJ#WpvpaFPy7ab+fqM2hja6;=|z4m z2j;B}TYNO>kOO<*si+k9PS)BBK^rZ(*jHT-V%lag=iUa6g@*f|6tGts-e$RWkMWW_ zXWqTSx9;pcrs|3?aT7o33j#XgcmZW^!_K$SDuc;Qx1Wj`I6#S&_D< ztMjs%oQ1EKvyf;EbHT|itp$(fPCm!)d)TXTpC(u3BIUTL>HFMe7^Yi`v z{r~^}000000000000000A^8LV00000A^!_WZDD6+O<`wgV`~m)VQp<;JuogbH8eFe zH2^FC0000$06+i$1paWzNvpj$>&?6WU?`4cXBbJTh6yno$|`dO02IiqU&deqhMiE- z`T+=s;jR!c-juUL(>Vx2O9+C~7C>G{2}5AIEqq12t?_mKWXWm)A=lOURG1SJ+JX&@B{6hsW{t)7wE@Z-{vf?%$co^nxC=a09%7p#puqV-D+Y~Ro> zNcy7+qbyDYG>-g`OX5k+wv@UBNDhLjy+n!PJBeG(J(J*G9Yr}fg*2n)7`ISha~zAy z{XT-eyj-#}LaXCZg9P_-BA;Eq{+@v!nX%+K#Fm?WLpRgyH@u-9A1)5>_4DiBzaatu EJ3|fq{r~^~ literal 0 HcmV?d00001 diff --git a/glyphs/stax_ethergem_64px.gif b/glyphs/stax_ethergem_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..8bdb8e5f1ec0b86a9428a51c65c313be0066a58d GIT binary patch literal 649 zcmV;40(SjJNk%w1VL$*t0P_m~000051qBNW3l|p`FE1}$U0tD}q0rFK=;-M4^Yi-p z`v3p`000000000000000A^8LV00000A^!_WZDD6+O<`wgV`~m)VQp<;JuogbH8eFe zH2^FC0000$06+i$1paWzNvpj$>&?6WU?`4cXB1^BA_Re`uo(nKY-33=yLUew0RVvJ z>mdq4VIiR?#twrdKyXMnVMr;U(7cwQTEO7oE$PAmR5_$L5W>Ro8k8^yg7Dhh!-6LX zWP2P2eo}gZ83}KNLp+EWc8o(rj~7{zTQ8Lqk(gqKn+lgw1W{p2U5{<1QdERtV^*6w zctU9k2&}egn+srC0(zsi1DcO#S_HDWaB7HdwYD`0R>MMoh;?v01_pHkd5C>sHMu;< zq{eHnTEza9tcmI9L*|kNXO<|+w}2VQA}I~^j6&&^ zJDGB7{=?Z&!nl4$w?Ud zdIQKM*%zEMp>!J>K}pi2H?vkk(}_tbX{=NQ)Mhr>+E-G};Dwn$Ict~qR2Ay0hA1t+ zD>=q}=p(7Ad!{ED;JiRZ?!6>vkJF7I`0x(rF~Y9u8>3*J!z(b2W&jt#;rn?<;|x88 jCJSjAag%=-fF>G&861(%T?kgd0&fjQDB*-7L;wIgPPPkV literal 0 HcmV?d00001 diff --git a/glyphs/stax_ethersocial_64px.gif b/glyphs/stax_ethersocial_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..530fe5540540b088b73693cb7c31e7551050b6dd GIT binary patch literal 265 zcmV+k0rvh!Nk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0^p2~smtvT zqnxzbi}M5==pS{W2bRj%nW}+`tJ$V67;|&bQZ)(hc9<*qVh`eH=qt*O$mH$R+&!VS zMR0nkLY7#Zv0KrCb=UEx3=^Ve+zVR$%dB5>OuaXf=h=6%i@#^lr!oi>NLQ%z_mt?+ z2-jv9x$?+R$+UQu2{@_PiTBy?1{x}QNO`KcNy-y;>6WTmDi|x<%8GdlIjhLYyXE_9 zmNhzT`DN@`3n;ma80!QUB{eoJrm>n}{ia2&Hd@jCDtnO~r9?vpQ PUmtg`zt7))Pyhfs4>Nv* literal 0 HcmV?d00001 diff --git a/glyphs/stax_expanse_64px.gif b/glyphs/stax_expanse_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..61698c8d992cc6ab048bd744e5c12d6c7c4d0d5b GIT binary patch literal 384 zcmV-`0e}8SNk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0{@JUsmtvT zqnxzbi?iMh0ON7u;)Ox^jUsBYsd~As3|I0@*U(*p{Hsg+dZ!^!XCx*~u%*&@)If1g z&h&Z3Tv5Jl)Zyh8!(WEiyp6o3JLsY8LnIX}p-~PW19^7-`-aCvQuim;b$2M}0+yp! z=r_m&*fANGNErB`SQ*LrX!vtJkYb<-Km#2&6*;kqSPz>3O>8!S#9gS=qOf?JcJZ<`j3u^9)K32P)OkF)q zDE%%!T>hLQ34DxOqIR0-2{gFRpCElFXuVp9aLv4jhAQ&Qvo=MNZ)`BNFre ec2Nngt4fm`G_2GPagCwytJtw*%bG1)0029>D6{ea literal 0 HcmV?d00001 diff --git a/glyphs/stax_flare_64px.gif b/glyphs/stax_flare_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..c834fcb363058f7c76e13e79df68f7a72d437211 GIT binary patch literal 199 zcmZ?wbhEHbbYO5`XkY+=|Ns9h{$v3&bwDIYhJk5bPyfo(Z}}I`*>bCU^RflM`P&|O zR0Vb})B3UIowd~mAM-DNjee}t`{RF!v0YyNqlOJr?y31}c4j+fPsq$`KAW}u&bsg1 zeBH;Nd^*N;W0CKT(vNS_(jVpX?9JPGTL0I%J?j}IDz3Xt7hRr~y6wb`7e6>8H7z}V yZVB%cXsK-2Bzd8k)9YoBr`4{Yt|~37lecC)y7}^_r19y_^x3O-M+Y)6SOWl7=3KD= literal 0 HcmV?d00001 diff --git a/glyphs/stax_flare_coston_64px.gif b/glyphs/stax_flare_coston_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..28822f300826df7ad0299283f7dbf5f6c4783baa GIT binary patch literal 210 zcmZ?wbhEHbbYO5`XkY+=|Ns9h{$v3&bwDIYhJk5iPyfo(Z}}I`*>cOe@!p=_{B6-H z)1KY5eQ~PEkNdc<&t{+A`QGQ+%lV(YX*wdm(cJn|oY$OHn#~TmGgf`=I-9lq&bsg1 zeBHQJ}l`VFQdnO~#g2)`6 IKn4bD09!>|hX4Qo literal 0 HcmV?d00001 diff --git a/glyphs/stax_gochain_64px.gif b/glyphs/stax_gochain_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..aec56d0059144ada416edb971a963784ba33596d GIT binary patch literal 314 zcmV-A0mc4DNk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0{@JUsmtvT zqnxzbiy_#2=dX352bRZ(0_M~y>AN~(^4777BK3ZsxxRz-Qn=tRMhqE;qRR5tvOIeq zo|Hp1*eJ8?Hj<=%AK^wXc$96#(%*KKJAW6Dw*pugcVU zlHu4`6{%>ZhgauxDAO<|8y27s>~Ex>^c}${KogI4T#*WxH5wE3pek`MB5V zO8G}C>u70woR}=E2CQ4yoa+fqDqXA`Of5P%%^huhofQVy?er8o6%8t4CD+SZ{LY#|8-JSD1x(QX<#( zH;6NL^x}4P#$tI%;Uxsnm6@pXiPt#_SxN``7}w`h`PRr9I+V9Wcq+77HHquW>su>} z8Y_A$n|j5X(&(xkE+DN))Yxf13zm%vy`t5-3@E=@dp`t(@<06Quoo{Ing literal 0 HcmV?d00001 diff --git a/glyphs/stax_hpb_64px.gif b/glyphs/stax_hpb_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..392151ae65ae6ccac05e8b2f7a1a7b7fb1af18d8 GIT binary patch literal 354 zcmV-o0iFIwNk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0{@JUsmtvT zqnxzbizV2((+zUoxP+!ij^~x;G%Ov@Er+ZP_{86WcnUJTv=)B*xZIg?9?RKSkT z9kfa%4q2b;DKRx@Bi^xCYkri?;jntm=H?vAHwx`;;AYWnb*`6o)`t-D<;O*rIM`EE z_?K6Nl|@L_2q;;J7-V@D$rQB6CxV#?c4%?=$#goIN-F61h-yXYsv-Kyc-winv}3D@ zi~5_o+jxWbL_11cY{mSnD9735S}oNk+*`TbN{wxY%m^_zKCH?6?R#E+%M1!mC_Q@~ zyAC;C&AW=Piq$Sqzk2MPg*$eSV7^Ik5-N<6r=hxd|Ds7e=&x9$i#f>(ifV|#AiPaL zmcd$8Cq*A46ul)WDdZK*nCPz16bI$zw3Iq=I_&u{AkdvIhfXt!G^x_15()qSJG1em AXaE2J literal 0 HcmV?d00001 diff --git a/glyphs/stax_id4good_64px.gif b/glyphs/stax_id4good_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..6d04b228f32bf20aec3c73f805907ced6b68b4c2 GIT binary patch literal 339 zcmV-Z0j&NqLtnW%1dKeZ1i&?@1mf&%@@ly8HKqS7+xDc;`cSXsDM5 zrq~Dxz_&0r*+wblc)8csw^q0js=*@3>6jU+*=bq18J4<;BTGsNH;9}?H!KJ{F$!aZA`xYylLJ( z-&<`z4Xujp&-Q8`y?pWn;_G)U;UH%LVTTX}-dP+z<3PCy&4h`R-k$OSSv={bwj z=kh0|0jpNuqsh#MyG90h>?M+iT(SE4UYFzUL)|WChKAP`1mDY_M|qdbgR!d!-BXeivKNMih~b!KCuT^f@89 zT65YM!gSIFP4?ZQt_m^P)!bTF=`%X2L0ZScu^NLE&tv-e!Tcq0=hs&U80dvarN*Uq zsCeRraOL=TxPxeCS$OkkxG9Hewg-y!M*|v4RFx{3gxYHAC-iA4o1nRQ`$t>rxr>_$ z94tIcYHNJ_Yuws(8=I^Q7;WeaIovZy4XeGK>zo|s8qQTm&DIMZ{c@gF)lQr~j@@_) hKdagfdtbK1->>dooPQYzt}y5Yp~8g>8wMx<06TLhgWLcB literal 0 HcmV?d00001 diff --git a/glyphs/stax_meter_64px.gif b/glyphs/stax_meter_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..ee0804bc30603bd4c996b7d13b0f72b1cbcd0840 GIT binary patch literal 311 zcmV-70m%MGNk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0{@JUsmtvT zqnxzbi?iOm`wxcV1C(YtYUjG96brYm6W8*L*!u12j6bqTgrFG4=s_M~9cGiYaVDV| zYLQp5hO`sz78?PJ#H150;H8nRK2i79nJ=u0{X zIZ75RjQe=ZD%yv9`ApNid|Y~VMnq}wTo>Sj>HClQrIX%7B2di)47q{xvZ JOGYRF06Wl0kI4W4 literal 0 HcmV?d00001 diff --git a/glyphs/stax_mix_64px.gif b/glyphs/stax_mix_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..e3a3e570ad3c921a664050a521a2523d3e2d32d1 GIT binary patch literal 246 zcmVe`O48GG|q+c%eIJKwwff|w!kV?0iNK&2+>BtfH( zDb;biQeIjlt_u!}$K*1Z$)uv!&D>5p>%E`xSh{NU0onY0TS(*5S7!jzK{!Z5sE5dR zFn5@T2g#V#CrDW|ba@x~#woeA>DXBr2bu}^NgBE|%7&RGGItrPg3<_E$i;H|==d9m w`xU&FLTsl{i||LZ9QF(r-8D^ZY=&l5%&Wc2-R&(59y`8(T#lZuo?ZX|J779*+W-In literal 0 HcmV?d00001 diff --git a/glyphs/stax_moonbeam_64px.gif b/glyphs/stax_moonbeam_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..e8485ee55ffc61d4337921b524d9f77985dd4c17 GIT binary patch literal 212 zcmZ?wbhEHbbYO5`XkY+=|Ns9h{$v3&bwDIYhJk5yPyfo(Z}}I`*>bCU^SwR4`P-CO zr=(eCJ>RuVg?s)x;p=bL+}PEr{G0y;YlDN#LU8gx$t8`Bajh32i?Guwz L)6)~fz+epk(Cc4E literal 0 HcmV?d00001 diff --git a/glyphs/stax_moonriver_64px.gif b/glyphs/stax_moonriver_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..1809857093c45d6200884392edab68983cc8e68f GIT binary patch literal 294 zcmV+>0ondXNk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0{x7SsmtvT zqnxzbi?iMe_zwcyXoMz6X6K5g6AQO)6W8*L*t&=3``!!uhPa_|W+bMPM-o%Xc{Vpv zsH$qcV6&F(Pvhmj!axkUtUcSVH^!DN8b8?ymXCS8!w&N(S}4{PvS6aO=l2mYXqf2K zD91CF7ReU}NZ97~NU>RBNm;ju+38nlTKQG#d3qUIv-BCu+Hq1OyNcTyq{&L@Yv}+= zb*uY3>jT?MY@90$whXO&{4AXtT0O#C42;~&P3=7$Zas|cJidz_Oq_lVq21p703T1z sYaf43E8ec}u3Hb^K7r}{$qP6TVIGAG8K!Y)<{QL`6f0W1NTC1#JBk#CcmMzZ literal 0 HcmV?d00001 diff --git a/glyphs/stax_multivac_64px.gif b/glyphs/stax_multivac_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..e3ea7165790776989fd95665d64493c43d73c7f7 GIT binary patch literal 349 zcmV-j0iym#Nk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0{@JUsmtvT zqnxzbi?iN*1JH%Xr+lEunWcH67Tb=nTfwnmlk}6{L9g2-fIgy+W?UtA#-OZu%s`#E zY4l}PPE*$6>_@~bZCdA2at5=?-d-eKT@Sx=w*wwm)%9%ZKG#6@cctcs5OzoR#K&N` z2*{(D=lF&QA$TY`VOc4c>A4An1v*LC$4G(sX!;3xp<3GMDy9j0N+}abT1bgE7+9;x zYkRw3ODw8u_seW7+&bI58hM!vyi1&ForwJ`o9*1ai?&@Yj{5C=jSe0j9eR!n-LC9M zKddf)td5Tk&CSl6uT_rrjT=bNpTU6T8Z}&KhLgEv!`PJKw+<4-CNx~K43a3t`LGQ)~HI}qCCm2@+ZpD& zi#tqw3w(?mY+Nc_%lz!z3q38Z!+Tvfach;dsgn1ytlHx6)%tT y{cC^UoR5yrAGq%yxoQFdMk{Dd4#I?&76$O=5aPmO4h{OLh%uwajRO%10028+i;Q&u literal 0 HcmV?d00001 diff --git a/glyphs/stax_oasys_64px.gif b/glyphs/stax_oasys_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..81c0e5fe8f52314723512828491bd32eb99c4c8e GIT binary patch literal 340 zcmV-a0jvH;Nk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0{@JUsmtvT zqnxzbi?iOm`wxcVNS5Y_rs~SJt_8&MJiiEy=W(m|{i&k_Lpa7zQS2lazQz(mbNF`7 z+9fKTQme9xl?e!FYg=Sj@=ct_>+f1^ z%T;TOAFqFXUSbCU^SwRI{B24Z zy~|$A(F$0X_Np&e=8#F`-O|O6L;i1kndU4vp+Z=#*gcuwGuUmWfBMJkDGZTUUMF$) zdLF&I)XbVO`fTPFr{1;mp5|Jy-{aiy*&Dj vmP}30%oxu(**|!4c+T#bv!iM4qUpJ-CBl8H-`-uDS=Tpj-M)Qs3=Gx)K^Sn< literal 0 HcmV?d00001 diff --git a/glyphs/stax_pirl_64px.gif b/glyphs/stax_pirl_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..7c97331644305038bf18cf5fa28cd0b08bdf2ab9 GIT binary patch literal 293 zcmV+=0owjYNk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0{o1RsmtvT zqnxzbiyzoK`^kmh*n}pD9_E^o>)U$o9AEQYQ}>=n``>c_fk6c^a4aHuh-A-cfVQMj zW{s+{rm#)zh?@X|yxC3{_o1@RG#T0mW5+RX_`F)Lkn#6re*EXxRyL@&=Oo4;g}BES zcIbt*M%c&Kw|EJe2eqkLC^$)ZA{Qz;YHCJ$YFWy<3d*s-7&sfN80ndrdfQ3c2vJ)J z`wIAp8R&!iiMngp+sf?rEFz0stZQqxY*EX*ZS$)woROI5{LS3F^=nR-3mp>-e`VF~ r!efu}6JE4Gu9WT{z<|^SYS?E`LcW345_-$#@LI%)6f0U(Pyhfs8=H;3 literal 0 HcmV?d00001 diff --git a/glyphs/stax_poa_64px.gif b/glyphs/stax_poa_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..d857c17816569a9a3505ceb20012d250b68834f1 GIT binary patch literal 299 zcmV+`0o49SNk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0{@JUsmtvT zqnxzbn}FV2zYYRl$SGv$oZG0Hs+hj)>9(=myfC8Aq#vr$Zo`}`b2Q=@J>+uHR2C0W zX43i$RH0XHb}Rf5#k_7fI7VZ<)3w{#e#^mfH@%Lz<1P9SI;uuRdg?KW3d*^v+3IQu8@s7WD{I>Ul!&OCiy}pa z^=bBdIV@}dxGY+X8E2gOoIERyT&nDBniajX4Lyxr?VZgX&KoSwZ2nEX4&JV=T?fXP x*UV0j53m0&?6WU?`4cX`X1Rt}MA6MS-*}QV0Mr6bX$cg+Xoz zAQ%?D(ZWC=Is=3QGTB)m2mz-SAdpct*5G!mGxWZa1u|g}YO~~=QGsS84$ZNkTZjh= zQd2ZGeo;tFaXV)%33+346hMw!1wIEjTZ$Mqm|K=`L|rprcy3OgPEm9nY?C=9f))p$ z009Rg23oMO6thIOB7LVKFEM5ev6sKMA-TgIYMeO&hP|D&%plH09}7UHL!xR7zC*yx zx~zD#P6N#4Ip^KmLmb7|W0mBz^3e3J8l=S;Vn6~sY#`M91AxI>n}M|S9qd={IA@YqfpKjR6ofUnwziOh0ES!4&%Os-Bmf&eRFn~ViLGluf= zH0{m}EaQbGvg1Y^uXTwW3Bi`ZKX$2(VZf*MD^^w)Hg&43gfDqzv7=jJqiD=@9 PD5j|5iY&HRLIeOitdJaz literal 0 HcmV?d00001 diff --git a/glyphs/stax_reosc_64px.gif b/glyphs/stax_reosc_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa727e3705f59ab67f1e38145f2453dd9c3e4ee0 GIT binary patch literal 314 zcmV-A0mc4DNk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0{@JUsmtvT zqnxzbi?iPRfDZ!Qh=k@xcITRE>)T%M99J`3OE;ZEJ8t<2hbJ5HNTeW_!U^+v(?O?2 zU)8mghE!SWc7)WTNZ|$5_@N266;B9(Hru@-!(J+R$~>2eYTLMt#=+gZ`5I=Yv+_DT|33297b6H5SjZtK_%>$- z2Q&oMr4X5uh!93uX?b}drMW4xB{_&GW@1?C8Mnt8km}kRTQw^?N_(rQm*C^LOPUMW y`#St}_O+Uc46L+l`sw^^6wT{IT`hDC`m4>{*_~XgZ3rG-?htyezRn&{0028G)^Pd& literal 0 HcmV?d00001 diff --git a/glyphs/stax_rsk_64px.gif b/glyphs/stax_rsk_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..5e25ff6b25ebf143f3cbb079044138eae930e619 GIT binary patch literal 295 zcmV+?0oeXWNk%w1VL$*t0Du4h0|Nv9|NkNR1ONa4001li0000$06+i$0{)DTsmtvT zqnxzbiy_z``^kmfM=IhumL!U*D=WGl+{zby+BY8R7T@zxfE?i=xFBvC$O?-=gw`ZH z6VOVFL=#o+^|8gql3%9Myp)E?>)#n&-nG5+;aeSd*N=C3UW@|=7YNp8@I?2=ro_l- z*9ZxN(ZmP2Xmn_ZIY_u!xaW!B80s)eiq~aCnV2Q$x0;#CS_IN5YFjC(p%{P&s9VY# zo3hx-X)JaOT#V}#4BD%C`z#y{orcAro@?k{ tiw(Xkj%j+DZ|`rNxq#=s5iF>UAT)mq874ePj~2vT_$FGsh*3xZ06WCphI9Y` literal 0 HcmV?d00001 diff --git a/glyphs/stax_rsk_testnet_64px.gif b/glyphs/stax_rsk_testnet_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..5e25ff6b25ebf143f3cbb079044138eae930e619 GIT binary patch literal 295 zcmV+?0oeXWNk%w1VL$*t0Du4h0|Nv9|NkNR1ONa4001li0000$06+i$0{)DTsmtvT zqnxzbiy_z``^kmfM=IhumL!U*D=WGl+{zby+BY8R7T@zxfE?i=xFBvC$O?-=gw`ZH z6VOVFL=#o+^|8gql3%9Myp)E?>)#n&-nG5+;aeSd*N=C3UW@|=7YNp8@I?2=ro_l- z*9ZxN(ZmP2Xmn_ZIY_u!xaW!B80s)eiq~aCnV2Q$x0;#CS_IN5YFjC(p%{P&s9VY# zo3hx-X)JaOT#V}#4BD%C`z#y{orcAro@?k{ tiw(Xkj%j+DZ|`rNxq#=s5iF>UAT)mq874ePj~2vT_$FGsh*3xZ06WCphI9Y` literal 0 HcmV?d00001 diff --git a/glyphs/stax_shiden_64px.gif b/glyphs/stax_shiden_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..6bbe136ca827218571a37244bd76013119183912 GIT binary patch literal 342 zcmV-c0jd5+Nk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0{@JUsmtvT zqnxzbi}L}T>;H732bRGonkq_eqe`&~+rkZ+(6)rTGSb=QUcS`OC_E9BOJ*;*d>VAg zVzKtC0)tbe6ENfMjLqg3EF_D+TPaM9?ylWwk~nIva_@YvR?g&e7568oWXM(+2G+9Y zr|8lpDMtu7bcpF>dBfO=IJ4=2W>>RNsU?cJb_3bidCID2HwiH+Yg_6t3OmM_S-a61 z%;TF|H#L#^tA`vhyUa}NN&ClpBsnb`LW*o0ZR&dH9mVMEs-3_mDz*Yg|m`Z2Nue?XFAnDFV8r`FNb@7(zAi*X06eoIr-C`@3wD!*{;XeC+PP_2zV$+6sDFo zNk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0@93+smtvT zqnxzbTLIo2XbxsxNJidQrpk$`F59{(EWdPJ!Xr-VJHPS$fEMA9NHHFf5ap8Da6X|6 zX^dL6Vjb4&79llwzfSR(Yz&;DnzJgcUME;;rqC?MuibB5oaSR@cN6%xH)SK2=9fpL z2uJq^wG$Q@H>n3XgecS1cEva2DfY#-SenUTi5iBQ)#duBqng#dV5S=nEf3MEFSLM?QLDWoz33v{@zdk06Qvq BaxDM= literal 0 HcmV?d00001 diff --git a/glyphs/stax_tecracoin_64px.gif b/glyphs/stax_tecracoin_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..4fa9b491c6378acf04dc51ad07d02685718cf33f GIT binary patch literal 389 zcmV;00eb#NNk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0{@JUsmtvT zqnxzbiyzp$=Z|noM{b~1nqf+wRhqD^JF4q!$T(fr-l6-sWIkIUD53#-HzU%hgf*Kw zWsI3iW|0@^Re02fxs+fLFkOz24GgZjEzTVLdr5qoUS4{R?C8Ee zT#W6V-`y@v4sY*KKW5GLakDm%ptDW!5E^tNN+u_UOZl=U#a$D0vU>=U+Qpba^Q;tk@xxG$JB)f^iOq_} jpW~WF!2%VUR6tY-Z7tc=>Q@Qz#+p5gHmzC*1poj$^j)-} literal 0 HcmV?d00001 diff --git a/glyphs/stax_tecratestnet_64px.gif b/glyphs/stax_tecratestnet_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..4fa9b491c6378acf04dc51ad07d02685718cf33f GIT binary patch literal 389 zcmV;00eb#NNk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0{@JUsmtvT zqnxzbiyzp$=Z|noM{b~1nqf+wRhqD^JF4q!$T(fr-l6-sWIkIUD53#-HzU%hgf*Kw zWsI3iW|0@^Re02fxs+fLFkOz24GgZjEzTVLdr5qoUS4{R?C8Ee zT#W6V-`y@v4sY*KKW5GLakDm%ptDW!5E^tNN+u_UOZl=U#a$D0vU>=U+Qpba^Q;tk@xxG$JB)f^iOq_} jpW~WF!2%VUR6tY-Z7tc=>Q@Qz#+p5gHmzC*1poj$^j)-} literal 0 HcmV?d00001 diff --git a/glyphs/stax_thundercore_64px.gif b/glyphs/stax_thundercore_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..76134be81064b2c2a45fdcc2d6e9c78f10d5c796 GIT binary patch literal 287 zcmV+)0pR{eNk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0``oLsmtvT zqnxzbix=2@=kIhP0G7yznkAa58OypDJkBm%U*3v$GY9I4en6s-q{~%~zNAvZ+*xpw zsB}qo|J3%-LMlaF%Qg$`*Y33mwZmjos<2;f+fEEe-*gE*p*h<{K{ER}C9q lZKCbP{b6mkFH=q)z<5svwu5KTP{JSx7dm_hF`~o*06PM)gmnM_ literal 0 HcmV?d00001 diff --git a/glyphs/stax_tobalaba_64px.gif b/glyphs/stax_tobalaba_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..0125e6b45ca7127e161ad0fb4534a92b15b2e45a GIT binary patch literal 228 zcmVg}tsmtvTqnxxZ0Ic2# z^KW4uNJ3&(rp&3f$T_+yjLIo(-*laGJKqcag1#S+C@~(959N~Ca6X|5Db-}XI;1ge zl{@2#$Kx;gjD}s(Y;v>>S7PJzskzRs;PaZjyXYrJ5@^&ysOEBL2SP~X2USNE2|4MA z$Fzr;85C%_+0&SF2r3p(CJJV7nwa&H$||@PYd9-gNPF8bC!|HPlByR8@5 zyPi2sdoHy^OM938nUltEZ&sw&S6}=5w`i|oVEP)Ce9z;XJS&}4FKI5xDrMVzT{nC; zPj~RfjgryUt7DgMo!wcvIU`c6%i+XJUziWQ#I4o zGL^G6^TpJ#5*6V^D-UwINTvSbT&1!~Anl=47pJuM%yc8RW3#MpCzXq@_{HthX6$2> aGKXc(PV=AJD%xf&(2mWmog2WwU=09wjbhdS literal 0 HcmV?d00001 diff --git a/glyphs/stax_ubiq_64px.gif b/glyphs/stax_ubiq_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..740b7e99c57956e11ed210ecb6266fcf7e96a535 GIT binary patch literal 295 zcmV+?0oeXWNk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0{)DTsmtvT zqnxzbizmq3g5QPEM~bFGrstZrtJuab7uWMu=Qox2d(;d59KqsnQA{R4x1@7fIyt9M z6>O?R=sMW!L73?pwPTOiNA_yY+b@>Kwx!>|xNNQ-*`coX27HexKSlX82E6= z&=zoK$VSAsDA`DvSs3ZJNvGF`SxJTSRF}6_Itj^13i^p@_1Y!TYKdfLiwh|#w#zvv z2)OGzd+AuQicG9}I^4|q%)IwE-Fb*;EsULP#+~h|?AaY1rbw-ObzEL8#n`Sn<7$4C tzHASTpRZrWkFxKdF?Iq0k}H@C9l{0*7cwO1@S(PdKqy+gi1A1P06RW-j8Xsq literal 0 HcmV?d00001 diff --git a/glyphs/stax_volta_64px.gif b/glyphs/stax_volta_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..83cfb91c4d5a5b4af72863717e74e00a8edb5940 GIT binary patch literal 339 zcmV-Z0j&NwB2lwg;fgjB9=m{c`%3fmFjJ2dj zTdfquR!1P}&ew%q!C@T5{4_npCv*c4;=2fWp zhIk0LNEqN($s^(B=afmg$qAte`3M>}N?CUldODh_YU*f!>MAsulvvbQ8VN_*t9xUc zOFJAG3>$mds<6xKIqNG4{3~mzY&cC_y}T_gTucn!Z5^#Wev8X(oE)yxE{@C|&WnC# zUH|Srf&E9XHU@2qx^MCX;+sQmojH5_3=UKnFx$gxjP||Cm(bagB`N?nLizH~4p!(d54~t5mLJ*-7M!j+jEEuwpZ(&Ye7a`qWtf06P!Bo_PQO literal 0 HcmV?d00001 diff --git a/glyphs/stax_wanchain_64px.gif b/glyphs/stax_wanchain_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..27a5582dae3ffb94e94341e876fbd341a86e610e GIT binary patch literal 313 zcmV-90mlAENk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0{@JUsmtvT zqnxzbiy_z``^kmfM=IhumL!U*9t)?g6xZ_1*hY;veDdq-U_w`t`rgtegDJep^$$94kquJ?Mswjne3cBZLlj*t|mH0|q`Sv;V=T$iSNd$bW zdx{j)D_V!ebF5k$8S9McJ5_L literal 0 HcmV?d00001 diff --git a/glyphs/stax_webchain_64px.gif b/glyphs/stax_webchain_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..585832f1d5300bdbc6f36ad321190d23f89788da GIT binary patch literal 217 zcmZ?wbhEHbbYO5`XkY+=|Ns9h{$v3&bwDIYhJk5APyfo(Z}}I`*>bCU^SwR4`P&|O zOncV3?A57l@3>bV@VVZQ`P?V(vCZ8djP8eKF0N1(llKUmypzXvq0@yazc#xmhx>}3 z{#Sv~YR}jsznzen z`R(G184~KDGc{MbO3r$6MRVs$l~^XBsCXj)_8URV^V>|!= literal 0 HcmV?d00001 diff --git a/glyphs/stax_wethio_64px.gif b/glyphs/stax_wethio_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..8a66b1209e177a7510e58c8cff09142b28b5e4c1 GIT binary patch literal 305 zcmV-10nYwMNk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0{@JUsmtvT zqnxzbi?iOm`_BR5NS5XaF6YXcDbmLAYsfbG-g=queu~2cL$1wGbG#&#MIsN`>?|i! zVYE`sWF1?sNYPbYDNooK5*CxdXKxvM_^Q{EH1zGJ)8g%f-Pp&6w->PW=cLCrhz7V= z7%0}5C^(4*AT@RE)61w|V#Z=&0ys>6q3z=lV+O3ES}5GAkQmdu%af{FYnSb{$n7A>N!`s%_2uuD*1* z4ez7PS)Q*x|Lsi2o_;n65xiya;0i+C6apOR@Y#om{(2~6h%uwajR+h&di)47LjeFg DCiRrF literal 0 HcmV?d00001 diff --git a/glyphs/stax_xdcnetwork_64px.gif b/glyphs/stax_xdcnetwork_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..b990ab31e5b34b9611909f8753f1b916761b45b4 GIT binary patch literal 287 zcmV+)0pR{eNk%w1VL$*t0Du4h00030|NkNR1ONa4001li0000$06+i$0``oLsmtvT zqnxzbi?iOmgAay4w}@tArXv}sXX(CLEGx7)-{7O~SO19sF+)j_ay0gkOH0!6oJ1K@ zr4CY+HmTd(753#+v(B#JxY{JqX?2s`_TJ80p9fgC-|?{nj@81a;`hfQI7k-)n0Oe( zsAt%ihPW6gNSIRj2v@Vnhe=uaxmoCW2wDo*h^i;eoyaQJb3;Rywh}0lfs1z8#;UlF(QKk06Tm8g$w`y literal 0 HcmV?d00001 diff --git a/icons/stax_app_akroma.gif b/icons/stax_app_akroma.gif new file mode 100644 index 0000000000000000000000000000000000000000..79768660eeaa88b42abb02d4fa9b6ba07c1dad4c GIT binary patch literal 467 zcmZ?wbhEHbRA5kG_{;zT+}zv}5)wK(IspLzMMXsm7A!b_{`~Xj&%b>6^6S^H|NsAk zRY3{GpDbXO;(u<>+{E-$-^BFH{!Rhob@vDbJZq>^hXbLg|@KSi#w@=rz^8^ap*GJab@?) z=lcn@uo#<7;bONc5v#V2;m)6!&lJc{VCUjGk;>_6naDg(a$#(xr%3f#hNq&NJA~d;G8<|L&t_oJ z6zwkK{^kDRlZ#bsfWlH=RoQ?n4h2D*Vngx{rZa+FTQy3;`8UvzkdDt|NlP& zDp35%0v1sG&+VC;n4apJn4X!O&6l2-o118Bpl4zVf($w!H6R-pSpEf^^jy97hLlpn z_eKW^&oI>tMHWRz5d*^w&5bjJig+9xWM(vGVSvP*FQxA4(Wmqv!_uN}Wg?$QM*LFr3na1!jF}boavs7d=1~j&daN1PcusSkM z;Y;se@S8&OAZL|$o@;Y2esQB4N=4b4B zs~fntEi9mhaq)o$(UL`T4;BUAY!_g)irON<$Y2csy#$Tp literal 0 HcmV?d00001 diff --git a/icons/stax_app_artis_sigma1.gif b/icons/stax_app_artis_sigma1.gif new file mode 100644 index 0000000000000000000000000000000000000000..8d769dba2e03f9d7b93357880d350be36a7087db GIT binary patch literal 476 zcmZ?wbhEHbRA5kG_{_k-&dx3-CT3`8=_*ib9On$M@Br)?r5& z;k1gSak6@MWlQ5>Cp#NwHkC;MXQho(h3^D92Piz_oMW}@>dFFzV>4whvza(IEa{oZ z8_n`SAtgaVm`VNAnuizK7#7TV-e%A_^KqAiuwKH47mWVQPI)m6b4<)dRxK4&%zAd? L^!E2{91PX~1*WFZ literal 0 HcmV?d00001 diff --git a/icons/stax_app_artis_tau1.gif b/icons/stax_app_artis_tau1.gif new file mode 100644 index 0000000000000000000000000000000000000000..555be4a6d6e3344f9acff781dca0e1278889b014 GIT binary patch literal 481 zcmZ?wbhEHbRA5kG_{_k-&dx3-CT3)0C3pPxT*;=~ObHe9%H;pNMhU%q_#_3PLF z|Nj|~fZ|UUFi-J6w`Xo*da7??dS-GqUwUG0ZlbM$o{1?4GU$NRfNWr3`B!k#bM;<} z;H6vEdo?K>PZT-&F|eah?1%w}Bg35o4Qsj+@0&IzI0)RyU^wJu$iNcB?&4G^!NS7I zaxn6T%(@1>=MF0b1?DmZEY*}=bFpcrt|QADCe3Ho5g#&{**G~xIGu}Fg2nT=Ioz1o zth*Vb{Kfm2xj1~&CAsV-hOvniMf$R~2+1g}tYh?IcghfMV+!@}N-^5Kn7fU+#m-9D z&UKn_s!2F=tWc^3o151@U(>z9YMjQ+B3XX-8HMcpu8Z!Mz3Z=*Rm<%=LGrmM8^hkz z9J9`k&dMTR7MI=9y)kKVOl!)vj;qlNp3O2-U=CSu*v$EUlmFKziOeC&-K@Ta(*G`I zKYM>}w)P5}KeH8AHqCOm$hB>g!~2^@oX$&~+&MXEnT7fky@CRf2Hw3=Hp-ci4I}^R#MGVufFf1xPswU&nDxer};3(rJNj?Yd Qi~bt@`x}^(I~W+O0pgLa*8l(j literal 0 HcmV?d00001 diff --git a/icons/stax_app_astar.gif b/icons/stax_app_astar.gif new file mode 100644 index 0000000000000000000000000000000000000000..458e51910ca56b5b16ccce377e11bd4e9e4ac815 GIT binary patch literal 506 zcmZ?wbhEHbRA5kG_{;zTtgNg&JUn7zV!FDzp`oD#1qF*1ExLH|;`8UvzkK=f|Nnom zDk!1&lLgFD{Lk%~o0y*Jo0y)NoXwY>n46nuYoKRh3W5weAT=Nx7+C%lob+71_r|i| z4u%E?5%x)`9gZvsx7nO4gHCPSr7uv!P^huFrIGbfV*<;e2dN$@Lag%+Bs@4O(7q;- zQ%j{m^r*lSZ-EmW3ljnkR5`I3Jatf+@nVoCCnAMtX)r8p; z429AZ>}%Z^8oAkHW^hkqEEMAKW>V#d2%Ik5#=z`1*OeoI!-bidDLa4mHfEhUZHz2j z$2itoSok_jV_+4kXX7@F(cL}EDpzQdt&mOQT|JdmG8Sc<6@?fN&U1~4bKqL<)=@2_ zxMIEamkAs;ArU>hwll;Sh17FNR3FWd<7Q-)bK`bwVqav)uwu)DCnu5=qq<~xW)vLr ziH4vHT>;l1w<#+aXX!5UEof<$HRO|L zStQh+*C#0G>0z-l&_Ud%yi%v*VCjSIh|s*g36}&mdPrLeizwVadhYaOE&Y^NHVY2j o5{Z<|`g3t&e+RdGfqw#H*pwM3B*nwN3M~}f^z^i_5(9%Z00D8V?f?J) literal 0 HcmV?d00001 diff --git a/icons/stax_app_atheios.gif b/icons/stax_app_atheios.gif new file mode 100644 index 0000000000000000000000000000000000000000..10a3e3b3b8440791a06fc8684357b1e5595df8a8 GIT binary patch literal 340 zcmZ?wbhEHbRA5kG_{;zTY;0^iJUn7zVtRUd2?+^v=FGWx@#6F6&%b>6^6S^H|NsAk zRY3{GpDbXO;(u<>+{E-$-^BFH^>V!Duz4t0#G2=>3Wv%DpV2NiglWq^}7G}$4 zV5yP{v6`aOYuzvI5zjbRs4;%>RM85@(5Y=|de%mg#a0VN+6|c}C9oF?`8&64i(Bet zD>iY1$+nJ3OiL5<_lNG~XijB0P%&XrqU`3J?%6qcvRs^O2dZA2RC=_P+knY)k<7$T ZOe{jGzw66?t1j;0knz~Cpo4?K8URuvc7p%_ literal 0 HcmV?d00001 diff --git a/icons/stax_app_bsc.gif b/icons/stax_app_bsc.gif new file mode 100644 index 0000000000000000000000000000000000000000..311d31a04c812cb467a1f537081efdbd1b6ef334 GIT binary patch literal 473 zcmZ?wbhEHbRA5kG_{_k-$jHda$tfu*X<}j$7#NtDnK^gv+{>3Qzk2oR%a<>|e*OCY z|33o~Q2faP<|+Q?_RLL8PxVbq&rHtdOHa(rO|&)8Gcg501|5(ZkPQqh{|ZieuHI|0 z-uRefmztluB11!f%;Gi)Ck6Hu2@1JOC0Mw4*bX0H_j#gX;BcTVdXJy?VULL%suioV z7Om0{3t>p}?++3_Cnrxwdo?g?q7qp1#2XQ&u**h|?)L@BrY!wNs z*lDy=gE>l^gMIq)y(e~RmC1{6Xw9;@w9|Dm3v=s~CD+&41ttqEV45U7by;uh9+z2p z8y8M*d&0?_`)cP>voEVRt&=q?+FmE2xov&>rU>sNdz*gql;nlsfSFbn)sEKIj>#lQ0i&n zlw|&tn<%>CSeKxeeAMj&P4gM*E!Vw>WXKCYIr(K@jh7>{@*HLHl4}!~%$+y$t$y|D JssJN{H2`lGtO)=B literal 0 HcmV?d00001 diff --git a/icons/stax_app_bttc.gif b/icons/stax_app_bttc.gif new file mode 100644 index 0000000000000000000000000000000000000000..cc8a3f986bfc9d18f5119c5f62e07c38ea8862f2 GIT binary patch literal 471 zcmZ?wbhEHbRA5kG_{_k-%gd{!rRDGMUtC-~Wy+NG>(`$q>Nz3`gr;P1tYCN$P&%pMwUoXN`_Y`BhGW4ii_<^a+|3Ai z8#p&)kK4r+?uCn4OqhfAR4wW`+7P#;>gdg;!Y&~l8?FO8TtXxyje|0#{hG@1d=0bg zrj!RtJ{pV>)ATNWFniC|6zC|p*3u=rV?&3y)f$bjO2>Fgb!KxgPHS(`t*`j(#=u|= E0L#6tLjV8( literal 0 HcmV?d00001 diff --git a/icons/stax_app_callisto.gif b/icons/stax_app_callisto.gif new file mode 100644 index 0000000000000000000000000000000000000000..890dd9f34687b84bd31d913c3d421193ad5b0335 GIT binary patch literal 404 zcmZ?wbhEHbRA5kG_{;zTJUl#7Qd0W*`tkAcix)4xbm`KQCr>_q{`~9LumAu5gOwl% z#h)x-j^clA&)mfHRNut(%;apo^u*lUL|X$r6H^dm&;h9d*}%Z^FW{u->b=`p0tLJx zDrA`%SXvmn)|7B8(-dgmv`txNzH@u>`U85?oc?HZUN2~0b+gV>c9nw!M+-yK@gKoV zY{yuflC@NL*z&wB7mFk`GjpaM&}42sY3tunm}M^J$i&9(#-SR;W@TubB^t=c$jofQ z#m20~GAY!sq_L_e)l81fs7Q6*G*NaIruFMtggMwkqoyy4uN2K-Z_N~I%=bxHv+sDn zWJIr@5XbBdxx!mnSWUZ~Wjx{xcgwRmwWwGdpS^6g&5d;?SFOfMbyrL2R@097^dL3c zXKM@?OH~pMUp{w!l|WpIZ-w#6>kL+9>uM}Z5+oY<*lMFHToTH4&)ym8~kt5>hSdiCn-*RMZ* z{P_R>KLZRX{$v3&75{U4<|d}6`X;7lCTH`dC+6lR+8XGYn1UdK4oD5i1_qW_6Ha=r z-fOWr^wgyVTO}9+T3)y@IXqZ;Gh)+Q?r5$>NF;#H#0Ie9Zo#)NHYB3;iQc@ zR?Y_;CI#h+86MAlYOwmN-b3bH(ag?UUvV-WOl4aq!Xhj=U4f06!#1RvsYI01xuBBS zu{}7JiBqhqrpJmc*|}|sQ!P)u73*Y?mN}yJ^B0;dPLF96<7}_%jhmd#B^+4%oRMg+!zhT3M%a<=dd-m+hmoGnm z{`~*{KLZRX{$v3&75{U4<|d}6`X;7lCTH`dC+6lR+8XGYn1UdK4oD5i1_qXY6Ha=r z-fQvttkAEMhji|x*L8&`CARW3Do7k}I$>caqthtfek8?_L4uv_;KGa?DPET5g_gHF zCE6W?y)-Q5UUb+L`GK#chbb}EL+;A!AGZuLP9JY*S`uR>!opEk)6CA~P!klzz*6m- z#GD=P8_43#Y>>ss$gagaId9%1>!2VGRu3i?O`+Bl)@73z0#bt7){Ag8<#Gn@sttDY zS{bA(7Q<|ulcB%PZH~mw*xWdOXua=CAemXVx-T4Poofm0%$-Ac9}3SSOWm}bD)a= literal 0 HcmV?d00001 diff --git a/icons/stax_app_dexon.gif b/icons/stax_app_dexon.gif new file mode 100644 index 0000000000000000000000000000000000000000..692537fdd863a5a2ff1d86e050039affd7435c73 GIT binary patch literal 469 zcmZ?wbhEHbRA5kG_{_k-$jHde%`GY_s-vS56&2Op-Mw++#?z-yKY#xG^XJdMe*OCY z|33o~Q2faP<|+Q?_RLL8PxVbq&rHtdOHa(rO|&)8Gcg501|5(ZkPQqh{|ZieuHL&t zZLj938IC1EfdO2J8VXYd4r(bL`Y`q24ZW@;7KZ441_ptM4o8J;(JGCW^B0`Z3COj6 z{nbH7ia+>0XNd#@%Lau42c8+d!HR0EIx6>`H!HsJ%jg%k%a*ryWf3y)*7i(i6XVi% z?c+*tO^#w>w{2|@Wowhxj5F(L6Pn1FEX38r)W_ZGz`zeQgA z8k6|tT!n;}uqd*y2CNk=XWEhU@kO#*ctXm}AI_fxSL=E8e0k-1fM=7~mro^zA)Q^T zc>Hx-xs5NMTA+5fjiKX_%8S)v6FPj7R2>fVmP*Z5c@y&JW%qjDh{6jOg4f3K2r@8O F0{|$Ou0j9+ literal 0 HcmV?d00001 diff --git a/icons/stax_app_ellaism.gif b/icons/stax_app_ellaism.gif new file mode 100644 index 0000000000000000000000000000000000000000..ac5ef850033f80d99d5b3311859c5d2919b80236 GIT binary patch literal 381 zcmZ?wbhEHbRA5kG_{;zTtgNg&JUrs!;-;pio}QkirKO7&ExLaF`pcIuzkK=f^XJe1 z|Nny(f(XT*EMT_ce{Rp*#Pn3(#PrPMY`*lw+}uQ413eQ{5Mi9&XS{I;FzOAkwKNw=R2uQ5lP=fy_?trVGV_0*`(ceQ-CN4Xdlbx9*AurUe zK#VJ`-!!1h#-2;pmMNF3kfUuHN7q#QELV5oE?*W-j;W?_c^fA*MP8n5p`G%NBQl*Xc)#vK^nD!>i=GpAc zx{-fgiJPm_=EUNJq6Z6-QhBE-{GJh!sqE^c8`>=8H}R{p604MHN92?VT*ut3cvS^D RZth6n6v&k?c41(!1^|n^fL8zj literal 0 HcmV?d00001 diff --git a/icons/stax_app_energywebchain.gif b/icons/stax_app_energywebchain.gif new file mode 100644 index 0000000000000000000000000000000000000000..3f8a57438ec4a73847e43d9ab6cda1feb4dbc090 GIT binary patch literal 446 zcmZ?wbhEHbRA5kG_{_rq1gxyATwGitA|iTvdI13eIXO9V=gvKM?%cCy&pv6~F(sT9R z8EbVf8y->MU`~|b+Pe1Yu8J0hGhcKB+>Lg=Efd(9Ah7-M3X!&k0#9LyARVqro^x5} zUF=+VidA9}_c6ztOWF92iEp@LB9g^2*QGGwIvdB4s7~SyrbD z<#%W#wHveYOfY5>>hhk&uECnZP*`fhBE)RE$b_APxnijqN1F+=kTcs9#?6dOm5cUq zEMnYllD^KgQh9Uv9@7=3mMhn+TT&obKHGHGj5r>aX?L5Vm-S!YxVVIkv#aN}(3Uk^ zGng#dcA7LL`_}SsUN(O8M^L~ap{If4M(pecK8HpYjyrQA#5X$hvD{_&GWmnLK$D0c z&liy&Cma}?0ty6H+$d+ixa*^U%l4isj!b+LUd;-gdhQF@a` U^2b#rzdo+x+;H=^AR~h{03Nw=Z2$lO literal 0 HcmV?d00001 diff --git a/icons/stax_app_ethereum.gif b/icons/stax_app_ethereum.gif new file mode 100644 index 0000000000000000000000000000000000000000..81db45cbdbc404688cff27427264219b0cd58961 GIT binary patch literal 309 zcmZ?wbhEHbRA5kG_{_}!1Z-?vbuzxE0kMXJ9z|G0iLJOmSg4J0risi$7WmALf)Sk(go}7F?v@Fn!yz zcek|vHr=^-;D=Mr;l`%dsT?hpmx4c?RbFGCZl&<|~V7JthzHN+D>C*jg;r~U&z50#?U#1Ri}LM+SO^SDr`ng=EW?Lq23(6^^DA{ uYpaukxsOh=J5lUhb|S>c#`L1Fzm4uSp)}k5w=bElzb(W4_<_D4gEatp_-&B@ literal 0 HcmV?d00001 diff --git a/icons/stax_app_ethereum_classic.gif b/icons/stax_app_ethereum_classic.gif new file mode 100644 index 0000000000000000000000000000000000000000..10a661d878d4eadbfcc9c5049ef176a8cf7e0151 GIT binary patch literal 328 zcmZ?wbhEHbRA5kG_{;zTJUl$&;^GDd21!Xtix)4xeEIT=7cahi`SR=6umAu5gOwl% z#h)x-j^clA&)mfHRNut(%;apo^u*lUL|X$r6H^dm&;h9d*}%YZJ>aD0>b(}LL%ROm zFyvs%@MB>RIKe5_C{>Zy#N=!T6y-4}= J-C2;q8UTU8aD)H= literal 0 HcmV?d00001 diff --git a/icons/stax_app_ethergem.gif b/icons/stax_app_ethergem.gif new file mode 100644 index 0000000000000000000000000000000000000000..0ed7b1cf96d69405c44059280c71f4321df214bb GIT binary patch literal 328 zcmZ?wbhEHbRA5kG_{_k-$jHde%`GM-rlX^il$5k^;lc|SF1&pC^2?VmzkdDt|NlP& zDp35%0v1sG&+VC;n4apJn4X!O&6l2-o118Bpl4zVf($w!H6R-pSgr@0^jy8y;&jlK z;~a(x@s^?t7iOwX6jE6&>7*smIcKM)!xJm+wd^}sb#0U$dPoW}GBYztxGZJcdgWDx z#1f{~Cl3y6apLzY@M-&y#mnaOU{~7A#Vk#c8&Xxd*%-||y^UCl85j$r+HGs)I9u45 zl`3ov)EeX2G-R}TJK5AGF)?%H2IkqRX3o=YpBKJJZnD{&8fh&y+dx&;JeE0uCJlLe z)mS4BPGyNLX6~0isjqn2?Bc!-`-#_mIC~i@`+S5rPIkDmrrhIX_q5|E^-4AuZ?{A)b` literal 0 HcmV?d00001 diff --git a/icons/stax_app_ethersocial.gif b/icons/stax_app_ethersocial.gif new file mode 100644 index 0000000000000000000000000000000000000000..e8fc4dd4a5006898ca76cc7088bae47e6494f57a GIT binary patch literal 136 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJh)*r+?+?x9mz4BA$`2dn?aB3A~q@ zdrrbBqIuR#uW9;w&h=>9?Krp5^nUakKSS5R&)TdLy`L_hyyR@(IrR-MTau>UTDvrR jYh&99!>Kp9X0LsjG4-y{#NbbxZ#e8<|FtHXk--`O9IZN1 literal 0 HcmV?d00001 diff --git a/icons/stax_app_expanse.gif b/icons/stax_app_expanse.gif new file mode 100644 index 0000000000000000000000000000000000000000..9dfd8705fe7c68068ba1374085300673ea99d10f GIT binary patch literal 165 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJmT3r+?+?xBQJ0H#AunrfyH)uPAGg z745lb%Hn0Ymv`we*V_Dd=Ho!WZ>w&qmT1eJ@DO}f=N0Vm?2PJsA5CKpZ>@<3A6>8# zk*mD&JZzP&(D}6G7N^wWjNM|Yc||ScsEqig}n&oo|-d{FUyZ3 zPbGbB_~C8uxQ~DGS^i|TUEaFQHWz-qE!q+Mw!=qDa_Z9+D`Q-3FP{vG617}-Zr$`i H1_o;YvHL1C literal 0 HcmV?d00001 diff --git a/icons/stax_app_flare_coston.gif b/icons/stax_app_flare_coston.gif new file mode 100644 index 0000000000000000000000000000000000000000..2f77deea1b355a1db0b99b06c4c069d0a23e4b27 GIT binary patch literal 116 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJneur+?*XHvYwP3@>&oo|-d{FUyZ3 zPbGbB_~C8uxQ~DG>GwbDQ?cs(wkN+sn^q?*NVn;lbY_|GGObUGJQPcR?5y&MQrKP{ N+;I53(IN&0YXH13EkFPO literal 0 HcmV?d00001 diff --git a/icons/stax_app_gochain.gif b/icons/stax_app_gochain.gif new file mode 100644 index 0000000000000000000000000000000000000000..04bb08df626b4c6425b4f305e0aa494e6218e99a GIT binary patch literal 150 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJh)!r+?+?T!w|SHKQD+*Ia-0xbW_@ zR-uc({9bBFX)w@ld&tmU7p}KO$e!T5qA>J^x#& wd9|MFduEF!FLp}Z!lhb&SM%$iHL}GA^Y@j1cN7Zye%(Eze8!3y5ey900J3X5M*si- literal 0 HcmV?d00001 diff --git a/icons/stax_app_goerli.gif b/icons/stax_app_goerli.gif new file mode 100644 index 0000000000000000000000000000000000000000..95c819d26d253ae627a6465dc2cb63c22149cd0b GIT binary patch literal 157 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJmT1r+?*XM*hUvYPURY-i>^FUshhi zYI??0wYDWoZ*LM6I39HTl)=>duRkwZnB#CYCH>2ZNvCeF&{W}?Z+s~~OV%|uBv-I< zty}%0!bl$*^&PIWqoQ)Boz3~2weQ{5lh?m>_M2UQ+WP3Jd*}*P)@$3R9Al9@8Nk3` F4FCe8_q=+@A1vns}#tn zId9(fNNk4K=Cq|c+8eWHcBC(_+*^GxP4I4~>YJ?%>Pp=~DbwaCYUx;-uoVlxEc@K@ ztIFP8_iJz2g&R-#bMh9~yjVQv+pfyH7x&chvWZ;2I(>=j3Fo4%i#*D1oDgS|G>P09 Iz`$S)08dmwW&i*H literal 0 HcmV?d00001 diff --git a/icons/stax_app_id4good.gif b/icons/stax_app_id4good.gif new file mode 100644 index 0000000000000000000000000000000000000000..ae3fae4a7c3ae895b23c172c40159f7f26d18d8a GIT binary patch literal 151 zcmZ?wbhEHbRA5kGXkcLY|NlP&1B2pE79h#MpaUX6G7L<4E&VHJKa}U2V`8SYdRyhU z-r9Z+CzbH5=T%m2N4Mp39GD({*(~Y3_3OoqrH3T-Iv%%9SQb6mvdC?rUgp$Ol4|wG z)D2hWK09#tWw=aV-^Hh|Bj>JL_ptbL*pAG_LHU;Z_kULp7ypqSI^)oS9Xlcz7_0#R C&p$!{ literal 0 HcmV?d00001 diff --git a/icons/stax_app_kardiachain.gif b/icons/stax_app_kardiachain.gif new file mode 100644 index 0000000000000000000000000000000000000000..0c092ffa257fc342a773f4f3ff577898f5b010ad GIT binary patch literal 153 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJmS|r+?+?xBD3yOnj7|p6-2Iqq<;O z!*Piyjm{bKe=mAeaY%d3t++kcO5W_ASha7#g%e3n`%Z*-bVO@KUl7UnQk_<}ilcnl z;W{g$IMv;|=bpZPx9xPxhO60gwlV#`Hu+*P-`nk9Rm4t+dz2O3Sa{;bjR*z?YXBHP BMIQhF literal 0 HcmV?d00001 diff --git a/icons/stax_app_kusd.gif b/icons/stax_app_kusd.gif new file mode 100644 index 0000000000000000000000000000000000000000..18b1a1c5ea722b40213b15f6c76033354a5ab79c GIT binary patch literal 133 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJh)jr+?+@1N?#o8`ouSUSjp=WGRo> zgh!uSmosj9ni}jmryVl0EMhmIl}@Tz_dw)?TOSXN1LP g>oy%W`;hl$^P=Y0D>lsyU4Q?B_@$Whi@6!B0oFn~7XSbN literal 0 HcmV?d00001 diff --git a/icons/stax_app_meter.gif b/icons/stax_app_meter.gif new file mode 100644 index 0000000000000000000000000000000000000000..d07813d1a32156348c2d5d1078cf23b52f3f720e GIT binary patch literal 148 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJh)&r+?+?xBnaF2%Pg?eaI&JOvAM6 zF@i5=EL|e0@u|<@#J0S-M~eLp|M=*1;#-E?FqE?k& w{9Cejo90ySX%{c4Z@VeBdDrAyzBSg^*pZrx08!CzwLfdw(sVJjH=Qu&uc>B3R?5+S6*h`8pnHKg+|h= Xs_;h_OzgT=hwg0dt&o%G zP|D~Ft8!bzwO7{jdRgSD4`;v6w|mLi-Y0M1;d7~H^Bg};QKRyUt4@1v&D!3^#9$2o D+|wpI literal 0 HcmV?d00001 diff --git a/icons/stax_app_moonriver.gif b/icons/stax_app_moonriver.gif new file mode 100644 index 0000000000000000000000000000000000000000..69466a7a5c8aed3f47b2fb85e1ae5730f6f72baf GIT binary patch literal 142 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJh)yr+?+?x9=O~2)T8w_TAZBTOp^> z6&C5VqH=BW<4rz)&PhFT%iVk5ZTTnPf+_9(g*>%A_D?>2pJU2=I>XI$ZIf73R+-eL o%Hwx8-RSv!=!(Y&vsrTaPi4$Kz4jMBFSWaNo<-wD00V&QOo0dPn8oKa% zq_TNZu+}E6$J>h7=P&EIQMu#s?n#R(G6Z7zzX}OCI#0TE^2^r+YN|zEPh~q!M;q

-`HJ#)$GcgCyki7N}f5DiaZ4r7`Y=G1=ZhQSvOMbF5Y I0SpY*0Q7D_WB>pF literal 0 HcmV?d00001 diff --git a/icons/stax_app_musicoin.gif b/icons/stax_app_musicoin.gif new file mode 100644 index 0000000000000000000000000000000000000000..eced2ed72d7d44bd7d416d5e8c53ec9af6f64d7f GIT binary patch literal 146 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJh)wr+?*X-v6_FHZ)nTJ?a;}uR^+` zL%wo`da>p!sla#A>=R-xea+h5_U`hM8rxe1#lIQ*=L;MB2zoU`Y30Tho6@$1zPWar twR%NzQKZcyq2$Xlh9XB(A8DAb|F?E=_OIIeXO@e9Q~#1)5x~G;4FFFWJ+S}) literal 0 HcmV?d00001 diff --git a/icons/stax_app_oasys.gif b/icons/stax_app_oasys.gif new file mode 100644 index 0000000000000000000000000000000000000000..83995c6979282f87779ba5dbeea40cb916694226 GIT binary patch literal 149 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJh)kr+?+?xBQFeY`N84%(Un8n^wiA zmQOEhs!uYy&nU6z%&}Fv#~*!vCVlVL&8WtCA1zKZwx5o=#9k{o)ltIu)S0x67Z$Di x{yS=Sknm2=u-@I7uUGB(cQwW$zxhS&Geu|P8l@%Sic11BDmrFVL@+Q|0{|#=K|}xm literal 0 HcmV?d00001 diff --git a/icons/stax_app_okc.gif b/icons/stax_app_okc.gif new file mode 100644 index 0000000000000000000000000000000000000000..38cfa3cc3c79f9b8ffce4c16752d8190630f05cc GIT binary patch literal 131 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJh)nr+?+_2mCV|Mb7+6IZ#=wUAth# zM7i)faj8}6(>AFkpYwiusq%D|;hW!~O-@`B*=@9PPBCx(Ddi-1K5gs9=w0iy70k0( d+$UVpUsrxRZQ~}>(B5m?9=~~F62ZV=4FF>`GXekr literal 0 HcmV?d00001 diff --git a/icons/stax_app_pirl.gif b/icons/stax_app_pirl.gif new file mode 100644 index 0000000000000000000000000000000000000000..6ac7154d380daa14a7e881a6357054d9d17c9fdc GIT binary patch literal 145 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJh)gr+?+?T!uL*0_T3OI_j70S1I37 z5$QT_wp3%3}?AOEv3sdQ;t=fp7zo6XjF5|i?Z;) re7jGjdw3h0wHCTdxK8DpyVZbYEok`|BbSMiCtW3=Gx)*Y7+9 literal 0 HcmV?d00001 diff --git a/icons/stax_app_poa.gif b/icons/stax_app_poa.gif new file mode 100644 index 0000000000000000000000000000000000000000..afa1186ba1727250b79db238843cb8427922b1b9 GIT binary patch literal 147 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJh)or+?+_2kYf>gl1%|?D<+|t2kqO zBVTx5np#~}^dZIKJzsR^|L{9!ll$AS$!Q9Iho{!my-SU6)_9d(esv_PH)$s0qU&Ez uZp?ZhaZ|>3eb1E-KUe%(wEO8}y?6f}KL5UJ-H!Bj;UDTQAuYiS4Aua_s6kZ# literal 0 HcmV?d00001 diff --git a/icons/stax_app_polygon.gif b/icons/stax_app_polygon.gif new file mode 100644 index 0000000000000000000000000000000000000000..eba2eaad34abc2ab162386d65112a4ad71b71301 GIT binary patch literal 362 zcmZ?wbhEHbRA5kG_{_k-$jHde%`G7zVPIeo5)zV|o7>ylyL$EN^XJdMeEIUrmoGnm z{`~*{KLZRX{$v3&75{U4<|d}6`X;7lCTH`dC+6lR+8XGYn1UdK4oD5i1_qX&6Ha=r z-fQuCsdbq9qu$Go49$v@ZZwH7DlBe46xOMDrdU9rLz>y-0Wa6lnF}^ZNmei^C{Lfl z8=-z+y<6qclnBX%o{=^O#RC`*CZ=%CKYZqq(vfM4%H8^==?EFvFtFw&RTm3cS~oEi zR7un@2&o0Is@b>pN~TZZ=}vNVW@npOkSpxcVa#m0oJXdLjm?Z_x|dKq`#O;-bryEk z`O!kgOC+jTdo;9!cS@dUV)PL;WJj~kN!1@qq{pF$i>?)RE?aa63W1I zhNH~pnDWil2i;=Kzs9qiRW43uTq>8{vc%9Jfm^p#Tu4EI<73m#E(u*11_o;Yuo8Rz literal 0 HcmV?d00001 diff --git a/icons/stax_app_reosc.gif b/icons/stax_app_reosc.gif new file mode 100644 index 0000000000000000000000000000000000000000..50fe3fba62f5a63646f21893a4b1f1a7e28c7fab GIT binary patch literal 148 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJh)&r+?+?xBSvGjNQ7{9v`(k~DL_aESHM u&coUd!?qdM@852!Tp5-houIS#-MstnHNvFk literal 0 HcmV?d00001 diff --git a/icons/stax_app_ropsten.gif b/icons/stax_app_ropsten.gif new file mode 100644 index 0000000000000000000000000000000000000000..4c7a5a0e74cfacc0e63e5f78819f711ac0853ebc GIT binary patch literal 127 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJh)pr+?+?T!uL*0_Uo;js!=)tB~H& zA>TPebk-{6SLSO1_0`1GY|j( literal 0 HcmV?d00001 diff --git a/icons/stax_app_rsk.gif b/icons/stax_app_rsk.gif new file mode 100644 index 0000000000000000000000000000000000000000..a576134bc929f78e6d1c207372863cb595e54009 GIT binary patch literal 144 zcmZ?wbhEHbRA5kGXkcJqW@i5X|G(l-76uT|0TCb>2B!3${*|X?85(D6xpl2Q8XSMG zLSTpDqLjM!=^HYCcC5{svvtnHvUl@VJdXa^X07<~$7>eHZl&U9RZgZpH_lf1rn&3q uo_W<1S`eR=B@=sZ*)yY0H)>b+p0pJ6n0D#?r49GqehpXis0d(Sum%7f&przP literal 0 HcmV?d00001 diff --git a/icons/stax_app_rsk_testnet.gif b/icons/stax_app_rsk_testnet.gif new file mode 100644 index 0000000000000000000000000000000000000000..a576134bc929f78e6d1c207372863cb595e54009 GIT binary patch literal 144 zcmZ?wbhEHbRA5kGXkcJqW@i5X|G(l-76uT|0TCb>2B!3${*|X?85(D6xpl2Q8XSMG zLSTpDqLjM!=^HYCcC5{svvtnHvUl@VJdXa^X07<~$7>eHZl&U9RZgZpH_lf1rn&3q uo_W<1S`eR=B@=sZ*)yY0H)>b+p0pJ6n0D#?r49GqehpXis0d(Sum%7f&przP literal 0 HcmV?d00001 diff --git a/icons/stax_app_shiden.gif b/icons/stax_app_shiden.gif new file mode 100644 index 0000000000000000000000000000000000000000..13223094882ad0d6141da1132474e311578d5d1c GIT binary patch literal 156 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJmTLr+?+?vkY@XHk^xm%vhe9Qkoz! zVQECx%WtKt(z*<`Z!&Rn&)0c*?CjyWZ3nyc%bhp+$y^QKtjU|Q^%=j5@3Rh1@uxSx z>a9KZW}9T$!F8#RyXWR@2{Ya*_Otu@tIC@-%by!Eg={Imt~M?F#deNX57wIj3=Gx) D2%bXs literal 0 HcmV?d00001 diff --git a/icons/stax_app_shyft.gif b/icons/stax_app_shyft.gif new file mode 100644 index 0000000000000000000000000000000000000000..0741eddac35b5d095221e61f8539ed91f7aa0beb GIT binary patch literal 150 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJh)!r+?*XUjErW8;-qPx3VJhS4qdQ z+=UWzR+g@~!8(7w%I=L3+LhbizsTZZsy{rhn_b}8B#rxEPqY-uWAF(ZJ1!5RRo0zc6J literal 0 HcmV?d00001 diff --git a/icons/stax_app_songbird.gif b/icons/stax_app_songbird.gif new file mode 100644 index 0000000000000000000000000000000000000000..811d72ac167f5690dee827a915275a6705ae0e2e GIT binary patch literal 132 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJh)%r+?*XPTph&|0tK&TO;4!s117F z$rU+EV%5BiRr}UDOUc=!eG`7vYqyX^+pev^cuy|rd3}1!ml%RQl;7FVBh0yr?a=kom0QEl|5yPxyP2^649a^C$<`Fz53W8 XBci?J>xob8$9GQrrl}Rkz+epk|3pmB literal 0 HcmV?d00001 diff --git a/icons/stax_app_tecratestnet.gif b/icons/stax_app_tecratestnet.gif new file mode 100644 index 0000000000000000000000000000000000000000..a1ccb2d47410b7dc321415d881f514c21a0c2e18 GIT binary patch literal 174 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJmTIr+?*XUjErG4-Q1DSBtr?t!X@- z`Dn&MxfNx1x#HYBr*-~07ddy|qPeR)3$`d^e$srEa9S?l`ESFiE7bZX@wm-2SH98} znRGPt>cuy|rd3}1!ml%RQl;7FVBh0yr?a=kom0QEl|5yPxyP2^649a^C$<`Fz53W8 XBci?J>xob8$9GQrrl}Rkz+epk|3pmB literal 0 HcmV?d00001 diff --git a/icons/stax_app_thundercore.gif b/icons/stax_app_thundercore.gif new file mode 100644 index 0000000000000000000000000000000000000000..4d730a167775aa5f4f183ff38b164d6fa7192fc4 GIT binary patch literal 141 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJh)ir+?*X-usWLLZX~MPu;oewqu_~ z+r(onPp)iym8qu1aQt}8{_XS5eYvOg(7R7w?6&5<-Pcf00stY03Me=HUIzs literal 0 HcmV?d00001 diff --git a/icons/stax_app_tobalaba.gif b/icons/stax_app_tobalaba.gif new file mode 100644 index 0000000000000000000000000000000000000000..cd3e9464ef235e7a671b3f663e03249fe43c3f0e GIT binary patch literal 116 zcmZ?wbhEHbRA5kGXkY+=|NsB%fM}2i15KIUBc02Qn~N0|4sJF$(|y literal 0 HcmV?d00001 diff --git a/icons/stax_app_tomochain.gif b/icons/stax_app_tomochain.gif new file mode 100644 index 0000000000000000000000000000000000000000..eb8d01a1a9f2b5b4562c206108e17047ec5ae37f GIT binary patch literal 126 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJh)xr+?*XE?(t|jmtdO9*uOqSIMK{ z74viMixunqUMoHD@el32UGA6t=grT9WixK9&X~g6yX48jmpl&Q!D5$IdF%2zJo*}$ Y`{h95MuXSF>*_Yn*(~iU%D`X^0MY|8Qvd(} literal 0 HcmV?d00001 diff --git a/icons/stax_app_ubiq.gif b/icons/stax_app_ubiq.gif new file mode 100644 index 0000000000000000000000000000000000000000..afd0577ad5a08defd653ecd78ef84a1784e6c7eb GIT binary patch literal 143 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJh)qr+?+?T!uL@0_UW&j{0T$RmxX% zBz4YAlk|P{Gv}^#TAcIstQp(Q=DdhZGIiD0*en^ZcuipAWQMt(cesAmIL-9Xns(Zo pt2X+9#TwzL%f}JLHE(gZ-sWY=1KWgJ)bs7XKAi9 zX`6Uk^>e9fx2Ch{jc&W+Pc<{{)}^0+S^3T`_i6j5FcY&M*O|>9@#+Dl^0vH&q0eAgF AKL7v# literal 0 HcmV?d00001 diff --git a/icons/stax_app_webchain.gif b/icons/stax_app_webchain.gif new file mode 100644 index 0000000000000000000000000000000000000000..3deecb3fff53dfd8ac5dc942d76529cdaf6d6f49 GIT binary patch literal 116 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJneur+?+?xBQFeY`N9F*=<4f>srSf zjZYkzLQc&UzTGAy(=8A?oqyiy-Mbq&8y&9)JhSMU;JG;XyE9+<`K9`cTK28F)%%^B Nulx9uPfHmXtO5T`E?)ou literal 0 HcmV?d00001 diff --git a/icons/stax_app_wethio.gif b/icons/stax_app_wethio.gif new file mode 100644 index 0000000000000000000000000000000000000000..4b540302e789064699de2bb9f76e669740bfec63 GIT binary patch literal 149 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJh)kr+?+?xBDCBOgR)%yw~mb$;N(* zNxh*=3#Y6Smzv4Nnfylb&fLB$+WU(Os~m0`RDAfVpppEkJ%uCqU}jNPi)E?gB2(>> viz#*qCDA6`XF}hP9Wycl7#OSp845n` literal 0 HcmV?d00001 diff --git a/icons/stax_app_xdcnetwork.gif b/icons/stax_app_xdcnetwork.gif new file mode 100644 index 0000000000000000000000000000000000000000..2cd15b212819b239c8ea642865d0466187c9d069 GIT binary patch literal 146 zcmZ?wbhEHbRA5kGXkY+=|Ns9h{$v3&bwDIYhJh)wr+?+?xAF~hF8Fl4Yn7U>XQ{BE zr>C-s>(+*ezjowtFHW(!WYt{qqIkh>{L tCMbCB+GCe&>k~4c=NyfjelqKa&Bt>`CV$PDZ-4Drt4l Date: Fri, 5 May 2023 11:54:39 +0200 Subject: [PATCH 26/85] Stax ENS support --- src_nbgl/ui_approve_tx.c | 65 +++++++++++++++++++++++++++------------- src_nbgl/ui_settings.c | 42 +++++++++++++++++++++----- 2 files changed, 79 insertions(+), 28 deletions(-) diff --git a/src_nbgl/ui_approve_tx.c b/src_nbgl/ui_approve_tx.c index 78c9d81..b3aec12 100644 --- a/src_nbgl/ui_approve_tx.c +++ b/src_nbgl/ui_approve_tx.c @@ -5,6 +5,7 @@ #include "ui_nbgl.h" #include "network.h" #include "plugins.h" +#include "domain_name.h" // 1 more than actually displayed on screen, because of calculations in StaticReview #define MAX_PLUGIN_ITEMS_PER_SCREEN 4 @@ -27,6 +28,9 @@ struct tx_approval_context_t { bool fromPlugin; bool blindSigning; bool displayNetwork; +#ifdef HAVE_DOMAIN_NAME + bool domain_name_match; +#endif }; static struct tx_approval_context_t tx_approval_context; @@ -35,10 +39,12 @@ static void reviewContinueCommon(void); static void reviewReject(void) { io_seproxyhal_touch_tx_cancel(NULL); + memset(&tx_approval_context, 0, sizeof(tx_approval_context)); } static void confirmTransation(void) { io_seproxyhal_touch_tx_ok(NULL); + memset(&tx_approval_context, 0, sizeof(tx_approval_context)); } static void onConfirmAbandon(void) { @@ -88,32 +94,41 @@ static nbgl_layoutTagValue_t *getTagValuePair(uint8_t pairIndex) { } } } else { - // if displayNonce is false, we skip index 2 - if ((pairIndex > 1) && (!N_storage.displayNonce)) { - pairIndex++; - } + uint8_t target_index = 0; - switch (pairIndex) { - case 0: - pair.item = "Amount"; - pair.value = strings.common.fullAmount; - break; - case 1: + if (pairIndex == target_index++) { + pair.item = "Amount"; + pair.value = strings.common.fullAmount; + } +#ifdef HAVE_DOMAIN_NAME + if (tx_approval_context.domain_name_match) { + if (pairIndex == target_index++) { + pair.item = "Domain"; + pair.value = g_domain_name; + } + } + if (!tx_approval_context.domain_name_match || N_storage.verbose_domain_name) { +#endif // HAVE_DOMAIN_NAME + if (pairIndex == target_index++) { pair.item = "Address"; pair.value = strings.common.fullAddress; - break; - case 2: + } +#ifdef HAVE_DOMAIN_NAME + } +#endif // HAVE_DOMAIN_NAME + if (N_storage.displayNonce) { + if (pairIndex == target_index++) { pair.item = "Nonce"; pair.value = strings.common.nonce; - break; - case 3: - pair.item = "Max fees"; - pair.value = strings.common.maxFee; - break; - case 4: - pair.item = "Network"; - pair.value = strings.common.network_name; - break; + } + } + if (pairIndex == target_index++) { + pair.item = "Max fees"; + pair.value = strings.common.maxFee; + } + if (pairIndex == target_index++) { + pair.item = "Network"; + pair.value = strings.common.network_name; } } // counter is used as index to circular buffer @@ -177,6 +192,14 @@ static void reviewContinueCommon(void) { if (N_storage.displayNonce) { nbPairs++; } +#ifdef HAVE_DOMAIN_NAME + uint64_t chain_id = get_tx_chain_id(); + tx_approval_context.domain_name_match = + has_domain_name(&chain_id, tmpContent.txContent.destination); + if (tx_approval_context.domain_name_match && N_storage.verbose_domain_name) { + nbPairs += 1; + } +#endif // HAVE_DOMAIN_NAME if (tx_approval_context.displayNetwork) { nbPairs++; } diff --git a/src_nbgl/ui_settings.c b/src_nbgl/ui_settings.c index b55d323..c952140 100644 --- a/src_nbgl/ui_settings.c +++ b/src_nbgl/ui_settings.c @@ -5,26 +5,38 @@ static const char* const infoTypes[] = {"Version", APPNAME " App"}; static const char* const infoContents[] = {APPVERSION, "(c) 2022 Ledger"}; -enum { BLIND_SIGNING_TOKEN = FIRST_USER_TOKEN, DEBUG_TOKEN, NONCE_TOKEN, EIP712_VERBOSE_TOKEN }; +enum { + BLIND_SIGNING_TOKEN = FIRST_USER_TOKEN, + DEBUG_TOKEN, + NONCE_TOKEN, +#ifdef HAVE_EIP712_FULL_SUPPORT + EIP712_VERBOSE_TOKEN, +#endif // HAVE_EIP712_FULL_SUPPORT +#ifdef HAVE_DOMAIN_NAME + DOMAIN_NAME_VERBOSE_TOKEN +#endif // HAVE_DOMAIN_NAME +}; static nbgl_layoutSwitch_t switches[3]; static bool navCallback(uint8_t page, nbgl_pageContent_t* content) { + uint8_t index = 0; + switch (page) { case 0: - switches[0] = + switches[index++] = (nbgl_layoutSwitch_t){.initState = N_storage.dataAllowed ? ON_STATE : OFF_STATE, .text = "Blind signing", .subText = "Enable transaction blind\nsigning", .token = BLIND_SIGNING_TOKEN, .tuneId = TUNE_TAP_CASUAL}; - switches[1] = + switches[index++] = (nbgl_layoutSwitch_t){.initState = N_storage.contractDetails ? ON_STATE : OFF_STATE, .text = "Debug", .subText = "Display contract data\ndetails", .token = DEBUG_TOKEN, .tuneId = TUNE_TAP_CASUAL}; - switches[2] = + switches[index++] = (nbgl_layoutSwitch_t){.initState = N_storage.displayNonce ? ON_STATE : OFF_STATE, .text = "Nonce", .subText = "Display account nonce\nin transaction", @@ -32,20 +44,28 @@ static bool navCallback(uint8_t page, nbgl_pageContent_t* content) { .tuneId = TUNE_TAP_CASUAL}; content->type = SWITCHES_LIST; - content->switchesList.nbSwitches = 3; + content->switchesList.nbSwitches = index; content->switchesList.switches = (nbgl_layoutSwitch_t*) switches; break; case 1: - switches[0] = + switches[index++] = (nbgl_layoutSwitch_t){.initState = N_storage.verbose_eip712 ? ON_STATE : OFF_STATE, .text = "Verbose EIP712", .subText = "Ignore filtering and\ndisplay raw content", .token = EIP712_VERBOSE_TOKEN, .tuneId = TUNE_TAP_CASUAL}; +#ifdef HAVE_DOMAIN_NAME + switches[index++] = (nbgl_layoutSwitch_t){ + .initState = N_storage.verbose_domain_name ? ON_STATE : OFF_STATE, + .text = "Verbose domains", + .subText = "Show resolved address", + .token = DOMAIN_NAME_VERBOSE_TOKEN, + .tuneId = TUNE_TAP_CASUAL}; +#endif // HAVE_DOMAIN_NAME content->type = SWITCHES_LIST; - content->switchesList.nbSwitches = 1; + content->switchesList.nbSwitches = index; content->switchesList.switches = (nbgl_layoutSwitch_t*) switches; break; @@ -80,10 +100,18 @@ static void controlsCallback(int token, uint8_t index) { value = (N_storage.displayNonce ? 0 : 1); nvm_write((void*) &N_storage.displayNonce, (void*) &value, sizeof(uint8_t)); break; +#ifdef HAVE_EIP712_FULL_SUPPORT case EIP712_VERBOSE_TOKEN: value = (N_storage.verbose_eip712 ? 0 : 1); nvm_write((void*) &N_storage.verbose_eip712, (void*) &value, sizeof(uint8_t)); break; +#endif // HAVE_EIP712_FULL_SUPPORT +#ifdef HAVE_DOMAIN_NAME + case DOMAIN_NAME_VERBOSE_TOKEN: + value = (N_storage.verbose_domain_name ? 0 : 1); + nvm_write((void*) &N_storage.verbose_domain_name, (void*) &value, sizeof(uint8_t)); + break; +#endif // HAVE_DOMAIN_NAME } } From 7c07008335086b1c655beb6438eb629ecf6c5b03 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Fri, 5 May 2023 14:26:09 +0200 Subject: [PATCH 27/85] Dynamic year shown in settings --- Makefile | 1 + src_nbgl/ui_settings.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index d037261..104d521 100644 --- a/Makefile +++ b/Makefile @@ -89,6 +89,7 @@ DEFINES += OS_IO_SEPROXYHAL DEFINES += HAVE_SPRINTF HAVE_SNPRINTF_FORMAT_U DEFINES += HAVE_IO_USB HAVE_L4_USBLIB IO_USB_MAX_ENDPOINTS=4 IO_HID_EP_LENGTH=64 HAVE_USB_APDU DEFINES += LEDGER_MAJOR_VERSION=$(APPVERSION_M) LEDGER_MINOR_VERSION=$(APPVERSION_N) LEDGER_PATCH_VERSION=$(APPVERSION_P) +DEFINES += BUILD_YEAR=\"$(shell date +%Y)\" # U2F DEFINES += HAVE_U2F HAVE_IO_U2F diff --git a/src_nbgl/ui_settings.c b/src_nbgl/ui_settings.c index c952140..7981356 100644 --- a/src_nbgl/ui_settings.c +++ b/src_nbgl/ui_settings.c @@ -3,7 +3,7 @@ #include "nbgl_use_case.h" static const char* const infoTypes[] = {"Version", APPNAME " App"}; -static const char* const infoContents[] = {APPVERSION, "(c) 2022 Ledger"}; +static const char* const infoContents[] = {APPVERSION, "(c) " BUILD_YEAR " Ledger"}; enum { BLIND_SIGNING_TOKEN = FIRST_USER_TOKEN, From 1413547d3ec13e13a77344e689be486869305aa4 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Fri, 5 May 2023 14:57:58 +0200 Subject: [PATCH 28/85] Removed large global buffer from NBGL transaction signing UI code --- src_nbgl/ui_approve_tx.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src_nbgl/ui_approve_tx.c b/src_nbgl/ui_approve_tx.c index b3aec12..377166c 100644 --- a/src_nbgl/ui_approve_tx.c +++ b/src_nbgl/ui_approve_tx.c @@ -20,7 +20,6 @@ static nbgl_layoutTagValue_t pair; // these buffers are used as circular static char title_buffer[MAX_PLUGIN_ITEMS_PER_SCREEN][TAG_MAX_LEN]; static char msg_buffer[MAX_PLUGIN_ITEMS_PER_SCREEN][VALUE_MAX_LEN]; -static char transaction_type[100]; static nbgl_layoutTagValueList_t useCaseTagValueList; static nbgl_pageInfoLongPress_t infoLongPress; @@ -212,7 +211,7 @@ static void reviewContinueCommon(void) { useCaseTagValueList.smallCaseForValue = false; useCaseTagValueList.wrapping = false; infoLongPress.icon = get_app_icon(true); - infoLongPress.text = tx_approval_context.fromPlugin ? transaction_type : "Review transaction"; + infoLongPress.text = tx_approval_context.fromPlugin ? staxSharedBuffer : "Review transaction"; infoLongPress.longPressText = "Hold to sign"; nbgl_useCaseStaticReview(&useCaseTagValueList, &infoLongPress, @@ -223,12 +222,12 @@ static void reviewContinueCommon(void) { static void buildFirstPage(void) { if (tx_approval_context.fromPlugin) { plugin_ui_get_id(); - SPRINTF(transaction_type, + SPRINTF(staxSharedBuffer, "Review %s\ntransaction:\n%s", strings.common.fullAddress, strings.common.fullAmount); nbgl_useCaseReviewStart(get_app_icon(true), - transaction_type, + staxSharedBuffer, NULL, "Reject transaction", reviewContinue, From 683e410fee0c0ae63f51ce29651f2d15fca51030 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Fri, 5 May 2023 16:43:27 +0200 Subject: [PATCH 29/85] Fix Makefile configuration --- Makefile | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 104d521..20e4d69 100644 --- a/Makefile +++ b/Makefile @@ -98,7 +98,6 @@ DEFINES += USB_SEGMENT_SIZE=64 DEFINES += BLE_SEGMENT_SIZE=32 #max MTU, min 20 DEFINES += UNUSED\(x\)=\(void\)x DEFINES += APPVERSION=\"$(APPVERSION)\" -DEFINES += HAVE_UX_FLOW #WEBUSB_URL = www.ledgerwallet.com #DEFINES += HAVE_WEBUSB WEBUSB_URL_SIZE_B=$(shell echo -n $(WEBUSB_URL) | wc -c) WEBUSB_URL=$(shell echo -n $(WEBUSB_URL) | sed -e "s/./\\\'\0\\\',/g") @@ -106,21 +105,22 @@ DEFINES += HAVE_UX_FLOW DEFINES += HAVE_WEBUSB WEBUSB_URL_SIZE_B=0 WEBUSB_URL="" ifneq (,$(filter $(TARGET_NAME),TARGET_NANOX TARGET_STAX)) -DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=300 DEFINES += HAVE_BLE BLE_COMMAND_TIMEOUT_MS=2000 DEFINES += HAVE_BLE_APDU # basic ledger apdu transport over BLE SDK_SOURCE_PATH += lib_blewbxx lib_blewbxx_impl endif -ifneq (,$(filter $(TARGET_NAME),TARGET_NANOS TARGET_NANOS2)) -DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=72 +ifeq ($(TARGET_NAME),TARGET_NANOS) +DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=128 +else +DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=300 endif ifeq ($(TARGET_NAME),TARGET_STAX) -DEFINES += HAVE_NBGL DEFINES += NBGL_QRCODE else DEFINES += HAVE_BAGL +DEFINES += HAVE_UX_FLOW ifeq ($(TARGET_NAME),TARGET_NANOS) DEFINES += HAVE_WALLET_ID_SDK DEFINES += BAGL_WIDTH=128 BAGL_HEIGHT=32 @@ -236,7 +236,6 @@ include $(BOLOS_SDK)/Makefile.glyphs APP_SOURCE_PATH += src_common src src_features src_plugins SDK_SOURCE_PATH += lib_stusb lib_stusb_impl lib_u2f ifeq ($(TARGET_NAME),TARGET_STAX) -SDK_SOURCE_PATH += lib_ux_stax APP_SOURCE_PATH += src_nbgl else SDK_SOURCE_PATH += lib_ux From fec9a80d2787056150c028553ea941698549da4f Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 9 May 2023 15:16:03 +0200 Subject: [PATCH 30/85] Stax Ragger tests --- tests/ragger/app/client.py | 183 ++++++---------------------- tests/ragger/app/command_builder.py | 36 +++--- tests/ragger/app/response_parser.py | 26 ++-- tests/ragger/app/setting.py | 16 --- tests/ragger/app/settings.py | 62 ++++++++++ tests/ragger/conftest.py | 8 -- tests/ragger/eip712/InputData.py | 69 ++++++++--- tests/ragger/test_domain_name.py | 172 +++++++++++++++++++------- tests/ragger/test_eip712.py | 81 +++++++++--- 9 files changed, 376 insertions(+), 277 deletions(-) delete mode 100644 tests/ragger/app/setting.py create mode 100644 tests/ragger/app/settings.py diff --git a/tests/ragger/app/client.py b/tests/ragger/app/client.py index 9732c81..616670c 100644 --- a/tests/ragger/app/client.py +++ b/tests/ragger/app/client.py @@ -2,14 +2,9 @@ from enum import IntEnum, auto from typing import Optional from ragger.backend import BackendInterface from ragger.utils import RAPDU -from ragger.navigator import NavInsID, NavIns, NanoNavigator -from .command_builder import EthereumCmdBuilder -from .setting import SettingType, SettingImpl +from .command_builder import CommandBuilder from .eip712 import EIP712FieldType -from .response_parser import EthereumRespParser from .tlv import format_tlv -import signal -import time from pathlib import Path import keychain import rlp @@ -41,58 +36,19 @@ class DOMAIN_NAME_TAG(IntEnum): ADDRESS = 0x22 -class EthereumClient: - _settings: dict[SettingType, SettingImpl] = { - SettingType.BLIND_SIGNING: SettingImpl( - [ "nanos", "nanox", "nanosp" ] - ), - SettingType.DEBUG_DATA: SettingImpl( - [ "nanos", "nanox", "nanosp" ] - ), - SettingType.NONCE: SettingImpl( - [ "nanos", "nanox", "nanosp" ] - ), - SettingType.VERBOSE_EIP712: SettingImpl( - [ "nanox", "nanosp" ] - ), - SettingType.VERBOSE_ENS: SettingImpl( - [ "nanox", "nanosp" ] - ) - } - _click_delay = 1/4 - _eip712_filtering = False - - def __init__(self, client: BackendInterface, golden_run: bool): +class EthAppClient: + def __init__(self, client: BackendInterface): self._client = client - self._chain_id = 1 - self._cmd_builder = EthereumCmdBuilder() - self._resp_parser = EthereumRespParser() - self._nav = NanoNavigator(client, client.firmware, golden_run) - signal.signal(signal.SIGALRM, self._click_signal_timeout) - for setting in self._settings.values(): - setting.value = False + self._cmd_builder = CommandBuilder() def _send(self, payload: bytearray): return self._client.exchange_async_raw(payload) - def _recv(self) -> RAPDU: + def response(self) -> RAPDU: return self._client._last_async_response - def _click_signal_timeout(self, _signum: int, _frame): - self._client.right_click() - - def _enable_click_until_response(self): - signal.setitimer(signal.ITIMER_REAL, - self._click_delay, - self._click_delay) - - def _disable_click_until_response(self): - signal.setitimer(signal.ITIMER_REAL, 0, 0) - def eip712_send_struct_def_struct_name(self, name: str): - with self._send(self._cmd_builder.eip712_send_struct_def_struct_name(name)): - pass - return self._recv().status == 0x9000 + return self._send(self._cmd_builder.eip712_send_struct_def_struct_name(name)) def eip712_send_struct_def_struct_field(self, field_type: EIP712FieldType, @@ -100,98 +56,45 @@ class EthereumClient: type_size: int, array_levels: [], key_name: str): - with self._send(self._cmd_builder.eip712_send_struct_def_struct_field( - field_type, - type_name, - type_size, - array_levels, - key_name)): - pass - return self._recv() + return self._send(self._cmd_builder.eip712_send_struct_def_struct_field( + field_type, + type_name, + type_size, + array_levels, + key_name)) def eip712_send_struct_impl_root_struct(self, name: str): - with self._send(self._cmd_builder.eip712_send_struct_impl_root_struct(name)): - self._enable_click_until_response() - self._disable_click_until_response() - return self._recv() + return self._send(self._cmd_builder.eip712_send_struct_impl_root_struct(name)) def eip712_send_struct_impl_array(self, size: int): - with self._send(self._cmd_builder.eip712_send_struct_impl_array(size)): - pass - return self._recv() + return self._send(self._cmd_builder.eip712_send_struct_impl_array(size)) def eip712_send_struct_impl_struct_field(self, raw_value: bytes): - for apdu in self._cmd_builder.eip712_send_struct_impl_struct_field(raw_value): - with self._send(apdu): - self._enable_click_until_response() - self._disable_click_until_response() - assert self._recv().status == 0x9000 + chunks = self._cmd_builder.eip712_send_struct_impl_struct_field(raw_value) + for chunk in chunks[:-1]: + with self._send(chunk): + pass + return self._send(chunks[-1]) - def eip712_sign_new(self, bip32_path: str): - with self._send(self._cmd_builder.eip712_sign_new(bip32_path)): - time.sleep(0.5) # tight on timing, needed by the CI otherwise might fail sometimes - if not self._settings[SettingType.VERBOSE_EIP712].value and \ - not self._eip712_filtering: # need to skip the message hash - self._client.right_click() - self._client.right_click() - self._client.both_click() # approve signature - resp = self._recv() - assert resp.status == 0x9000 - return self._resp_parser.sign(resp.data) + def eip712_sign_new(self, bip32_path: str, verbose: bool): + return self._send(self._cmd_builder.eip712_sign_new(bip32_path)) def eip712_sign_legacy(self, bip32_path: str, domain_hash: bytes, message_hash: bytes): - with self._send(self._cmd_builder.eip712_sign_legacy(bip32_path, - domain_hash, - message_hash)): - self._client.right_click() # sign typed message screen - for _ in range(2): # two hashes (domain + message) - if self._client.firmware.device == "nanos": - screens_per_hash = 4 - else: - screens_per_hash = 2 - for _ in range(screens_per_hash): - self._client.right_click() - self._client.both_click() # approve signature - - resp = self._recv() - - assert resp.status == 0x9000 - return self._resp_parser.sign(resp.data) - - def settings_set(self, new_values: dict[SettingType, bool]): - # Go to settings - for _ in range(2): - self._client.right_click() - self._client.both_click() - - for enum in self._settings.keys(): - if self._client.firmware.device in self._settings[enum].devices: - if enum in new_values.keys(): - if new_values[enum] != self._settings[enum].value: - self._client.both_click() - self._settings[enum].value = new_values[enum] - self._client.right_click() - self._client.both_click() + return self._send(self._cmd_builder.eip712_sign_legacy(bip32_path, + domain_hash, + message_hash)) def eip712_filtering_activate(self): - with self._send(self._cmd_builder.eip712_filtering_activate()): - pass - self._eip712_filtering = True - assert self._recv().status == 0x9000 + return self._send(self._cmd_builder.eip712_filtering_activate()) def eip712_filtering_message_info(self, name: str, filters_count: int, sig: bytes): - with self._send(self._cmd_builder.eip712_filtering_message_info(name, filters_count, sig)): - self._enable_click_until_response() - self._disable_click_until_response() - assert self._recv().status == 0x9000 + return self._send(self._cmd_builder.eip712_filtering_message_info(name, filters_count, sig)) def eip712_filtering_show_field(self, name: str, sig: bytes): - with self._send(self._cmd_builder.eip712_filtering_show_field(name, sig)): - pass - assert self._recv().status == 0x9000 + return self._send(self._cmd_builder.eip712_filtering_show_field(name, sig)) def send_fund(self, bip32_path: str, @@ -200,8 +103,7 @@ class EthereumClient: gas_limit: int, to: bytes, amount: float, - chain_id: int, - screenshot_collection: str = None): + chain_id: int): data = list() data.append(nonce) data.append(gas_price) @@ -213,27 +115,14 @@ class EthereumClient: data.append(bytes()) data.append(bytes()) - for chunk in self._cmd_builder.sign(bip32_path, rlp.encode(data)): + chunks = self._cmd_builder.sign(bip32_path, rlp.encode(data)) + for chunk in chunks[:-1]: with self._send(chunk): - nav_ins = NavIns(NavInsID.RIGHT_CLICK) - final_ins = [ NavIns(NavInsID.BOTH_CLICK) ] - target_text = "and send" - if screenshot_collection: - self._nav.navigate_until_text_and_compare(nav_ins, - final_ins, - target_text, - ROOT_SCREENSHOT_PATH, - screenshot_collection) - else: - self._nav.navigate_until_text(nav_ins, - final_ins, - target_text) + pass + return self._send(chunks[-1]) - def get_challenge(self) -> int: - with self._send(self._cmd_builder.get_challenge()): - pass - resp = self._recv() - return self._resp_parser.challenge(resp.data) + def get_challenge(self): + return self._send(self._cmd_builder.get_challenge()) def provide_domain_name(self, challenge: int, name: str, addr: bytes): payload = format_tlv(DOMAIN_NAME_TAG.STRUCTURE_TYPE, 3) # TrustedDomainName @@ -247,6 +136,8 @@ class EthereumClient: payload += format_tlv(DOMAIN_NAME_TAG.SIGNATURE, keychain.sign_data(keychain.Key.DOMAIN_NAME, payload)) - for chunk in self._cmd_builder.provide_domain_name(payload): + chunks = self._cmd_builder.provide_domain_name(payload) + for chunk in chunks[:-1]: with self._send(chunk): pass + return self._send(chunks[-1]) diff --git a/tests/ragger/app/command_builder.py b/tests/ragger/app/command_builder.py index aac10d0..ae3f730 100644 --- a/tests/ragger/app/command_builder.py +++ b/tests/ragger/app/command_builder.py @@ -29,7 +29,7 @@ class P2Type(IntEnum): FILTERING_CONTRACT_NAME = 0x0f FILTERING_FIELD_NAME = 0xff -class EthereumCmdBuilder: +class CommandBuilder: _CLA: int = 0xE0 def _serialize(self, @@ -103,6 +103,7 @@ class EthereumCmdBuilder: data) def eip712_send_struct_impl_struct_field(self, data: bytearray) -> Iterator[bytes]: + chunks = list() # Add a 16-bit integer with the data's byte length (network byte order) data_w_length = bytearray() data_w_length.append((len(data) & 0xff00) >> 8) @@ -110,11 +111,12 @@ class EthereumCmdBuilder: data_w_length += data while len(data_w_length) > 0: p1 = P1Type.PARTIAL_SEND if len(data_w_length) > 0xff else P1Type.COMPLETE_SEND - yield self._serialize(InsType.EIP712_SEND_STRUCT_IMPL, - p1, - P2Type.STRUCT_FIELD, - data_w_length[:0xff]) + chunks.append(self._serialize(InsType.EIP712_SEND_STRUCT_IMPL, + p1, + P2Type.STRUCT_FIELD, + data_w_length[:0xff])) data_w_length = data_w_length[0xff:] + return chunks def eip712_sign_new(self, bip32_path: str) -> bytes: data = pack_derivation_path(bip32_path) @@ -167,29 +169,33 @@ class EthereumCmdBuilder: P2Type.FILTERING_FIELD_NAME, self._eip712_filtering_send_name(name, sig)) - def sign(self, bip32_path: str, rlp_data: bytes) -> Iterator[bytes]: + def sign(self, bip32_path: str, rlp_data: bytes) -> list[bytes]: + apdus = list() payload = pack_derivation_path(bip32_path) payload += rlp_data p1 = P1Type.SIGN_FIRST_CHUNK while len(payload) > 0: - yield self._serialize(InsType.SIGN, - p1, - 0x00, - payload[:0xff]) + apdus.append(self._serialize(InsType.SIGN, + p1, + 0x00, + payload[:0xff])) payload = payload[0xff:] p1 = P1Type.SIGN_SUBSQT_CHUNK + return apdus def get_challenge(self) -> bytes: return self._serialize(InsType.GET_CHALLENGE, 0x00, 0x00) - def provide_domain_name(self, tlv_payload: bytes) -> bytes: + def provide_domain_name(self, tlv_payload: bytes) -> list[bytes]: + chunks = list() payload = struct.pack(">H", len(tlv_payload)) payload += tlv_payload p1 = 1 while len(payload) > 0: - yield self._serialize(InsType.PROVIDE_DOMAIN_NAME, - p1, - 0x00, - payload[:0xff]) + chunks.append(self._serialize(InsType.PROVIDE_DOMAIN_NAME, + p1, + 0x00, + payload[:0xff])) payload = payload[0xff:] p1 = 0 + return chunks diff --git a/tests/ragger/app/response_parser.py b/tests/ragger/app/response_parser.py index 242f4cf..5e73df4 100644 --- a/tests/ragger/app/response_parser.py +++ b/tests/ragger/app/response_parser.py @@ -1,18 +1,14 @@ -class EthereumRespParser: - def sign(self, data: bytes): - assert len(data) == (1 + 32 + 32) +def signature(data: bytes) -> tuple[bytes, bytes, bytes]: + assert len(data) == (1 + 32 + 32) - v = data[0:1] - data = data[1:] + v = data[0:1] + data = data[1:] + r = data[0:32] + data = data[32:] + s = data[0:32] - r = data[0:32] - data = data[32:] + return v, r, s - s = data[0:32] - data = data[32:] - - return v, r, s - - def challenge(self, data: bytes) -> int: - assert len(data) == 4 - return int.from_bytes(data, "big") +def challenge(data: bytes) -> int: + assert len(data) == 4 + return int.from_bytes(data, "big") diff --git a/tests/ragger/app/setting.py b/tests/ragger/app/setting.py deleted file mode 100644 index 7e79da7..0000000 --- a/tests/ragger/app/setting.py +++ /dev/null @@ -1,16 +0,0 @@ -from enum import IntEnum, auto -from typing import List - -class SettingType(IntEnum): - BLIND_SIGNING = 0, - DEBUG_DATA = auto() - NONCE = auto() - VERBOSE_EIP712 = auto() - VERBOSE_ENS = auto() - -class SettingImpl: - devices: List[str] - value: bool - - def __init__(self, devs: List[str]): - self.devices = devs diff --git a/tests/ragger/app/settings.py b/tests/ragger/app/settings.py new file mode 100644 index 0000000..435e21a --- /dev/null +++ b/tests/ragger/app/settings.py @@ -0,0 +1,62 @@ +from enum import Enum, auto +from typing import List +from ragger.firmware import Firmware +from ragger.navigator import Navigator, NavInsID, NavIns + +class SettingID(Enum): + BLIND_SIGNING = auto() + DEBUG_DATA = auto() + NONCE = auto() + VERBOSE_EIP712 = auto() + VERBOSE_ENS = auto() + +def get_device_settings(device: str) -> list[SettingID]: + if device == "nanos": + return [ + SettingID.BLIND_SIGNING, + SettingID.DEBUG_DATA, + SettingID.NONCE + ] + if (device == "nanox") or (device == "nanosp") or (device == "stax"): + return [ + SettingID.BLIND_SIGNING, + SettingID.DEBUG_DATA, + SettingID.NONCE, + SettingID.VERBOSE_EIP712, + SettingID.VERBOSE_ENS + ] + return [] + +settings_per_page = 3 + +def get_setting_position(device: str, setting: NavInsID) -> tuple[int, int]: + screen_height = 672 # px + header_height = 85 # px + footer_height = 124 # px + usable_height = screen_height - (header_height + footer_height) + setting_height = usable_height // settings_per_page + index_in_page = get_device_settings(device).index(setting) % settings_per_page + return 350, header_height + (setting_height * index_in_page) + (setting_height // 2) + +def settings_toggle(fw: Firmware, nav: Navigator, to_toggle: list[SettingID]): + moves = list() + settings = get_device_settings(fw.device) + # Assume the app is on the home page + if fw.device.startswith("nano"): + moves += [NavInsID.RIGHT_CLICK] * 2 + moves += [NavInsID.BOTH_CLICK] + for setting in settings: + if setting in to_toggle: + moves += [NavInsID.BOTH_CLICK] + moves += [NavInsID.RIGHT_CLICK] + moves += [NavInsID.BOTH_CLICK] # Back + else: + moves += [NavInsID.USE_CASE_HOME_SETTINGS] + for setting in settings: + setting_idx = settings.index(setting) + if (setting_idx > 0) and (setting_idx % settings_per_page) == 0: + moves += [NavInsID.USE_CASE_SETTINGS_NEXT] + if setting in to_toggle: + moves += [NavIns(NavInsID.TOUCH, get_setting_position(fw.device, setting))] + moves += [NavInsID.EXIT_HEADER_TAP] + nav.navigate(moves) diff --git a/tests/ragger/conftest.py b/tests/ragger/conftest.py index 68799b2..6dd6f4b 100644 --- a/tests/ragger/conftest.py +++ b/tests/ragger/conftest.py @@ -1,12 +1,4 @@ -import pytest from ragger.conftest import configuration -from ragger.backend import BackendInterface -from app.client import EthereumClient - -# This final fixture will return the properly configured app client, to be used in tests -@pytest.fixture -def app_client(backend: BackendInterface, golden_run: bool) -> EthereumClient: - return EthereumClient(backend, golden_run) # Pull all features from the base ragger conftest using the overridden configuration pytest_plugins = ("ragger.conftest.base_conftest", ) diff --git a/tests/ragger/eip712/InputData.py b/tests/ragger/eip712/InputData.py index 02a96eb..da382d8 100644 --- a/tests/ragger/eip712/InputData.py +++ b/tests/ragger/eip712/InputData.py @@ -4,15 +4,19 @@ import json import sys import re import hashlib -from app.client import EthereumClient, EIP712FieldType +from app.client import EthAppClient, EIP712FieldType import keychain +from typing import Callable +import signal # global variables -app_client: EthereumClient = None +app_client: EthAppClient = None filtering_paths = None current_path = list() sig_ctx = {} +autonext_handler: Callable = None + @@ -97,11 +101,12 @@ def send_struct_def_field(typename, keyname): type_enum = EIP712FieldType.CUSTOM typesize = None - app_client.eip712_send_struct_def_struct_field(type_enum, - typename, - typesize, - array_lvls, - keyname) + with app_client.eip712_send_struct_def_struct_field(type_enum, + typename, + typesize, + array_lvls, + keyname): + pass return (typename, type_enum, typesize, array_lvls) @@ -191,7 +196,9 @@ def send_struct_impl_field(value, field): if path in filtering_paths.keys(): send_filtering_show_field(filtering_paths[path]) - app_client.eip712_send_struct_impl_struct_field(data) + with app_client.eip712_send_struct_impl_struct_field(data): + enable_autonext() + disable_autonext() @@ -201,7 +208,8 @@ def evaluate_field(structs, data, field, lvls_left, new_level = True): if new_level: current_path.append(field["name"]) if len(array_lvls) > 0 and lvls_left > 0: - app_client.eip712_send_struct_impl_array(len(data)) + with app_client.eip712_send_struct_impl_array(len(data)): + pass idx = 0 for subdata in data: current_path.append("[]") @@ -252,7 +260,9 @@ def send_filtering_message_info(display_name: str, filters_count: int): to_sign.append(ord(char)) sig = keychain.sign_data(keychain.Key.CAL, to_sign) - app_client.eip712_filtering_message_info(display_name, filters_count, sig) + with app_client.eip712_filtering_message_info(display_name, filters_count, sig): + enable_autonext() + disable_autonext() # ledgerjs doesn't actually sign anything, and instead uses already pre-computed signatures def send_filtering_show_field(display_name): @@ -270,7 +280,8 @@ def send_filtering_show_field(display_name): for char in display_name: to_sign.append(ord(char)) sig = keychain.sign_data(keychain.Key.CAL, to_sign) - app_client.eip712_filtering_show_field(display_name, sig) + with app_client.eip712_filtering_show_field(display_name, sig): + pass def read_filtering_file(domain, message, filtering_file_path): data_json = None @@ -309,9 +320,25 @@ def init_signature_context(types, domain): schema_hash = hashlib.sha224(schema_str.encode()) sig_ctx["schema_hash"] = bytearray.fromhex(schema_hash.hexdigest()) -def process_file(aclient: EthereumClient, input_file_path: str, filtering_file_path = None) -> bool: + +def next_timeout(_signum: int, _frame): + autonext_handler() + +def enable_autonext(): + delay = 1/4 + signal.setitimer(signal.ITIMER_REAL, delay, delay) + +def disable_autonext(): + signal.setitimer(signal.ITIMER_REAL, 0, 0) + + +def process_file(aclient: EthAppClient, + input_file_path: str, + filtering_file_path = None, + autonext: Callable = None) -> bool: global sig_ctx global app_client + global autonext_handler app_client = aclient with open(input_file_path, "r") as data: @@ -322,23 +349,31 @@ def process_file(aclient: EthereumClient, input_file_path: str, filtering_file_p domain = data_json["domain"] message = data_json["message"] + if autonext: + autonext_handler = autonext + signal.signal(signal.SIGALRM, next_timeout) + if filtering_file_path: init_signature_context(types, domain) filtr = read_filtering_file(domain, message, filtering_file_path) # send types definition for key in types.keys(): - app_client.eip712_send_struct_def_struct_name(key) + with app_client.eip712_send_struct_def_struct_name(key): + pass for f in types[key]: (f["type"], f["enum"], f["typesize"], f["array_lvls"]) = \ send_struct_def_field(f["type"], f["name"]) if filtering_file_path: - app_client.eip712_filtering_activate() + with app_client.eip712_filtering_activate(): + pass prepare_filtering(filtr, message) # send domain implementation - app_client.eip712_send_struct_impl_root_struct(domain_typename) + with app_client.eip712_send_struct_impl_root_struct(domain_typename): + enable_autonext() + disable_autonext() if not send_struct_impl(types, domain, domain_typename): return False @@ -349,7 +384,9 @@ def process_file(aclient: EthereumClient, input_file_path: str, filtering_file_p send_filtering_message_info(domain["name"], len(filtering_paths)) # send message implementation - app_client.eip712_send_struct_impl_root_struct(message_typename) + with app_client.eip712_send_struct_impl_root_struct(message_typename): + enable_autonext() + disable_autonext() if not send_struct_impl(types, message, message_typename): return False diff --git a/tests/ragger/test_domain_name.py b/tests/ragger/test_domain_name.py index 317f72d..be08ebc 100644 --- a/tests/ragger/test_domain_name.py +++ b/tests/ragger/test_domain_name.py @@ -1,7 +1,11 @@ import pytest from ragger.error import ExceptionRAPDU -from app.client import EthereumClient, StatusWord -from app.setting import SettingType +from ragger.firmware import Firmware +from ragger.backend import BackendInterface +from ragger.navigator import Navigator, NavInsID +from app.client import EthAppClient, StatusWord, ROOT_SCREENSHOT_PATH +from app.settings import SettingID, settings_toggle +import app.response_parser as ResponseParser import struct # Values used across all tests @@ -20,108 +24,182 @@ AMOUNT = 1.22 def verbose(request) -> bool: return request.param -def common(app_client: EthereumClient) -> int: +def common(app_client: EthAppClient) -> int: if app_client._client.firmware.device == "nanos": pytest.skip("Not supported on LNS") - return app_client.get_challenge() + with app_client.get_challenge(): + pass + return ResponseParser.challenge(app_client.response().data) -def test_send_fund(app_client: EthereumClient, verbose: bool): +def test_send_fund(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + test_name: str, + verbose: bool): + app_client = EthAppClient(backend) challenge = common(app_client) if verbose: - app_client.settings_set({ - SettingType.VERBOSE_ENS: True - }) + settings_toggle(firmware, navigator, [SettingID.VERBOSE_ENS]) - app_client.provide_domain_name(challenge, NAME, ADDR) + with app_client.provide_domain_name(challenge, NAME, ADDR): + pass - app_client.send_fund(BIP32_PATH, - NONCE, - GAS_PRICE, - GAS_LIMIT, - ADDR, - AMOUNT, - CHAIN_ID, - "domain_name_verbose_" + str(verbose)) + with app_client.send_fund(BIP32_PATH, + NONCE, + GAS_PRICE, + GAS_LIMIT, + ADDR, + AMOUNT, + CHAIN_ID): + moves = list() + if firmware.device.startswith("nano"): + moves += [ NavInsID.RIGHT_CLICK ] * 4 + if verbose: + moves += [ NavInsID.RIGHT_CLICK ] + moves += [ NavInsID.BOTH_CLICK ] + else: + moves += [ NavInsID.USE_CASE_REVIEW_TAP ] * 2 + if verbose: + moves += [ NavInsID.USE_CASE_REVIEW_TAP ] + moves += [ NavInsID.USE_CASE_REVIEW_CONFIRM ] + navigator.navigate_and_compare(ROOT_SCREENSHOT_PATH, + "domain_name_verbose_" + str(verbose), + moves) -def test_send_fund_wrong_challenge(app_client: EthereumClient): + +def test_send_fund_wrong_challenge(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator): + app_client = EthAppClient(backend) caught = False challenge = common(app_client) try: - app_client.provide_domain_name(~challenge & 0xffffffff, NAME, ADDR) + with app_client.provide_domain_name(~challenge & 0xffffffff, NAME, ADDR): + pass except ExceptionRAPDU as e: assert e.status == StatusWord.INVALID_DATA else: assert False # An exception should have been raised -def test_send_fund_wrong_addr(app_client: EthereumClient): + +def test_send_fund_wrong_addr(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + test_name: str): + app_client = EthAppClient(backend) challenge = common(app_client) - app_client.provide_domain_name(challenge, NAME, ADDR) + with app_client.provide_domain_name(challenge, NAME, ADDR): + pass addr = bytearray(ADDR) addr.reverse() - app_client.send_fund(BIP32_PATH, - NONCE, - GAS_PRICE, - GAS_LIMIT, - addr, - AMOUNT, - CHAIN_ID, - "domain_name_wrong_addr") + with app_client.send_fund(BIP32_PATH, + NONCE, + GAS_PRICE, + GAS_LIMIT, + addr, + AMOUNT, + CHAIN_ID): + moves = list() + if firmware.device.startswith("nano"): + moves += [ NavInsID.RIGHT_CLICK ] * 4 + moves += [ NavInsID.BOTH_CLICK ] + else: + moves += [ NavInsID.USE_CASE_REVIEW_TAP ] * 2 + moves += [ NavInsID.USE_CASE_REVIEW_CONFIRM ] + navigator.navigate_and_compare(ROOT_SCREENSHOT_PATH, + "domain_name_wrong_addr", + moves) -def test_send_fund_non_mainnet(app_client: EthereumClient): + +def test_send_fund_non_mainnet(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + test_name: str): + app_client = EthAppClient(backend) challenge = common(app_client) - app_client.provide_domain_name(challenge, NAME, ADDR) + with app_client.provide_domain_name(challenge, NAME, ADDR): + pass - app_client.send_fund(BIP32_PATH, - NONCE, - GAS_PRICE, - GAS_LIMIT, - ADDR, - AMOUNT, - 5, - "domain_name_non_mainnet") + with app_client.send_fund(BIP32_PATH, + NONCE, + GAS_PRICE, + GAS_LIMIT, + ADDR, + AMOUNT, + 5): + moves = list() + if firmware.device.startswith("nano"): + moves += [ NavInsID.RIGHT_CLICK ] * 5 + moves += [ NavInsID.BOTH_CLICK ] + else: + moves += [ NavInsID.USE_CASE_REVIEW_TAP ] * 3 + moves += [ NavInsID.USE_CASE_REVIEW_CONFIRM ] + navigator.navigate_and_compare(ROOT_SCREENSHOT_PATH, + "domain_name_non_mainnet", + moves) -def test_send_fund_domain_too_long(app_client: EthereumClient): + +def test_send_fund_domain_too_long(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator): + app_client = EthAppClient(backend) challenge = common(app_client) try: - app_client.provide_domain_name(challenge, "ledger" + "0"*25 + ".eth", ADDR) + with app_client.provide_domain_name(challenge, "ledger" + "0"*25 + ".eth", ADDR): + pass except ExceptionRAPDU as e: assert e.status == StatusWord.INVALID_DATA else: assert False # An exception should have been raised -def test_send_fund_domain_invalid_character(app_client: EthereumClient): + +def test_send_fund_domain_invalid_character(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator): + app_client = EthAppClient(backend) challenge = common(app_client) try: - app_client.provide_domain_name(challenge, "l\xe8dger.eth", ADDR) + with app_client.provide_domain_name(challenge, "l\xe8dger.eth", ADDR): + pass except ExceptionRAPDU as e: assert e.status == StatusWord.INVALID_DATA else: assert False # An exception should have been raised -def test_send_fund_uppercase(app_client: EthereumClient): + +def test_send_fund_uppercase(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator): + app_client = EthAppClient(backend) challenge = common(app_client) try: - app_client.provide_domain_name(challenge, NAME.upper(), ADDR) + with app_client.provide_domain_name(challenge, NAME.upper(), ADDR): + pass except ExceptionRAPDU as e: assert e.status == StatusWord.INVALID_DATA else: assert False # An exception should have been raised -def test_send_fund_domain_non_ens(app_client: EthereumClient): + +def test_send_fund_domain_non_ens(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator): + app_client = EthAppClient(backend) challenge = common(app_client) try: - app_client.provide_domain_name(challenge, "ledger.hte", ADDR) + with app_client.provide_domain_name(challenge, "ledger.hte", ADDR): + pass except ExceptionRAPDU as e: assert e.status == StatusWord.INVALID_DATA else: diff --git a/tests/ragger/test_eip712.py b/tests/ragger/test_eip712.py index 29cb843..729c4a6 100644 --- a/tests/ragger/test_eip712.py +++ b/tests/ragger/test_eip712.py @@ -2,10 +2,17 @@ import pytest import os import fnmatch from typing import List -from app.client import EthereumClient, SettingType +from ragger.firmware import Firmware +from ragger.backend import BackendInterface +from ragger.navigator import Navigator, NavInsID +from app.client import EthAppClient +from app.settings import SettingID, settings_toggle from eip712 import InputData from pathlib import Path from configparser import ConfigParser +import app.response_parser as ResponseParser +from functools import partial +import time BIP32_PATH = "m/44'/60'/0'/0/0" @@ -30,19 +37,52 @@ def filtering(request) -> bool: return request.param -def test_eip712_legacy(app_client: EthereumClient): - v, r, s = app_client.eip712_sign_legacy( - BIP32_PATH, - bytes.fromhex('6137beb405d9ff777172aa879e33edb34a1460e701802746c5ef96e741710e59'), - bytes.fromhex('eb4221181ff3f1a83ea7313993ca9218496e424604ba9492bb4052c03d5c3df8') - ) +def test_eip712_legacy(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator): + app_client = EthAppClient(backend) + with app_client.eip712_sign_legacy( + BIP32_PATH, + bytes.fromhex('6137beb405d9ff777172aa879e33edb34a1460e701802746c5ef96e741710e59'), + bytes.fromhex('eb4221181ff3f1a83ea7313993ca9218496e424604ba9492bb4052c03d5c3df8')): + moves = list() + if firmware.device.startswith("nano"): + moves += [ NavInsID.RIGHT_CLICK ] + if firmware.device == "nanos": + screens_per_hash = 4 + else: + screens_per_hash = 2 + moves += [ NavInsID.RIGHT_CLICK ] * screens_per_hash * 2 + moves += [ NavInsID.BOTH_CLICK ] + else: + moves += [ NavInsID.USE_CASE_REVIEW_TAP ] * 2 + moves += [ NavInsID.USE_CASE_REVIEW_CONFIRM ] + navigator.navigate(moves) + + v, r, s = ResponseParser.signature(app_client.response().data) assert v == bytes.fromhex("1c") assert r == bytes.fromhex("ea66f747173762715751c889fea8722acac3fc35db2c226d37a2e58815398f64") assert s == bytes.fromhex("52d8ba9153de9255da220ffd36762c0b027701a3b5110f0a765f94b16a9dfb55") -def test_eip712_new(app_client: EthereumClient, input_file: Path, verbose: bool, filtering: bool): - if app_client._client.firmware.device == "nanos": + +def autonext(fw: Firmware, nav: Navigator): + moves = list() + if fw.device.startswith("nano"): + moves = [ NavInsID.RIGHT_CLICK ] + else: + moves = [ NavInsID.USE_CASE_REVIEW_TAP ] + nav.navigate(moves) + + +def test_eip712_new(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + input_file: Path, + verbose: bool, + filtering: bool): + app_client = EthAppClient(backend) + if firmware.device == "nanos": pytest.skip("Not supported on LNS") else: test_path = "%s/%s" % (input_file.parent, "-".join(input_file.stem.split("-")[:-1])) @@ -63,12 +103,25 @@ def test_eip712_new(app_client: EthereumClient, input_file: Path, verbose: bool, if not filtering or Path(filter_file).is_file(): if verbose: - app_client.settings_set({ - SettingType.VERBOSE_EIP712: True - }) + settings_toggle(firmware, navigator, [SettingID.VERBOSE_EIP712]) - assert InputData.process_file(app_client, input_file, filter_file) == True - v, r, s = app_client.eip712_sign_new(BIP32_PATH) + assert InputData.process_file(app_client, + input_file, + filter_file, + partial(autonext, firmware, navigator)) == True + with app_client.eip712_sign_new(BIP32_PATH, verbose): + time.sleep(0.5) # tight on timing, needed by the CI otherwise might fail sometimes + moves = list() + if firmware.device.startswith("nano"): + if not verbose and not filtering: # need to skip the message hash + moves = [ NavInsID.RIGHT_CLICK ] * 2 + moves += [ NavInsID.BOTH_CLICK ] + else: + if not verbose and not filtering: # need to skip the message hash + moves += [ NavInsID.USE_CASE_REVIEW_TAP ] + moves += [ NavInsID.USE_CASE_REVIEW_CONFIRM ] + navigator.navigate(moves) + v, r, s = ResponseParser.signature(app_client.response().data) #print("[signature]") #print("v = %s" % (v.hex())) #print("r = %s" % (r.hex())) From 510a935e26347e71a8211a2659bbe9fc3e9cb99c Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Mon, 15 May 2023 15:46:22 +0200 Subject: [PATCH 31/85] Fix EIP712 fast autonext timer disrupting speculos for Stax --- tests/ragger/eip712/InputData.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/ragger/eip712/InputData.py b/tests/ragger/eip712/InputData.py index da382d8..6dd6471 100644 --- a/tests/ragger/eip712/InputData.py +++ b/tests/ragger/eip712/InputData.py @@ -325,8 +325,12 @@ def next_timeout(_signum: int, _frame): autonext_handler() def enable_autonext(): - delay = 1/4 - signal.setitimer(signal.ITIMER_REAL, delay, delay) + seconds = 1/4 + if app_client._client.firmware.device == 'stax': # Stax Speculos is slow + interval = seconds * 3 + else: + interval = seconds + signal.setitimer(signal.ITIMER_REAL, seconds, interval) def disable_autonext(): signal.setitimer(signal.ITIMER_REAL, 0, 0) From 8f4fb59ec036aa84966e7572874267ef4af70606 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Mon, 15 May 2023 15:46:43 +0200 Subject: [PATCH 32/85] Updated Ragger --- tests/ragger/app/settings.py | 2 +- tests/ragger/requirements.txt | 2 +- tests/ragger/test_eip712.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/ragger/app/settings.py b/tests/ragger/app/settings.py index 435e21a..48d78cc 100644 --- a/tests/ragger/app/settings.py +++ b/tests/ragger/app/settings.py @@ -59,4 +59,4 @@ def settings_toggle(fw: Firmware, nav: Navigator, to_toggle: list[SettingID]): if setting in to_toggle: moves += [NavIns(NavInsID.TOUCH, get_setting_position(fw.device, setting))] moves += [NavInsID.EXIT_HEADER_TAP] - nav.navigate(moves) + nav.navigate(moves, screen_change_before_first_instruction=False) diff --git a/tests/ragger/requirements.txt b/tests/ragger/requirements.txt index e408ead..818749b 100644 --- a/tests/ragger/requirements.txt +++ b/tests/ragger/requirements.txt @@ -1,4 +1,4 @@ -ragger[speculos]>=1.6.0,<1.7.0 +ragger[speculos]>=1.7.0,<1.8.0 pytest ecdsa simple-rlp diff --git a/tests/ragger/test_eip712.py b/tests/ragger/test_eip712.py index 729c4a6..6ff0bc7 100644 --- a/tests/ragger/test_eip712.py +++ b/tests/ragger/test_eip712.py @@ -72,7 +72,7 @@ def autonext(fw: Firmware, nav: Navigator): moves = [ NavInsID.RIGHT_CLICK ] else: moves = [ NavInsID.USE_CASE_REVIEW_TAP ] - nav.navigate(moves) + nav.navigate(moves, screen_change_before_first_instruction=False, screen_change_after_last_instruction=False) def test_eip712_new(firmware: Firmware, From cea6f2baa7149cb1563aec6bac18e35e2d944985 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Mon, 15 May 2023 17:33:08 +0200 Subject: [PATCH 33/85] Added golden snapshots for Stax Ragger tests --- .../stax/domain_name_non_mainnet/00000.png | Bin 0 -> 8435 bytes .../stax/domain_name_non_mainnet/00001.png | Bin 0 -> 15045 bytes .../stax/domain_name_non_mainnet/00002.png | Bin 0 -> 7485 bytes .../stax/domain_name_non_mainnet/00003.png | Bin 0 -> 9348 bytes .../stax/domain_name_non_mainnet/00004.png | Bin 0 -> 5086 bytes .../stax/domain_name_verbose_False/00000.png | Bin 0 -> 8435 bytes .../stax/domain_name_verbose_False/00001.png | Bin 0 -> 10942 bytes .../stax/domain_name_verbose_False/00002.png | Bin 0 -> 9348 bytes .../stax/domain_name_verbose_False/00003.png | Bin 0 -> 5086 bytes .../stax/domain_name_verbose_True/00000.png | Bin 0 -> 8435 bytes .../stax/domain_name_verbose_True/00001.png | Bin 0 -> 14741 bytes .../stax/domain_name_verbose_True/00002.png | Bin 0 -> 7822 bytes .../stax/domain_name_verbose_True/00003.png | Bin 0 -> 9348 bytes .../stax/domain_name_verbose_True/00004.png | Bin 0 -> 5086 bytes .../stax/domain_name_wrong_addr/00000.png | Bin 0 -> 8435 bytes .../stax/domain_name_wrong_addr/00001.png | Bin 0 -> 15550 bytes .../stax/domain_name_wrong_addr/00002.png | Bin 0 -> 9348 bytes .../stax/domain_name_wrong_addr/00003.png | Bin 0 -> 5086 bytes 18 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/ragger/snapshots/stax/domain_name_non_mainnet/00000.png create mode 100644 tests/ragger/snapshots/stax/domain_name_non_mainnet/00001.png create mode 100644 tests/ragger/snapshots/stax/domain_name_non_mainnet/00002.png create mode 100644 tests/ragger/snapshots/stax/domain_name_non_mainnet/00003.png create mode 100644 tests/ragger/snapshots/stax/domain_name_non_mainnet/00004.png create mode 100644 tests/ragger/snapshots/stax/domain_name_verbose_False/00000.png create mode 100644 tests/ragger/snapshots/stax/domain_name_verbose_False/00001.png create mode 100644 tests/ragger/snapshots/stax/domain_name_verbose_False/00002.png create mode 100644 tests/ragger/snapshots/stax/domain_name_verbose_False/00003.png create mode 100644 tests/ragger/snapshots/stax/domain_name_verbose_True/00000.png create mode 100644 tests/ragger/snapshots/stax/domain_name_verbose_True/00001.png create mode 100644 tests/ragger/snapshots/stax/domain_name_verbose_True/00002.png create mode 100644 tests/ragger/snapshots/stax/domain_name_verbose_True/00003.png create mode 100644 tests/ragger/snapshots/stax/domain_name_verbose_True/00004.png create mode 100644 tests/ragger/snapshots/stax/domain_name_wrong_addr/00000.png create mode 100644 tests/ragger/snapshots/stax/domain_name_wrong_addr/00001.png create mode 100644 tests/ragger/snapshots/stax/domain_name_wrong_addr/00002.png create mode 100644 tests/ragger/snapshots/stax/domain_name_wrong_addr/00003.png diff --git a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00000.png b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..a23d9177c3caeaee251141b056d94ed980f4bb5a GIT binary patch literal 8435 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 OK5L6x=JnUSlm825`x|rs literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00001.png b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..25278595239f5dad36d574d40b68a59e5512c75d GIT binary patch literal 15045 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 XxbCHaqOicrlekbaVUB30700{$f literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00003.png b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..50df3498127a21582b14f2b69375b5f885b7217f GIT binary patch literal 9348 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�lMY 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 literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_False/00000.png b/tests/ragger/snapshots/stax/domain_name_verbose_False/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..a23d9177c3caeaee251141b056d94ed980f4bb5a GIT binary patch literal 8435 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 OK5L6x=JnUSlm825`x|rs literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_False/00001.png b/tests/ragger/snapshots/stax/domain_name_verbose_False/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..5e0c0a941e4f5ae45c5b4363de7a1b62a585bf1d GIT binary patch literal 10942 zcmeHtdpK0>+crW<(o>2MDr7I&mR%Cr4M}9k?qOnVMr1qoDxPd3jSwQ6vTwv-j8U?k zG$O`eW|GasFcTAlY511k_Z`Rg{{6kj`~KcPzV+W)$6EJ&uj{(+>$=YKyq?^&y&-g1 z{4f_6myo5!^;=wA+)ufT3f5@VHHTSOE zMLEwyHiw*f@)G5)9&$;}laaGHbSqiWi=y7p(i|F2X0`~ftRu|($e>W}2KsN9F zxi}aji^h^eB7l+h?9%YOef<&+dFC$INo5(Gaka z%HJ7pX;Wfja12y@uq)(*Zc%Lmt<1mjEs6g?RFW#SslxhXe~4HL1iUH5?0caFilg9} zf9~r|o;MaqHozO=mD4`17Mj`T$y%aHdS<^*Fxc_AvR+~lkzoc>t`HU*Lye{~+tH9( zmqmy3GQ}v%=Vl32M?@Cu^4wyyy%$(84yl40TatbKl`li1i!lwm6Upde z_=4p*but1!ow*xPU}0R=!G#1ly+BkgE>nWSlB<|e%b-RdKMWHBjScK|^kT4cH}TAg zm)L-DB1u1yH6`C9TOUXluzafMz#vmjqzjAcS_WYbXbcW%Klnw$;FR$%2nUXvXu0oLDDdRS4qVh`@N$b#e&_T!KgqrfJwQG;m1u`F5w^}PkBqKH zzk+hII=@D1EcFw=mV+9c?gfn=4?Px@-jW1S?>{|twd0yA9|Ck0oC$Gslv7+>ycdb9 zsj2vot|8Ay_FH{Al65du=byQ@ni`=y{PWRjwKjk=E6UtnK9_x>FKd%qp>P;{TD^AG z5HHwsfB2ZT0MA>i<&5$-kr0(cU+3{2q@~7j=gkRwR}cmV4_g`=4_77F;x7Gm()@Vw z{Ta3CFB{6=vio1VUHfoGG4amMl~O#MEif7q(>7!>>d$=cbUbf*;*jU3O_W7^(E0bI_vnSGmt6^ zuu3m6b9*h0d1Am2PwDqqqdo8iJaY++rZ8^Ru-7=a)^l)5uz5WNh zs#=QCn~O)Jb)X>dckiEFX6u4lASRR9y!+M|xJ>a^YH2%cHaoQah#}4!c;{K5q_c3p zRfNC^UX#eV)Sd>>?8H$mw{1yN*KE*B8G&5cLp>v64v5OQ7bAE)o)gdL`k)O-vTI&_ zdLQCQ?;buXrAuTapDklQN|zCs@f8HYH4{jTNY{&5a}#!r1loWdA&<{U*!K{-Jq}}l z4@OP@c(PfpFfYA+y?4T{=i>VlKBODE4T^%XQak}RVkseGxyN5aPJ{ig{REPtp~MEQfSDyBRN9@83zp`IliG`U!t{=Q1(6`{|tZjG@` z6*?rnsh**M^}p?x@$ShSdv`S=1_Zv^l6ipUb`amgadO-MJW$wY;FGbvyNlp*d+L;q zuB~w>!Qs(#yv|LR^Mb1!Ir%1W16!V&mdgBhZbFjj+Jg2>l{GDl>Wl zqP0Kxy}9lkxX;d)g)qlcTL!w|GLb+3-&MrBl^TxCn>Cl zG6FsK;}#mfY7Nic|9<*Sw>k>sDa26_NLInk=L}#AI{Cb9+z4r*r?wi2GELXTQZ_Zp z`(7+IYJr}~J}LLBJ!5E!fQG?0i65g9Ybh|2+;w84z6`Y}%R$fyB69NW$P&GJTQBv{zWmaA^ zr>4fmmn*IO>9ZHefRd27a4!CmxxjM$Vgvw_!B0glv)dIf)0V5#MSBhOU ze;?P4uwG(YOfE#jVuEr#_R~`!DsMOcOhK9!C{qIho>EN}^Nyt$m*O{{(}AHrE5n_0 z6?K3klaqkzgM>&5gQD79ht8=pC{#H^JP!GplpYujq*v%dbO~>{K0@-VzfYt(m;2($ zq;Z#2xw*GwKHkxwXg!qbNn0?vCBE`nr26{d6TiA?n7=I)`dbaxD`Q5B&ewOnaK_T# z1Nk-*C4cG<$J#w{ z!Lu^PhNbw>%#u|`SfkusN{RtKy}ZeqY>0nGjNE^*>kE|`(|9T8%NK_`mj@~dPd%AdLJ7hH*j#KlyFJgu?$(3cXNyGU$*^q_! z7}QFa`m_$zlA+d@@K?9`TAI`Z5JY1OA{`w!uzMUv1UfwC7!WBF5?F{S28%!o_sI@- z10I(l^KlEOg<2!f#lM#pUD_#%z=`}k5=o=1M$DBe{fe+F?U`DQ*p#u!orhz{4A%52 z0#eZFm$4)y%IZ}}Q_IHzvDdwE)MRUW`!w+_dkjY8#2e=c28gSycxqbaGPhq+qjP1? zgWQ@av<-hs9yPj);jxFTyc=rtmBlf@1L<-hG-TR|&~nC&2m8$-^%0dxr2h$+08x&Ie902ys|bcKGzE6fasetT8R= zY9U^@x{s#S@0*mg{(KQqKj6ljK`ayz8Xgz&@D7|1&mCT(p9-1t{^_3Y=opufz+kbR{+UcRoxK#ww2AqX4h=pD*#h-`dYe!jmwkxloi&S@C zxo`t#^B6Dv9`7lmKK`WfE1n&SzkV%K%H)rY z>$hKZ@WlkHn|hj{g%+D)DOeH=*7m*%n$q-YcFDEFYDc-7-{G+^F4Lk>gG;Yf`OFo3}Y?oGjm4BPoA-svmevy*j`!BihQyH zZxUMK%*nqu4ui(DK<81EnfXEZ9-FdPar)BAROg5D@@n6lTRprp{v3|ll`$IaORDT8 z5c2=bVYfHAD~*1QN_yKAR(W`MusL0k2UtmsD&KfTw!6EP(yk$j5Rh#qbIheUuj;Ma zkVwi|T_rA&?ayatVWCpZDYA)Nw;snp?O6a>74PN zCv5w(6yhoM_jq_v=^B;YrE(P_E8zFLz`5 z8`DBA(1LHNKq1nXtX#O41EbUD$Ck9n;kobOg6v~yWZzE*ZhGM^tFQ)L+%}!p6-K)>d*UScWXZovL#|6{ADgRIUdKkucrk%k>Z7bV1$%$qhFAxz2~<#OgAR?HsXwN zNU{|1ld4_yv(5nJtU0^5a`9i{MH@{%oBnUc&Zfc`vo0c!4e|SBOiC9+7xb*^ExKUd zeoPByS6@?81(m&&A}$|3b@k9*D2fOq)6i+I%axO>Cv9ht3WuX{USd<4M_^$*&Yl1= zXRraJYKy@+$x{f}jbLU! zfOVCSJbDn%bcxeil0In`VpK|nK`D8ztrm`$Yh* z`*8Brdv9G#&hP1e6V7cQesUZ5^elr{PR5-7p@W5VeI#GO`=PGEFjBM14G!? z3NB+pyfQjR>lD)V>y^>GN8$xAQPNw#m~IwKJxQ*}@UH9L(~8dnJdd3`LBvsJrvV-U zvtDejU}}ddo#+;kIEY|H#`P?P4Iw|v6K?L6*C<&^$LI|Ay|lRR`oOSr zVzA@Rw^nt`&>PmLg> z+PiLac;B*;Z$3pcJOiEnUb6PGtMX-kAgG6!-av^mk$XjQpr^`Vr1VKfNJxN5;+vWp zUC|+AnCPj=$_mnBkuhR#X}$HCqACE!xz!uRS)(u2wh(V#Iq<@deYT9n@D7cw^X<=u z7EX0)q*DXHy(PlCHz_A6W4oSdBGp6MaUw{WmTBcFKJet ze%8>}fYemeSb%A|3s<{zIVj^v`5TF=mwrFPMb2O>H~}!eS@!OBECRm5+kTteLB79( z=%2HnXlvD(Q#sqzM*vC}A<^`zkvpT?|Xhq>T?{ilf1*7hXIh$*aN#cgLr)!Y|Kn#a>4hlcm=1_hmS%!4K)=&|Wlo!@cKWC!z5 zN5%!}4$@idt<}jny%P45pj*tCbmNt;ch&NpayF8}jY>uHK3*VhmC%K6xNgco4fo93 zUZ;?2-1ihxNibjOC*r(7O=oiKwqy8};`v^rig0RA-8XUtFsa?xH={@PLn&T<8H%`D zQoW1OWIWzZ`NV4lxSs6$@rZ=4>tWh#Y=~rk$O=2&jZi&i=?^Phq*D7ip&zS>t*I?Y zC6?XrX0HyBfs{h9Z#U5Y=_&Rp(EofF%#=u{Fd~7nO??H9$@&xa()B^4jlb&xJ09f- zW32)pd`eveaPQpe$FO*OLu7S=E(0%F=`XX?XVTLNquJtI$yS?~~{&K8^dEPpMK6fuuW7flz z-SR*{@QabD5Zu|+yz5uJBIQpJ;Sc#oK28qLG{C2tyTcBy&Z>tv)%Fo(Tw}#~vC@Wh zCc^0BWNhiP<;}Y#E`Ygj*yrt6+NKwrXI3wi$ew1ngM3(QiIRcz3ul}7GfNxaue>vi z+gKSYq`3Ym+b3kkL?2W^mG*wcC4fCSfBw|faVrIO)|EjEbJWMFs#ao@MqS@al>vW3 zm?p<8cvU8Q_do5tV=tof9e!b;0}VGPO0fe5wc(4khbB>?}yX2;A|0~~}Obi;v# zPK?RRx>3ei`g9-$0{p*GLj$d6R%Q?J*v-L8mF7-Vd;VP3vV_{`@iz6&-xia>J4u`$ zz!b3n$&4o1?w;ZO;DEkkD)hoAQ=n3Z?vht*jf=(lfs+xu zR;G%@Vj*lWw52L$yyM=_`+5UD32ubD#mo<4$BlI23qO~H73o2my@0i=%>ZOK1CFs} z+?WnHKq#HUF=y1A>ub_lUYDkIi)*cQ?tXIQk(dCyrb;*a27nB>Kia{zNagx{_T6SR zgT!;Z6Ef%wKOZH6;bOJAz6%&|85$s=f*RZ!31DR%LLjPi7tuc5y1)&j%PI`urQ)+?Y^&5=*KRGeIWhI z!FX)2i6-Zq6>f7%-u<%P0$pRqYZ05+Ej~y7fegQZm}qChz$_myYYXhaoK8mZO(IWw|=wFr{TN0%rE__YGr2 zb9qcYIyFOo{xeH*!AX+@-CaWclX!)9!h5b+(=_f;YEnzvBI{JC_MLH|IzEyzZ8q=@ zW7uNNQlQQfu72y8*|@3M%9-K*>~g++Uk-J?;ztH+qf;=~*bXQw z$0mJeK`NIZ(9z_=1iLj<6JGgrLh@OoBl{}Tgx9}ca{6~kH~-V5xBqX4|16X9KS4ovpoRB-Y>q}2 zp#|BLznTl*wQV^CNBk%%bX~oqY<$JWM3^=_gbW;x4L_*2FCan=Z{OEzyJ04l0+1<; zYki>B8csaLwaKxW!M4n`k-in4?h8J}`=MvpCFXQ=v%LtBd2%jzsNTn^1p`qf;A1kYVqz5i>I_&-E z5L^ENh0OsZef^QAYXCiUf^C8UNI7n3fTVc;JFU-IohfP7d*v}DY63hU#&sl0;m%2)1pZqDD_~Sm3-VLvAr;^YZF4x$#u*QrOc+pw3L}PSCR0$O*lvCUU zH%HynPLi8kq8%`XH>0aF4(s+m{lx+1i;fI%T9Xl&uZ<_FG_Ex0T2*{p+Z?cy zJ}N<_FId*PqUxQdW@1`HhL@}}WSYp9_wLW!iKXOoEyE1Lng(g<*+PnKTX_hP1TkJ^ z*1A6ND}9T9@>tS_&gT4Wu@rle!Hn!qH5|w_Wq0R-dEc>udoHnlmTRdT^z)eQ;(1VS zh{3lHf0}Av#UJ3I1^Jk_wg~uf$JoY!LyB@q;uVW)uWjR92pd~(?k~8z2V1pHb*%;m z{5j}7$_YxT3OB#!k2X|CuYK~aijmBEnU{C;dlUg$u?6T!a^f`BCD?RU5l7Z_Ji=}} zvr`eQ^v5 zjCW0*Tk|6vYwIsj*=;54SXlcQ&VTB14PG0Z zudx_*CEP<8h}EVPmMGz_<2W9lO^vq9mCWv60DTHrOOMg#3Aj0?mD=O=v)W6n1W%O_ zIQ1>?K~qi5Fx%aO84U8L&Si+q(NbkektJq_Gg=acYC{?1bd)-B>8(hHkf$5 zlNZ~D@*a)L?aqM|3^!ImQ>r|Rs@~FELW3HXApNNKjdpMSclwZHWN~w&r{vY@P7ra$ ztEG9fYnG~mnIfN2-95jZUH(A-Q&ld5O)8xt)=nIZ!cyk+B8+Ec1l01=(Zc|Wmj(_z zYGnk`#h^x$NoF`e1u{alW7`zc;KtM^rCc4rAahBOy@45ZbM_rEv#)@# zKw$u4K$jnCg@Z12o*>=Y`HMi)#y^;rnr?1$Z`AqwhhCR^<9W*Lc?ne3tX>w=0Cjr# z3%wXmWpm=Ol%Rjwq>Ej%8Ei1ZO-)oEL%Pzr+Sf`8!BSo;_{YJ(20b^w9yH)MBjW)MKtZ;U@Q1L{!l4Y(6Zbf=E8Pm8u(}C410+}3Zb9GnCrxz7& z9C{_{dq`Td4^XZ*b_d)tyzks;ar*hlON{r!$n}jGWP~-Vh{&E^TQdkIjy5R*ts8NY z$^twn)34*j_6S|b9!h&uL?^_y+Cj2Ef;~aijAPjC%&ZL6O$=zIo!jn>F1h3ANPAGU z4osBP@|3~upZm&jXf8lf7_Ji24tM%qkO$M3Agc%xc739(tv$zdO3c9#xQ0D&%kPjX zKzk9hvkD48vp7nATUbxP1iAEgJ25W2R;cGDkOsn)n@U)f>uUgfSz%Rk%58HiHgx^5 zpKri#nI>st>PYJ>6>|!M)%yC~$%2lZ?d=>^!1*NrTi*UUgE3xuAn|sh>toGhp}(B7 zEq$$a&zR+eC8w4937H2L0(42)>%Zqe6Fwm$aAhko@3cT9FMx=@LlsT3)DsXSe!d(T3AKTvjPNZh|oqu(H ziz@;`6vqvSDG4Os`SN5^jS4g^^jX|c)6P%GhbU4`9e3|y*iqQej8HlLLB7#+=>z6X zqj5SCx2nemS68QvS#-HEG>J~7UI2}iUD+RS$m<@!w(3b9O*Lhlk-wK|g%I+Z>2yvI zMreT&;^P4W#u(4?#UzYUb#B+&ycxuzeU+LdapEZ%bv;N*LA|2@-KB=M0dyp&=UW4< zD6}T?q1|m3yqvimi*YA0B3Qf$0VX3`47lH1*#haK{A2VbTxRx~naxL7pvOBv3Q2NH zg?PNj<}Aff<{wDx^$xB#DAJm$VtIa=c?yXiQi&WTxZTu5{%nuzo%qBzR?nXicsW$o z=CTxAS4y~!TscecjsSa-7_6MPrDbOI=l6%1_OH}WY7sO2C^vJ`l75Z1y%4J(YMDDf z>$p3H+k`2KHiip-pP2tL03K+U5Cr$nr&x=noEQCIBTJx!84I-^>0bO=_kaBCW|Rhs zEynv!)Ehpu@%l|Zg143G51E<1A*P6q!hwDJPrbAXDC`qE!TVwHLhs7zZ}X~gDxG5q z1Q-8zM|=;JLgs%Wb;UR0u;?RjK>JhmJ#$Sk3q@5;c^Uc#PXe5!>-5M-!t~=E_V)I> z3l-%G@J+YeB)e;#m_iWH6*Q-JZ-vX|25|SXXNY;%R@;cpbM^bPi>Vv_Ga{1C8B+hf dO`BT@(B>db1Nc=u(3i?(X=Z!9;hJai{{o95w~YV* literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_False/00002.png b/tests/ragger/snapshots/stax/domain_name_verbose_False/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..2d6b095b8b7856ce0c19502a1fbd21cfb09c22a7 GIT binary patch literal 9348 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 Hr&@6SYv%)Dpx*fk`X6sWp?+ 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 literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_True/00000.png b/tests/ragger/snapshots/stax/domain_name_verbose_True/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..a23d9177c3caeaee251141b056d94ed980f4bb5a GIT binary patch literal 8435 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 OK5L6x=JnUSlm825`x|rs literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_True/00001.png b/tests/ragger/snapshots/stax/domain_name_verbose_True/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..ad8f077559185ed6d5ed737c4a342b719ca39a08 GIT binary patch literal 14741 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 literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_True/00002.png b/tests/ragger/snapshots/stax/domain_name_verbose_True/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..e64dacc0fa17a23f11fcaf4746b5bfac9dc56b93 GIT binary patch literal 7822 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�lMY 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 literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/stax/domain_name_wrong_addr/00000.png b/tests/ragger/snapshots/stax/domain_name_wrong_addr/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..a23d9177c3caeaee251141b056d94ed980f4bb5a GIT binary patch literal 8435 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 OK5L6x=JnUSlm825`x|rs literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/stax/domain_name_wrong_addr/00001.png b/tests/ragger/snapshots/stax/domain_name_wrong_addr/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..3e505d39daec60dd7f66f7b9c7e3c7e8ce937f39 GIT binary patch literal 15550 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 Hr&@6SYv%)Dpx*fk`X6sWp?+ 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 literal 0 HcmV?d00001 From d1d5685198bd2f105f0c440081f74e821485feb7 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 16 May 2023 11:24:58 +0200 Subject: [PATCH 34/85] Enabled CI for Stax --- .github/workflows/ci-workflow.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index 3e15b79..4c9118a 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -171,7 +171,6 @@ jobs: with: upload_app_binaries_artifact: "ragger_elfs" flags: "DEBUG=1 CAL_CI_KEY=1 DOMAIN_NAME_TEST_KEY=1" - run_for_devices: '["nanos", "nanox", "nanosp"]' jobs-ragger-tests: name: Run Ragger tests @@ -180,4 +179,3 @@ jobs: with: download_app_binaries_artifact: "ragger_elfs" test_dir: tests/ragger - run_for_devices: '["nanos", "nanox", "nanosp"]' From b3bcaea44acc7495c2c9234d38f1146638b308e4 Mon Sep 17 00:00:00 2001 From: apaillier-ledger Date: Tue, 16 May 2023 12:45:41 +0000 Subject: [PATCH 35/85] [create-pull-request] automated change --- ethereum-plugin-sdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethereum-plugin-sdk b/ethereum-plugin-sdk index a4b971f..b9777e7 160000 --- a/ethereum-plugin-sdk +++ b/ethereum-plugin-sdk @@ -1 +1 @@ -Subproject commit a4b971f67980694d8c3862e793859209bc525545 +Subproject commit b9777e7a81a9c33b3f8997ffa23396fa2b3f861d From 5f7cc79f16107a10e45f6aa2ee9a895a574dc730 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 16 May 2023 18:18:08 +0200 Subject: [PATCH 36/85] Limit caller_type struct handling for only Stax --- src/main.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main.c b/src/main.c index 08113ae..ac4bd30 100644 --- a/src/main.c +++ b/src/main.c @@ -69,7 +69,9 @@ bolos_ux_params_t G_ux_params; const internalStorage_t N_storage_real; +#ifdef HAVE_NBGL caller_app_t *caller_app = NULL; +#endif chain_config_t *chainConfig = NULL; void reset_app_context() { @@ -957,6 +959,7 @@ void coin_main(libargs_t *args) { if (args->chain_config != NULL) { chainConfig = args->chain_config; } +#ifdef HAVE_NBGL if ((caller_app = args->caller_app) != NULL) { if (chainConfig != NULL) { caller_app->type = CALLER_TYPE_CLONE; @@ -964,6 +967,7 @@ void coin_main(libargs_t *args) { caller_app->type = CALLER_TYPE_PLUGIN; } } +#endif } if (chainConfig == NULL) { init_coin_config(&config); From 52e6c29aaeee65505a9d9344f96827fd1608518d Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 16 May 2023 18:22:44 +0200 Subject: [PATCH 37/85] BLE handling for all BLE-enabled devices --- src/handle_swap_sign_transaction.c | 6 ++---- src/main.c | 6 +++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/handle_swap_sign_transaction.c b/src/handle_swap_sign_transaction.c index 7eb0e27..3a7fcd0 100644 --- a/src/handle_swap_sign_transaction.c +++ b/src/handle_swap_sign_transaction.c @@ -78,13 +78,11 @@ void handle_swap_sign_transaction(chain_config_t* config) { USB_power(1); // ui_idle(); PRINTF("USB power ON/OFF\n"); -#ifdef TARGET_NANOX +#ifdef HAVE_BLE // grab the current plane mode setting G_io_app.plane_mode = os_setting_get(OS_SETTING_PLANEMODE, NULL, 0); -#endif // TARGET_NANOX -#ifdef HAVE_BLE BLE_power(0, NULL); - BLE_power(1, "Nano X"); + BLE_power(1, NULL); #endif // HAVE_BLE app_main(); } diff --git a/src/main.c b/src/main.c index ac4bd30..6967042 100644 --- a/src/main.c +++ b/src/main.c @@ -989,10 +989,10 @@ void coin_main(libargs_t *args) { TRY { io_seproxyhal_init(); -#ifdef TARGET_NANOX +#ifdef HAVE_BLE // grab the current plane mode setting G_io_app.plane_mode = os_setting_get(OS_SETTING_PLANEMODE, NULL, 0); -#endif // TARGET_NANOX +#endif // HAVE_BLE if (!N_storage.initialized) { internalStorage_t storage; @@ -1020,7 +1020,7 @@ void coin_main(libargs_t *args) { #ifdef HAVE_BLE BLE_power(0, NULL); - BLE_power(1, "Nano X"); + BLE_power(1, NULL); #endif // HAVE_BLE #ifdef HAVE_DOMAIN_NAME From 25ace8ab6aba19a80df8c4f31712d209b95e34c0 Mon Sep 17 00:00:00 2001 From: Benjyskan Date: Wed, 31 May 2023 18:33:12 +0200 Subject: [PATCH 38/85] clean dataContext.tokenContext.data buffer between each plugin call to avoid unwanted data in last parameter when it isn't full length. (#434) --- src_features/signTx/logic_signTx.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src_features/signTx/logic_signTx.c b/src_features/signTx/logic_signTx.c index c3074db..7d8cd37 100644 --- a/src_features/signTx/logic_signTx.c +++ b/src_features/signTx/logic_signTx.c @@ -136,6 +136,7 @@ customStatus_e customProcessor(txContext_t *context) { } dataContext.tokenContext.fieldIndex++; dataContext.tokenContext.fieldOffset = 0; + memset(dataContext.tokenContext.data, 0, sizeof(dataContext.tokenContext.data)); return CUSTOM_HANDLED; } From 1edf9cdb6a22c857de7968568e1fb353e23428b8 Mon Sep 17 00:00:00 2001 From: Adrien Lacombe Date: Wed, 14 Jun 2023 10:53:46 +0200 Subject: [PATCH 39/85] add S+ (#437) --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- README.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 711779d..a141a2d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -15,7 +15,7 @@ Describe your issue in as much detail as possible here. * OS and version * branch that causes this issue -* Device (Nano S, Nano X, Ledger Blue) +* Device (Nano S, Nano S Plus, Nano X, Ledger Blue) ## Steps to reproduce diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index f8abc52..031ba33 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -15,4 +15,4 @@ Describe your issue in as much detail as possible here. * OS and version * branch that causes this issue -* Device (Nano S, Nano X, Ledger Blue) \ No newline at end of file +* Device (Nano S, Nano S Plus, Nano X, Ledger Blue) diff --git a/README.md b/README.md index 789a604..0293c31 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@

app-ethereum

- Ethereum wallet application for Ledger Blue, Nano S and Nano X + Ethereum wallet application for Ledger Blue, Nano S, Nano S Plus and Nano X
« Explore the docs »
@@ -42,7 +42,7 @@ ## About the project -Ethereum wallet application framework for Nano S and Nano X. +Ethereum wallet application framework for Nano S, Nano S Plus and Nano X. Ledger Blue is not maintained anymore, but the app can still be compiled for this target using the branch [`blue-final-release`](https://github.com/LedgerHQ/app-ethereum/tree/blue-final-release). ## Documentation From 02cdc23751ac53200c93e97f1a17b461149af28c Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Fri, 30 Jun 2023 14:05:46 +0200 Subject: [PATCH 40/85] Rename called_from_swap to G_called_from_swap --- src/eth_plugin_handler.c | 2 +- src/handle_swap_sign_transaction.c | 2 +- src/main.c | 4 ++-- src/shared_context.h | 2 +- src_features/getEth2PublicKey/cmd_getEth2PublicKey.c | 2 +- src_features/getPublicKey/cmd_getPublicKey.c | 2 +- src_features/signTx/logic_signTx.c | 12 ++++++------ src_features/signTx/ui_common_signTx.c | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/eth_plugin_handler.c b/src/eth_plugin_handler.c index 29e965f..8baa253 100644 --- a/src/eth_plugin_handler.c +++ b/src/eth_plugin_handler.c @@ -149,7 +149,7 @@ eth_plugin_result_t eth_plugin_perform_init(uint8_t *contractAddress, } // Do not handle a plugin if running in swap mode - if (called_from_swap && (contractAddress != NULL)) { + if (G_called_from_swap && (contractAddress != NULL)) { PRINTF("eth_plug_init aborted in swap mode\n"); return 0; } diff --git a/src/handle_swap_sign_transaction.c b/src/handle_swap_sign_transaction.c index 3a7fcd0..ddb32ec 100644 --- a/src/handle_swap_sign_transaction.c +++ b/src/handle_swap_sign_transaction.c @@ -54,7 +54,7 @@ bool copy_transaction_parameters(create_transaction_parameters_t* sign_transacti void handle_swap_sign_transaction(chain_config_t* config) { chainConfig = config; reset_app_context(); - called_from_swap = true; + G_called_from_swap = true; io_seproxyhal_init(); if (N_storage.initialized != 0x01) { diff --git a/src/main.c b/src/main.c index 6967042..b11b39d 100644 --- a/src/main.c +++ b/src/main.c @@ -52,7 +52,7 @@ cx_sha3_t global_sha3; uint8_t appState; uint16_t apdu_response_code; -bool called_from_swap; +bool G_called_from_swap; pluginType_t pluginType; #ifdef HAVE_STARKWARE bool quantumSet; @@ -77,7 +77,7 @@ chain_config_t *chainConfig = NULL; void reset_app_context() { // PRINTF("!!RESET_APP_CONTEXT\n"); appState = APP_STATE_IDLE; - called_from_swap = false; + G_called_from_swap = false; pluginType = OLD_INTERNAL; #ifdef HAVE_STARKWARE quantumSet = false; diff --git a/src/shared_context.h b/src/shared_context.h index c2fc66a..f83320c 100644 --- a/src/shared_context.h +++ b/src/shared_context.h @@ -213,7 +213,7 @@ extern strings_t strings; extern cx_sha3_t global_sha3; extern const internalStorage_t N_storage_real; -extern bool called_from_swap; +extern bool G_called_from_swap; typedef enum { EXTERNAL, // External plugin, set by setExternalPlugin. diff --git a/src_features/getEth2PublicKey/cmd_getEth2PublicKey.c b/src_features/getEth2PublicKey/cmd_getEth2PublicKey.c index 853d834..b1b38d5 100644 --- a/src_features/getEth2PublicKey/cmd_getEth2PublicKey.c +++ b/src_features/getEth2PublicKey/cmd_getEth2PublicKey.c @@ -49,7 +49,7 @@ void handleGetEth2PublicKey(uint8_t p1, unsigned int *tx) { bip32_path_t bip32; - if (!called_from_swap) { + if (!G_called_from_swap) { reset_app_context(); } if ((p1 != P1_CONFIRM) && (p1 != P1_NON_CONFIRM)) { diff --git a/src_features/getPublicKey/cmd_getPublicKey.c b/src_features/getPublicKey/cmd_getPublicKey.c index 07bab1d..bc8bac6 100644 --- a/src_features/getPublicKey/cmd_getPublicKey.c +++ b/src_features/getPublicKey/cmd_getPublicKey.c @@ -16,7 +16,7 @@ void handleGetPublicKey(uint8_t p1, bip32_path_t bip32; cx_ecfp_private_key_t privateKey; - if (!called_from_swap) { + if (!G_called_from_swap) { reset_app_context(); } diff --git a/src_features/signTx/logic_signTx.c b/src_features/signTx/logic_signTx.c index 7d8cd37..f42addf 100644 --- a/src_features/signTx/logic_signTx.c +++ b/src_features/signTx/logic_signTx.c @@ -424,8 +424,8 @@ void finalizeParsing(bool direct) { } // User has just validated a swap but ETH received apdus about a non standard plugin / contract - if (called_from_swap && !use_standard_UI) { - PRINTF("ERR_SILENT_MODE_CHECK_FAILED, called_from_swap\n"); + if (G_called_from_swap && !use_standard_UI) { + PRINTF("ERR_SILENT_MODE_CHECK_FAILED, G_called_from_swap\n"); THROW(ERR_SILENT_MODE_CHECK_FAILED); } @@ -447,7 +447,7 @@ void finalizeParsing(bool direct) { sizeof(displayBuffer), &global_sha3, chainConfig->chainId); - if (called_from_swap) { + if (G_called_from_swap) { // Ensure the values are the same that the ones that have been previously validated if (strcasecmp_workaround(strings.common.fullAddress, displayBuffer) != 0) { PRINTF("ERR_SILENT_MODE_CHECK_FAILED, address check failed\n"); @@ -466,7 +466,7 @@ void finalizeParsing(bool direct) { ticker, displayBuffer, sizeof(displayBuffer)); - if (called_from_swap) { + if (G_called_from_swap) { // Ensure the values are the same that the ones that have been previously validated if (strcmp(strings.common.fullAmount, displayBuffer) != 0) { PRINTF("ERR_SILENT_MODE_CHECK_FAILED, amount check failed\n"); @@ -484,7 +484,7 @@ void finalizeParsing(bool direct) { &tmpContent.txContent.startgas, displayBuffer, sizeof(displayBuffer)); - if (called_from_swap) { + if (G_called_from_swap) { // Ensure the values are the same that the ones that have been previously validated if (strcmp(strings.common.maxFee, displayBuffer) != 0) { PRINTF("ERR_SILENT_MODE_CHECK_FAILED, fees check failed\n"); @@ -510,7 +510,7 @@ void finalizeParsing(bool direct) { // If called from swap, the user as already validated a standard transaction // We have already checked the fields of this transaction above - no_consent_check = called_from_swap && use_standard_UI; + no_consent_check = G_called_from_swap && use_standard_UI; #ifdef NO_CONSENT no_consent_check = true; diff --git a/src_features/signTx/ui_common_signTx.c b/src_features/signTx/ui_common_signTx.c index ef8171f..fec6ca8 100644 --- a/src_features/signTx/ui_common_signTx.c +++ b/src_features/signTx/ui_common_signTx.c @@ -61,7 +61,7 @@ unsigned int io_seproxyhal_touch_tx_ok(__attribute__((unused)) const bagl_elemen G_io_apdu_buffer[tx++] = 0x00; // Send back the response, do not restart the event loop io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); - if (called_from_swap) { + if (G_called_from_swap) { os_sched_exit(0); } reset_app_context(); From 6ec26db05377eb92dda499a6a375fe4183fea443 Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Fri, 30 Jun 2023 14:06:09 +0200 Subject: [PATCH 41/85] Add Spinner when starting in Swap mode on Stax --- src/handle_swap_sign_transaction.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/handle_swap_sign_transaction.c b/src/handle_swap_sign_transaction.c index ddb32ec..16c8b7f 100644 --- a/src/handle_swap_sign_transaction.c +++ b/src/handle_swap_sign_transaction.c @@ -4,6 +4,9 @@ #include "handle_swap_sign_transaction.h" #include "shared_context.h" #include "utils.h" +#ifdef HAVE_NBGL +#include "utils.h" +#endif // HAVE_NBGL bool copy_transaction_parameters(create_transaction_parameters_t* sign_transaction_params, chain_config_t* config) { @@ -52,6 +55,11 @@ bool copy_transaction_parameters(create_transaction_parameters_t* sign_transacti } void handle_swap_sign_transaction(chain_config_t* config) { + UX_INIT(); +#ifdef HAVE_NBGL + nbgl_useCaseSpinner("Signing"); +#endif // HAVE_NBGL + chainConfig = config; reset_app_context(); G_called_from_swap = true; @@ -67,13 +75,6 @@ void handle_swap_sign_transaction(chain_config_t* config) { nvm_write((void*) &N_storage, (void*) &storage, sizeof(internalStorage_t)); } -#ifdef HAVE_BAGL - UX_INIT(); -#endif // HAVE_BAGL -#ifdef HAVE_NBGL - nbgl_objInit(); -#endif // HAVE_NBGL - USB_power(0); USB_power(1); // ui_idle(); From 8082bd7f8b936c534de6f0694652323f235a9fa5 Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Fri, 30 Jun 2023 17:47:22 +0200 Subject: [PATCH 42/85] Return in Exchange after a successful swap --- src/handle_swap_sign_transaction.c | 15 +++++- src/handle_swap_sign_transaction.h | 5 +- src/swap_lib_calls.h | 74 +++++++++++++++----------- src_features/signTx/ui_common_signTx.c | 15 +++++- 4 files changed, 73 insertions(+), 36 deletions(-) diff --git a/src/handle_swap_sign_transaction.c b/src/handle_swap_sign_transaction.c index 16c8b7f..604b8a2 100644 --- a/src/handle_swap_sign_transaction.c +++ b/src/handle_swap_sign_transaction.c @@ -5,9 +5,12 @@ #include "shared_context.h" #include "utils.h" #ifdef HAVE_NBGL -#include "utils.h" +#include "nbgl_use_case.h" #endif // HAVE_NBGL +// Save the BSS address where we will write the return value when finished +static uint8_t* G_swap_sign_return_value_address; + bool copy_transaction_parameters(create_transaction_parameters_t* sign_transaction_params, chain_config_t* config) { // first copy parameters to stack, and then to global data. @@ -49,11 +52,21 @@ bool copy_transaction_parameters(create_transaction_parameters_t* sign_transacti stack_data.maxFee, sizeof(stack_data.maxFee)); + // Full reset the global variables os_explicit_zero_BSS_segment(); + // Keep the address at which we'll reply the signing status + G_swap_sign_return_value_address = &sign_transaction_params->result; + // Commit the values read from exchange to the clean global space + memcpy(&strings.common, &stack_data, sizeof(stack_data)); return true; } +void __attribute__((noreturn)) finalize_exchange_sign_transaction(bool is_success) { + *G_swap_sign_return_value_address = is_success; + os_lib_end(); +} + void handle_swap_sign_transaction(chain_config_t* config) { UX_INIT(); #ifdef HAVE_NBGL diff --git a/src/handle_swap_sign_transaction.h b/src/handle_swap_sign_transaction.h index 21b52c3..d34a6d8 100644 --- a/src/handle_swap_sign_transaction.h +++ b/src/handle_swap_sign_transaction.h @@ -1,5 +1,4 @@ -#ifndef _HANDLE_SWAP_SIGN_TRANSACTION_H_ -#define _HANDLE_SWAP_SIGN_TRANSACTION_H_ +#pragma once #include "swap_lib_calls.h" #include "chainConfig.h" @@ -9,4 +8,4 @@ bool copy_transaction_parameters(create_transaction_parameters_t* sign_transacti void handle_swap_sign_transaction(chain_config_t* config); -#endif // _HANDLE_SWAP_SIGN_TRANSACTION_H_ \ No newline at end of file +void __attribute__((noreturn)) finalize_exchange_sign_transaction(bool is_success); diff --git a/src/swap_lib_calls.h b/src/swap_lib_calls.h index 4fd0284..2870347 100644 --- a/src/swap_lib_calls.h +++ b/src/swap_lib_calls.h @@ -1,9 +1,15 @@ -#ifndef _SWAP_LIB_CALLS_H_ -#define _SWAP_LIB_CALLS_H_ +#pragma once + +/* This file is the shared API between Exchange and the apps started in Library mode for Exchange + * + * DO NOT MODIFY THIS FILE IN APPLICATIONS OTHER THAN EXCHANGE + * On modification in Exchange, forward the changes to all applications supporting Exchange + */ #include "stdbool.h" #include "chainConfig.h" #include "shared_context.h" +#include "stdint.h" #define RUN_APPLICATION 1 @@ -13,19 +19,27 @@ #define GET_PRINTABLE_AMOUNT 4 +/* + * Amounts are stored as bytes, with a max size of 16 (see protobuf + * specifications). Max 16B integer is 340282366920938463463374607431768211455 + * in decimal, which is a 32-long char string. + * The printable amount also contains spaces, the ticker symbol (with variable + * size, up to 12 in Ethereum for instance) and a terminating null byte, so 50 + * bytes total should be a fair maximum. + */ #define MAX_PRINTABLE_AMOUNT_SIZE 50 // structure that should be send to specific coin application to get address typedef struct check_address_parameters_s { // IN - const unsigned char* const coin_configuration; - const unsigned char coin_configuration_length; + uint8_t *coin_configuration; + uint8_t coin_configuration_length; // serialized path, segwit, version prefix, hash used, dictionary etc. - // fields and serialization format depends on spesific coin app - const unsigned char* const address_parameters; - const unsigned char address_parameters_length; - const char* const address_to_check; - const char* const extra_id_to_check; + // fields and serialization format depends on specific coin app + uint8_t *address_parameters; + uint8_t address_parameters_length; + char *address_to_check; + char *extra_id_to_check; // OUT int result; } check_address_parameters_t; @@ -33,37 +47,37 @@ typedef struct check_address_parameters_s { // structure that should be send to specific coin application to get printable amount typedef struct get_printable_amount_parameters_s { // IN - const unsigned char* const coin_configuration; - const unsigned char coin_configuration_length; - const unsigned char* const amount; - const unsigned char amount_length; - const bool is_fee; + uint8_t *coin_configuration; + uint8_t coin_configuration_length; + uint8_t *amount; + uint8_t amount_length; + bool is_fee; // OUT char printable_amount[MAX_PRINTABLE_AMOUNT_SIZE]; - // int result; } get_printable_amount_parameters_t; typedef struct create_transaction_parameters_s { - const unsigned char* const coin_configuration; - const unsigned char coin_configuration_length; - const unsigned char* const amount; - const unsigned char amount_length; - const unsigned char* const fee_amount; - const unsigned char fee_amount_length; - const char* const destination_address; - const char* const destination_address_extra_id; + // IN + uint8_t *coin_configuration; + uint8_t coin_configuration_length; + uint8_t *amount; + uint8_t amount_length; + uint8_t *fee_amount; + uint8_t fee_amount_length; + char *destination_address; + char *destination_address_extra_id; + // OUT + uint8_t result; } create_transaction_parameters_t; typedef struct libargs_s { unsigned int id; unsigned int command; - chain_config_t* chain_config; + chain_config_t *chain_config; union { - check_address_parameters_t* check_address; - create_transaction_parameters_t* create_transaction; - get_printable_amount_parameters_t* get_printable_amount; - caller_app_t* caller_app; + check_address_parameters_t *check_address; + create_transaction_parameters_t *create_transaction; + get_printable_amount_parameters_t *get_printable_amount; + caller_app_t *caller_app; }; } libargs_t; - -#endif // _SWAP_LIB_CALLS_H_ diff --git a/src_features/signTx/ui_common_signTx.c b/src_features/signTx/ui_common_signTx.c index fec6ca8..e57bb21 100644 --- a/src_features/signTx/ui_common_signTx.c +++ b/src_features/signTx/ui_common_signTx.c @@ -2,12 +2,14 @@ #include "shared_context.h" #include "utils.h" #include "common_ui.h" +#include "handle_swap_sign_transaction.h" unsigned int io_seproxyhal_touch_tx_ok(__attribute__((unused)) const bagl_element_t *e) { uint8_t privateKeyData[INT256_LENGTH]; uint8_t signature[100]; cx_ecfp_private_key_t privateKey; uint32_t tx = 0; + int err; io_seproxyhal_io_heartbeat(); os_perso_derive_node_bip32(CX_CURVE_256K1, tmpCtx.transactionContext.bip32.path, @@ -59,10 +61,19 @@ unsigned int io_seproxyhal_touch_tx_ok(__attribute__((unused)) const bagl_elemen tx = 65; G_io_apdu_buffer[tx++] = 0x90; G_io_apdu_buffer[tx++] = 0x00; + // Send back the response, do not restart the event loop - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); + err = io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); if (G_called_from_swap) { - os_sched_exit(0); + PRINTF("G_called_from_swap\n"); + + // If we are in swap mode and have validated a TX, we send it and immediately quit + if (err == 0) { + finalize_exchange_sign_transaction(true); + } else { + PRINTF("Unrecoverable\n"); + os_sched_exit(-1); + } } reset_app_context(); // Display back the original UX From f26edc2fefed8846668393324c847c7f57d63eea Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Tue, 4 Jul 2023 15:00:31 +0200 Subject: [PATCH 43/85] Update LNX snapshots on ragger tests --- .../nanox/domain_name_non_mainnet/00004.png | Bin 436 -> 434 bytes .../nanox/domain_name_non_mainnet/00006.png | Bin 382 -> 381 bytes .../nanox/domain_name_verbose_False/00003.png | Bin 436 -> 434 bytes .../nanox/domain_name_verbose_False/00005.png | Bin 382 -> 381 bytes .../nanox/domain_name_verbose_True/00004.png | Bin 436 -> 434 bytes .../nanox/domain_name_verbose_True/00006.png | Bin 382 -> 381 bytes .../nanox/domain_name_wrong_addr/00003.png | Bin 436 -> 434 bytes .../nanox/domain_name_wrong_addr/00005.png | Bin 382 -> 381 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00004.png b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00004.png index 70c1b9a68f5fb1ee090966199cb58a891b0a5ad4..1bcb78761fd15fd94377813eb932cf0245af596a 100644 GIT binary patch delta 408 zcmV;J0cZZS1F{2F1DKvCMsPT2pF*h@b=W(ZFuMUoTW^X0)U z5P@Z^5C8xG0CPX~L#C9Dix}gmPPWA(+<9tS61s_m_1%cLUPPW6M&rla%w{Fpx} z&q;1cE+k_ue}BamS1iWeiu#wZ@IhAHWpZsY49Y1;eF22C?^eyUElY3RSJYnjO+jr~ z?MtEIwhQ1A>#jNlZJ*he!(1-em#4B!7EJL_t(|obA|Al7k=&fML4Rn{fXlahH8?WLOd)Z3)=*|DGJQ zK!Zk12mk;8z;ciEL#C9DgBWA0}S2_?g`BFMRCt|E^k7p52;f#)qiyEnvQjTW+VcCz`SPts&Z+`}^n1bXp5zc$RwI2DJ zs)w>GwXr(8ehs!QK$T47of{gFdUce1+{#_m=!@52a|*JD_@#wWgV>4euKW`&n1aew zlc_K2e#okRj*HdCy)R(^0Dyb)t%mjsFJ)u(#U!_boi9~+YS_}L$jYgH@!quc#nj*C zcgk~?Q&akt|BC2V|zj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCwORjDih delta 355 zcmV-p0i6E*0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1g;M BtF1DKvCMsPT2pF*h@b=W(ZFuMUoTW^X0)U z5P@Z^5C8xG0CPX~L#C9Dix}gmPPWA(+<9tS61s_m_1%cLUPPW6M&rla%w{Fpx} z&q;1cE+k_ue}BamS1iWeiu#wZ@IhAHWpZsY49Y1;eF22C?^eyUElY3RSJYnjO+jr~ z?MtEIwhQ1A>#jNlZJ*he!(1-em#4B!7EJL_t(|obA|Al7k=&fML4Rn{fXlahH8?WLOd)Z3)=*|DGJQ zK!Zk12mk;8z;ciEL#C9DgBWA0}S2_?g`BFMRCt|E^k7p52;f#)qiyEnvQjTW+VcCz`SPts&Z+`}^n1bXp5zc$RwI2DJ zs)w>GwXr(8ehs!QK$T47of{gFdUce1+{#_m=!@52a|*JD_@#wWgV>4euKW`&n1aew zlc_K2e#okRj*HdCy)R(^0Dyb)t%mjsFJ)u(#U!_boi9~+YS_}L$jYgH@!quc#nj*C zcgk~?Q&akt|BC2V|zj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCwORjDih delta 355 zcmV-p0i6E*0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1g;M BtF1DKvCMsPT2pF*h@b=W(ZFuMUoTW^X0)U z5P@Z^5C8xG0CPX~L#C9Dix}gmPPWA(+<9tS61s_m_1%cLUPPW6M&rla%w{Fpx} z&q;1cE+k_ue}BamS1iWeiu#wZ@IhAHWpZsY49Y1;eF22C?^eyUElY3RSJYnjO+jr~ z?MtEIwhQ1A>#jNlZJ*he!(1-em#4B!7EJL_t(|obA|Al7k=&fML4Rn{fXlahH8?WLOd)Z3)=*|DGJQ zK!Zk12mk;8z;ciEL#C9DgBWA0}S2_?g`BFMRCt|E^k7p52;f#)qiyEnvQjTW+VcCz`SPts&Z+`}^n1bXp5zc$RwI2DJ zs)w>GwXr(8ehs!QK$T47of{gFdUce1+{#_m=!@52a|*JD_@#wWgV>4euKW`&n1aew zlc_K2e#okRj*HdCy)R(^0Dyb)t%mjsFJ)u(#U!_boi9~+YS_}L$jYgH@!quc#nj*C zcgk~?Q&akt|BC2V|zj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCwORjDih delta 355 zcmV-p0i6E*0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1g;M BtF1DKvCMsPT2pF*h@b=W(ZFuMUoTW^X0)U z5P@Z^5C8xG0CPX~L#C9Dix}gmPPWA(+<9tS61s_m_1%cLUPPW6M&rla%w{Fpx} z&q;1cE+k_ue}BamS1iWeiu#wZ@IhAHWpZsY49Y1;eF22C?^eyUElY3RSJYnjO+jr~ z?MtEIwhQ1A>#jNlZJ*he!(1-em#4B!7EJL_t(|obA|Al7k=&fML4Rn{fXlahH8?WLOd)Z3)=*|DGJQ zK!Zk12mk;8z;ciEL#C9DgBWA0}S2_?g`BFMRCt|E^k7p52;f#)qiyEnvQjTW+VcCz`SPts&Z+`}^n1bXp5zc$RwI2DJ zs)w>GwXr(8ehs!QK$T47of{gFdUce1+{#_m=!@52a|*JD_@#wWgV>4euKW`&n1aew zlc_K2e#okRj*HdCy)R(^0Dyb)t%mjsFJ)u(#U!_boi9~+YS_}L$jYgH@!quc#nj*C zcgk~?Q&akt|BC2V|zj4-;J5hht#0pj z^#9@1sLK;CE54XuefJROGCRgZUbWXBk9~WeThLU0Q`4iWuO>iVr1K`D#hTWitG2LJbl{xH#~Rq+?=K-+vfC})E&6F z@5lAeSDtRMVcZx!aqGa5zhIs*He8&r_HtpZV5M#|^ ydh?e5zlAMgw-$Yhy2~hY*m8O9PiA<4-2TmASuS-mz3kmhkeH{dpUXO@geCwORjDih delta 355 zcmV-p0i6E*0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1g;M Bt Date: Tue, 4 Jul 2023 15:22:32 +0200 Subject: [PATCH 44/85] Use latest version for Speculos and Ragger --- .github/workflows/ci-workflow.yml | 3 ++- tests/ragger/requirements.txt | 2 +- tests/speculos/README.md | 5 ++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index 4c9118a..d5cf795 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -128,6 +128,7 @@ jobs: jobs-e2e-speculos-tests: name: Speculos tests strategy: + fail-fast: false matrix: model: ["nanosp", "nanos", "nanox"] @@ -153,7 +154,7 @@ jobs: run: | cd tests/speculos sudo apt-get update && sudo apt-get install -y qemu-user-static - pip install --extra-index-url https://test.pypi.org/simple/ -r requirements.txt + pip install -r requirements.txt - name: Run speculos tests run: | diff --git a/tests/ragger/requirements.txt b/tests/ragger/requirements.txt index 818749b..34213d6 100644 --- a/tests/ragger/requirements.txt +++ b/tests/ragger/requirements.txt @@ -1,4 +1,4 @@ -ragger[speculos]>=1.7.0,<1.8.0 +ragger[speculos] pytest ecdsa simple-rlp diff --git a/tests/speculos/README.md b/tests/speculos/README.md index c3bb346..68d1468 100644 --- a/tests/speculos/README.md +++ b/tests/speculos/README.md @@ -11,9 +11,8 @@ These tests are implemented in Python with the `SpeculosClient` interface which Python dependencies are listed in [requirements.txt](requirements.txt) ```shell -python3 -m pip install --extra-index-url https://test.pypi.org/simple/ -r requirements.txt +python3 -m pip install -r requirements.txt ``` -> The extra index allows to fetch the latest version of Speculos. ## Usage @@ -47,4 +46,4 @@ pytest --model nanox --path ./elfs/nanox.elf # Execute specific test: pytest --model nanox --path ./elfs/nanox.elf test_pubkey_cmd.py -``` \ No newline at end of file +``` From 120052a07a1a3e1594f8f44353a0efcc8ff9ccea Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Tue, 4 Jul 2023 15:39:05 +0200 Subject: [PATCH 45/85] Split LNX and LNS+ snapshots --- tests/ragger/snapshots/nanosp | 1 - .../nanosp/domain_name_non_mainnet/00000.png | Bin 0 -> 414 bytes .../nanosp/domain_name_non_mainnet/00001.png | Bin 0 -> 368 bytes .../nanosp/domain_name_non_mainnet/00002.png | Bin 0 -> 585 bytes .../nanosp/domain_name_non_mainnet/00003.png | Bin 0 -> 383 bytes .../nanosp/domain_name_non_mainnet/00004.png | Bin 0 -> 436 bytes .../nanosp/domain_name_non_mainnet/00005.png | Bin 0 -> 472 bytes .../nanosp/domain_name_non_mainnet/00006.png | Bin 0 -> 382 bytes .../nanosp/domain_name_verbose_False/00000.png | Bin 0 -> 414 bytes .../nanosp/domain_name_verbose_False/00001.png | Bin 0 -> 368 bytes .../nanosp/domain_name_verbose_False/00002.png | Bin 0 -> 394 bytes .../nanosp/domain_name_verbose_False/00003.png | Bin 0 -> 436 bytes .../nanosp/domain_name_verbose_False/00004.png | Bin 0 -> 472 bytes .../nanosp/domain_name_verbose_False/00005.png | Bin 0 -> 382 bytes .../nanosp/domain_name_verbose_True/00000.png | Bin 0 -> 414 bytes .../nanosp/domain_name_verbose_True/00001.png | Bin 0 -> 368 bytes .../nanosp/domain_name_verbose_True/00002.png | Bin 0 -> 394 bytes .../nanosp/domain_name_verbose_True/00003.png | Bin 0 -> 585 bytes .../nanosp/domain_name_verbose_True/00004.png | Bin 0 -> 436 bytes .../nanosp/domain_name_verbose_True/00005.png | Bin 0 -> 472 bytes .../nanosp/domain_name_verbose_True/00006.png | Bin 0 -> 382 bytes .../nanosp/domain_name_wrong_addr/00000.png | Bin 0 -> 414 bytes .../nanosp/domain_name_wrong_addr/00001.png | Bin 0 -> 368 bytes .../nanosp/domain_name_wrong_addr/00002.png | Bin 0 -> 588 bytes .../nanosp/domain_name_wrong_addr/00003.png | Bin 0 -> 436 bytes .../nanosp/domain_name_wrong_addr/00004.png | Bin 0 -> 472 bytes .../nanosp/domain_name_wrong_addr/00005.png | Bin 0 -> 382 bytes 27 files changed, 1 deletion(-) delete mode 120000 tests/ragger/snapshots/nanosp create mode 100644 tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00000.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00001.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00002.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00003.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00004.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00005.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00006.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_False/00000.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_False/00001.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_False/00002.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_False/00003.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_False/00004.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_False/00005.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_True/00000.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_True/00001.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_True/00002.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_True/00003.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_True/00004.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_True/00005.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_verbose_True/00006.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00000.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00001.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00002.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00003.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00004.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00005.png diff --git a/tests/ragger/snapshots/nanosp b/tests/ragger/snapshots/nanosp deleted file mode 120000 index da13a6a..0000000 --- a/tests/ragger/snapshots/nanosp +++ /dev/null @@ -1 +0,0 @@ -nanox/ \ No newline at end of file diff --git a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00000.png b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..487ea10fcfeb2f3e6b79239459672251d49addd7 GIT binary patch literal 414 zcmV;P0b%}$P)vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*fn&`6tH9gqo;^MN#J@G-NZG(W*iG}t#e1Fb- zKV8KTt0a`{lX$B4$~o~B?x*6e)~<@4Iz4h@Jmb~b5&vc;g`2H9{psfXevRGF%X%)F z{W^G1#bn40-weR!F*3L+ubT($m0wc}!uNKw0-sV5H z;CF7g9MJJ=+rKjGEBl+3>A2QyMfKUZ+;mUbm;0)$KRWh$yq((D^ZhGdwuD|?hi~Df z@|&)@8Hr8?_0j7y!?>j6!~H8~TztJ`f#FwsF1bzDbkz>zesQ*DR9hWnx9on|hmN^& zyJ|dM`zN>MP3ZiWI3+;%Z?hr$v=dI#e(*&r?E!in863#FcU<{Z?XiYs!60EzS3j3^ HP6 literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00002.png b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..6a5a9d64a202a062cb8bb576a84ba653e232345c GIT binary patch literal 585 zcmV-P0=E5$P)Fdu z__dw@MOS{tr(OJ6PoPLP9@*UxLb&ZA1lC4xvBG!qQ&wg@Ymi`OA5aK9q=YC=*Fi;`yDjPzxkl=%^cJKW8Rm7R%x^V000000G!J| X8HZ1szRqx300000NkvXXu0mjfUbPWB literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00003.png b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..93112b3ab44e4f2fda4db252509cc196086ddfe4 GIT binary patch literal 383 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9fba4!+nDh2#BHtkep0-4j zdo91^SC)S~p49BHJ!?zqFT4F}f!k|X&9XH?T6cI~>vT=AUa|Gn>9-c2n3T?2l%BQS zJHI32Y~4xS-%MQ{J(o9}-F0o1{_c;TY$hImeCf=`w=R#5oR8(wUdQ0;viM5LE9Xi* zx5AL5KPO65B8nKxj6S`wygYT|{7u*L_w1ovS;^lz1}|X7OvSf z+x3+G0T1WQ@`Ys={_`GvYk(e{b*WT#)t^JoP z;)!4C*^OBcSXHTQ3DBky85}Sb4q9e0CCc*{Qv*} literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00004.png b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..70c1b9a68f5fb1ee090966199cb58a891b0a5ad4 GIT binary patch literal 436 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|_8Fba4!+nDh2V;G|{+o`%F- zmuDCJS1z1hTaXeVq>#&b2QSTI5qI}IeE+uQ$d($HH~rmjmfzpG^!&>@vHo;H|A#$&J>60(rv&w- z{Y$*re=CCT)rWkxbu*ft7z>`O-oI7u=d4xjo3yuXwAx+AyG_?&s?U?T(oz$vN~hG^ zITd^LMfdfDVy;c?KbE!zHs9!cv+j?u-i)SGA(L0?zp6X2s;;m5>ao50i9jz_e_Gr2 zjaxr8`Rh@Y?ag!bLo2gxTv~bJ)XKV#_qKdJdgcDJ@>9jrf~PT`jyPOzcvQ5zaQmZw zsyQ_iV&5BC&*W(?<|>M3c>Lz-s+s2Awug&us=u4vloD}$y3^rY@dWQRp`~22>^5u8 z-Wjt=zq~iKakEWo=0=}0$4N$E@I8h8IZK)78&qol`;+03*-H(EtDd literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00005.png b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..570ce28d53e82ac396ba25c370110058f3a638f9 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~ovpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*fn&`6tH9gqo;^MN#J@G-NZG(W*iG}t#e1Fb- zKV8KTt0a`{lX$B4$~o~B?x*6e)~<@4Iz4h@Jmb~b5&vc;g`2H9{psfXevRGF%X%)F z{W^G1#bn40-weR!F*3L+ubT($m0wc}!uNKw0-sV5H z;CF7g9MJJ=+rKjGEBl+3>A2QyMfKUZ+;mUbm;0)$KRWh$yq((D^ZhGdwuD|?hi~Df z@|&)@8Hr8?_0j7y!?>j6!~H8~TztJ`f#FwsF1bzDbkz>zesQ*DR9hWnx9on|hmN^& zyJ|dM`zN>MP3ZiWI3+;%Z?hr$v=dI#e(*&r?E!in863#FcU<{Z?XiYs!60EzS3j3^ HP6 literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00002.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..6af0ec54b2a0718d258e534bf29b059567fc8a37 GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|OeC49QR=-2B7dxJ{W zgs*+Kp>I)S?nComvp*b*(d&*o`esS|_Wz0OWf4q4#T*CSRgb;eS9841(&A*@>I#&b2QSTI5qI}IeE+uQ$d($HH~rmjmfzpG^!&>@vHo;H|A#$&J>60(rv&w- z{Y$*re=CCT)rWkxbu*ft7z>`O-oI7u=d4xjo3yuXwAx+AyG_?&s?U?T(oz$vN~hG^ zITd^LMfdfDVy;c?KbE!zHs9!cv+j?u-i)SGA(L0?zp6X2s;;m5>ao50i9jz_e_Gr2 zjaxr8`Rh@Y?ag!bLo2gxTv~bJ)XKV#_qKdJdgcDJ@>9jrf~PT`jyPOzcvQ5zaQmZw zsyQ_iV&5BC&*W(?<|>M3c>Lz-s+s2Awug&us=u4vloD}$y3^rY@dWQRp`~22>^5u8 z-Wjt=zq~iKakEWo=0=}0$4N$E@I8h8IZK)78&qol`;+03*-H(EtDd literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00004.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_False/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..570ce28d53e82ac396ba25c370110058f3a638f9 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~ovpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*fn&`6tH9gqo;^MN#J@G-NZG(W*iG}t#e1Fb- zKV8KTt0a`{lX$B4$~o~B?x*6e)~<@4Iz4h@Jmb~b5&vc;g`2H9{psfXevRGF%X%)F z{W^G1#bn40-weR!F*3L+ubT($m0wc}!uNKw0-sV5H z;CF7g9MJJ=+rKjGEBl+3>A2QyMfKUZ+;mUbm;0)$KRWh$yq((D^ZhGdwuD|?hi~Df z@|&)@8Hr8?_0j7y!?>j6!~H8~TztJ`f#FwsF1bzDbkz>zesQ*DR9hWnx9on|hmN^& zyJ|dM`zN>MP3ZiWI3+;%Z?hr$v=dI#e(*&r?E!in863#FcU<{Z?XiYs!60EzS3j3^ HP6 literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00002.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..6af0ec54b2a0718d258e534bf29b059567fc8a37 GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|OeC49QR=-2B7dxJ{W zgs*+Kp>I)S?nComvp*b*(d&*o`esS|_Wz0OWf4q4#T*CSRgb;eS9841(&A*@>IFdu z__dw@MOS{tr(OJ6PoPLP9@*UxLb&ZA1lC4xvBG!qQ&wg@Ymi`OA5aK9q=YC=*Fi;`yDjPzxkl=%^cJKW8Rm7R%x^V000000G!J| X8HZ1szRqx300000NkvXXu0mjfUbPWB literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00004.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..70c1b9a68f5fb1ee090966199cb58a891b0a5ad4 GIT binary patch literal 436 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|_8Fba4!+nDh2V;G|{+o`%F- zmuDCJS1z1hTaXeVq>#&b2QSTI5qI}IeE+uQ$d($HH~rmjmfzpG^!&>@vHo;H|A#$&J>60(rv&w- z{Y$*re=CCT)rWkxbu*ft7z>`O-oI7u=d4xjo3yuXwAx+AyG_?&s?U?T(oz$vN~hG^ zITd^LMfdfDVy;c?KbE!zHs9!cv+j?u-i)SGA(L0?zp6X2s;;m5>ao50i9jz_e_Gr2 zjaxr8`Rh@Y?ag!bLo2gxTv~bJ)XKV#_qKdJdgcDJ@>9jrf~PT`jyPOzcvQ5zaQmZw zsyQ_iV&5BC&*W(?<|>M3c>Lz-s+s2Awug&us=u4vloD}$y3^rY@dWQRp`~22>^5u8 z-Wjt=zq~iKakEWo=0=}0$4N$E@I8h8IZK)78&qol`;+03*-H(EtDd literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00005.png b/tests/ragger/snapshots/nanosp/domain_name_verbose_True/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..570ce28d53e82ac396ba25c370110058f3a638f9 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~ovpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*fn&`6tH9gqo;^MN#J@G-NZG(W*iG}t#e1Fb- zKV8KTt0a`{lX$B4$~o~B?x*6e)~<@4Iz4h@Jmb~b5&vc;g`2H9{psfXevRGF%X%)F z{W^G1#bn40-weR!F*3L+ubT($m0wc}!uNKw0-sV5H z;CF7g9MJJ=+rKjGEBl+3>A2QyMfKUZ+;mUbm;0)$KRWh$yq((D^ZhGdwuD|?hi~Df z@|&)@8Hr8?_0j7y!?>j6!~H8~TztJ`f#FwsF1bzDbkz>zesQ*DR9hWnx9on|hmN^& zyJ|dM`zN>MP3ZiWI3+;%Z?hr$v=dI#e(*&r?E!in863#FcU<{Z?XiYs!60EzS3j3^ HP6 literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00002.png b/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..639e4214e2503dea60de36382cca415eba0612ef GIT binary patch literal 588 zcmV-S0<-;zP)O0W zchFsT)i}^Q!1`wvO&TVU-WL7u7Lerb2v~T-6W-5}9LuNEJd4tofu>?$4t}ALa z+pgs{)78Thz#Qt%begfRUjy1``q}X~sO`Sn^ZL71NxS8Y)xw+}-aS2NY8me@&zh zE2f7M0L8TSt3&St(g74xiI*wJ8#@%!A`9LJEKw*wqL=~z0001hgyknnlA+h%_bs4G zSMR*9(K^A!XR1TIOrw2X0$zs41RPV`Jm4+?pNc+tOTgEnPY&hiC9>iwZ503j0001h ack&On!Zml6z*33;0000#&b2QSTI5qI}IeE+uQ$d($HH~rmjmfzpG^!&>@vHo;H|A#$&J>60(rv&w- z{Y$*re=CCT)rWkxbu*ft7z>`O-oI7u=d4xjo3yuXwAx+AyG_?&s?U?T(oz$vN~hG^ zITd^LMfdfDVy;c?KbE!zHs9!cv+j?u-i)SGA(L0?zp6X2s;;m5>ao50i9jz_e_Gr2 zjaxr8`Rh@Y?ag!bLo2gxTv~bJ)XKV#_qKdJdgcDJ@>9jrf~PT`jyPOzcvQ5zaQmZw zsyQ_iV&5BC&*W(?<|>M3c>Lz-s+s2Awug&us=u4vloD}$y3^rY@dWQRp`~22>^5u8 z-Wjt=zq~iKakEWo=0=}0$4N$E@I8h8IZK)78&qol`;+03*-H(EtDd literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00004.png b/tests/ragger/snapshots/nanosp/domain_name_wrong_addr/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..570ce28d53e82ac396ba25c370110058f3a638f9 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~o Date: Fri, 16 Jun 2023 15:52:03 +0200 Subject: [PATCH 46/85] network.c functions cleanup --- src/eth_plugin_handler.c | 5 +- src_common/ethUtils.c | 32 +++++++++++ src_common/ethUtils.h | 4 ++ src_common/network.c | 86 ++++++++---------------------- src_common/network.h | 21 ++------ src_features/signTx/logic_signTx.c | 10 ++-- src_nbgl/ui_approve_tx.c | 2 +- src_nbgl/ui_idle.c | 3 +- 8 files changed, 73 insertions(+), 90 deletions(-) diff --git a/src/eth_plugin_handler.c b/src/eth_plugin_handler.c index 8baa253..bb73e9e 100644 --- a/src/eth_plugin_handler.c +++ b/src/eth_plugin_handler.c @@ -47,6 +47,8 @@ void eth_plugin_prepare_query_contract_UI(ethQueryContractUI_t *queryContractUI, uint32_t titleLength, char *msg, uint32_t msgLength) { + uint64_t chain_id; + memset((uint8_t *) queryContractUI, 0, sizeof(ethQueryContractUI_t)); // If no extra information was found, set the pointer to NULL @@ -64,7 +66,8 @@ void eth_plugin_prepare_query_contract_UI(ethQueryContractUI_t *queryContractUI, } queryContractUI->screenIndex = screenIndex; - strlcpy(queryContractUI->network_ticker, get_tx_network_ticker(), MAX_TICKER_LEN); + chain_id = get_tx_chain_id(); + strlcpy(queryContractUI->network_ticker, get_displayable_ticker(&chain_id), MAX_TICKER_LEN); queryContractUI->title = title; queryContractUI->titleLength = titleLength; queryContractUI->msg = msg; diff --git a/src_common/ethUtils.c b/src_common/ethUtils.c index 4dd0e6a..e66e0d2 100644 --- a/src_common/ethUtils.c +++ b/src_common/ethUtils.c @@ -27,9 +27,12 @@ #include #include +#include "shared_context.h" +#include "utils.h" #include "ethUtils.h" #include "chainConfig.h" #include "ethUstream.h" +#include "network.h" bool rlpCanDecode(uint8_t *buffer, uint32_t bufferLength, bool *valid) { if (*buffer <= 0x7f) { @@ -301,3 +304,32 @@ bool adjustDecimals(const char *src, } return true; } + +// Returns the chain ID. Defaults to 0 if txType was not found (For TX). +uint64_t get_tx_chain_id(void) { + uint64_t chain_id = 0; + + switch (txContext.txType) { + case LEGACY: + chain_id = u64_from_BE(txContext.content->v, txContext.content->vLength); + break; + case EIP2930: + case EIP1559: + chain_id = u64_from_BE(tmpContent.txContent.chainID.value, + tmpContent.txContent.chainID.length); + break; + default: + PRINTF("Txtype `%d` not supported while generating chainID\n", txContext.txType); + break; + } + return chain_id; +} + +const char *get_displayable_ticker(const uint64_t *chain_id) { + const char *ticker = get_network_ticker_from_chain_id(chain_id); + + if (ticker == NULL) { + ticker = chainConfig->coinName; + } + return ticker; +} diff --git a/src_common/ethUtils.h b/src_common/ethUtils.h index 9722e2c..8702533 100644 --- a/src_common/ethUtils.h +++ b/src_common/ethUtils.h @@ -84,6 +84,10 @@ static __attribute__((no_instrument_function)) inline int ismaxint(uint8_t *buf, return 1; } +uint64_t get_tx_chain_id(void); + +const char *get_displayable_ticker(const uint64_t *chain_id); + static const char HEXDIGITS[] = "0123456789abcdef"; #endif // _ETHUTILS_H_ diff --git a/src_common/network.c b/src_common/network.c index dbb8f6b..410baab 100644 --- a/src_common/network.c +++ b/src_common/network.c @@ -1,13 +1,13 @@ -#include -#include -#include #include +#include "os_utils.h" +#include "os_pic.h" #include "network.h" -#include "os.h" -#include "shared_context.h" -#include "utils.h" -typedef enum { APP, TX } e_net_type; +typedef struct network_info_s { + const char *name; + const char *ticker; + uint64_t chain_id; +} network_info_t; // Mappping of chain ids to networks. static const network_info_t NETWORK_MAPPING[] = { @@ -66,73 +66,29 @@ static const network_info_t NETWORK_MAPPING[] = { {.chain_id = 39797, .name = "Energi", .ticker = "NRG"}, {.chain_id = 248, .name = "Oasys", .ticker = "OAS"}}; -uint64_t get_tx_chain_id(void) { - uint64_t chain_id = 0; - - switch (txContext.txType) { - case LEGACY: - chain_id = u64_from_BE(txContext.content->v, txContext.content->vLength); - break; - case EIP2930: - case EIP1559: - chain_id = u64_from_BE(tmpContent.txContent.chainID.value, - tmpContent.txContent.chainID.length); - break; - default: - PRINTF("Txtype `%d` not supported while generating chainID\n", txContext.txType); - break; - } - return chain_id; -} - -uint64_t get_app_chain_id(void) { - return chainConfig->chainId; -} - -static uint64_t get_chain_id(e_net_type type) { - return (type == APP) ? get_app_chain_id() : get_tx_chain_id(); -} - -static const network_info_t *get_network(e_net_type type) { - uint64_t chain_id = get_chain_id(type); - for (size_t i = 0; i < sizeof(NETWORK_MAPPING) / sizeof(*NETWORK_MAPPING); i++) { - if (NETWORK_MAPPING[i].chain_id == chain_id) { - return (const network_info_t *) PIC(&NETWORK_MAPPING[i]); +static const network_info_t *get_network_from_chain_id(const uint64_t *chain_id) { + for (size_t i = 0; i < ARRAYLEN(NETWORK_MAPPING); i++) { + if (NETWORK_MAPPING[i].chain_id == *chain_id) { + return (const network_info_t *) &NETWORK_MAPPING[i]; } } return NULL; } -static const char *get_network_name(e_net_type type) { - const network_info_t *network = get_network(type); - if (network == NULL) { +const char *get_network_name_from_chain_id(const uint64_t *chain_id) { + const network_info_t *net = get_network_from_chain_id(chain_id); + + if (net == NULL) { return NULL; - } else { - return (const char *) PIC(network->name); } + return PIC(net->name); } -const char *get_app_network_name(void) { - return get_network_name(APP); -} +const char *get_network_ticker_from_chain_id(const uint64_t *chain_id) { + const network_info_t *net = get_network_from_chain_id(chain_id); -const char *get_tx_network_name(void) { - return get_network_name(TX); -} - -static const char *get_network_ticker(e_net_type type) { - const network_info_t *network = get_network(type); - if (network == NULL) { - return chainConfig->coinName; - } else { - return (char *) PIC(network->ticker); + if (net == NULL) { + return NULL; } -} - -const char *get_app_network_ticker(void) { - return get_network_ticker(APP); -} - -const char *get_tx_network_ticker(void) { - return get_network_ticker(TX); + return PIC(net->ticker); } diff --git a/src_common/network.h b/src_common/network.h index a2ce262..7980c16 100644 --- a/src_common/network.h +++ b/src_common/network.h @@ -2,24 +2,9 @@ #define _NETWORK_H_ #include -#include "tokens.h" -#include "shared_context.h" +#include -typedef struct network_info_s { - const char *name; - const char *ticker; - uint64_t chain_id; -} network_info_t; - -// Returns the chain ID. Defaults to 0 if txType was not found (For TX). -uint64_t get_tx_chain_id(void); -uint64_t get_app_chain_id(void); -// Returns a pointer to the network name, or NULL if there is none. -const char *get_tx_network_name(void); -const char *get_app_network_name(void); - -// Returns a pointer to the network ticker, or chainConfig->coinName if there is none. -const char *get_tx_network_ticker(void); -const char *get_app_network_ticker(void); +const char *get_network_name_from_chain_id(const uint64_t *chain_id); +const char *get_network_ticker_from_chain_id(const uint64_t *chain_id); #endif // _NETWORK_H_ diff --git a/src_features/signTx/logic_signTx.c b/src_features/signTx/logic_signTx.c index f42addf..a107439 100644 --- a/src_features/signTx/logic_signTx.c +++ b/src_features/signTx/logic_signTx.c @@ -196,7 +196,8 @@ static void address_to_string(uint8_t *in, } static void raw_fee_to_string(uint256_t *rawFee, char *displayBuffer, uint32_t displayBufferSize) { - const char *feeTicker = get_tx_network_ticker(); + uint64_t chain_id = get_tx_chain_id(); + const char *feeTicker = get_displayable_ticker(&chain_id); uint8_t tickerOffset = 0; uint32_t i; @@ -263,10 +264,10 @@ static void nonce_to_string(const txInt256_t *nonce, char *out, size_t out_size) } static void get_network_as_string(char *out, size_t out_size) { - const char *name = get_tx_network_name(); + uint64_t chain_id = get_tx_chain_id(); + const char *name = get_network_name_from_chain_id(&chain_id); if (name == NULL) { // No network name found so simply copy the chain ID as the network name. - uint64_t chain_id = get_tx_chain_id(); u64_to_string(chain_id, out, out_size); } else { // Network name found, simply copy it. @@ -313,7 +314,8 @@ static int strcasecmp_workaround(const char *str1, const char *str2) { void finalizeParsing(bool direct) { char displayBuffer[50]; uint8_t decimals = WEI_TO_ETHER; - const char *ticker = get_tx_network_ticker(); + uint64_t chain_id = get_tx_chain_id(); + const char *ticker = get_displayable_ticker(&chain_id); ethPluginFinalize_t pluginFinalize; bool use_standard_UI = true; diff --git a/src_nbgl/ui_approve_tx.c b/src_nbgl/ui_approve_tx.c index 377166c..51a4c5c 100644 --- a/src_nbgl/ui_approve_tx.c +++ b/src_nbgl/ui_approve_tx.c @@ -3,7 +3,7 @@ #include "shared_context.h" #include "ui_callbacks.h" #include "ui_nbgl.h" -#include "network.h" +#include "ethUtils.h" #include "plugins.h" #include "domain_name.h" diff --git a/src_nbgl/ui_idle.c b/src_nbgl/ui_idle.c index b14ca9b..8f1d0f8 100644 --- a/src_nbgl/ui_idle.c +++ b/src_nbgl/ui_idle.c @@ -47,7 +47,8 @@ void ui_idle(void) { tagline = staxSharedBuffer; } } else { // Ethereum app - app_name = get_app_network_name(); + uint64_t mainnet_chain_id = ETHEREUM_MAINNET_CHAINID; + app_name = get_network_name_from_chain_id(&mainnet_chain_id); } nbgl_useCaseHome((char *) app_name, From c8360741a47c01731d2cdb4dda6e3f3b46c97254 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Fri, 16 Jun 2023 15:52:43 +0200 Subject: [PATCH 47/85] Activated ENS on other Ethereum-compatible chains --- src_common/network.c | 4 ++++ src_common/network.h | 2 ++ src_features/provideDomainName/cmd_provide_domain_name.c | 5 +++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src_common/network.c b/src_common/network.c index 410baab..9959ee4 100644 --- a/src_common/network.c +++ b/src_common/network.c @@ -92,3 +92,7 @@ const char *get_network_ticker_from_chain_id(const uint64_t *chain_id) { } return PIC(net->ticker); } + +bool chain_is_ethereum_compatible(const uint64_t *chain_id) { + return get_network_from_chain_id(chain_id) != NULL; +} diff --git a/src_common/network.h b/src_common/network.h index 7980c16..8361bcb 100644 --- a/src_common/network.h +++ b/src_common/network.h @@ -7,4 +7,6 @@ const char *get_network_name_from_chain_id(const uint64_t *chain_id); const char *get_network_ticker_from_chain_id(const uint64_t *chain_id); +bool chain_is_ethereum_compatible(const uint64_t *chain_id); + #endif // _NETWORK_H_ diff --git a/src_features/provideDomainName/cmd_provide_domain_name.c b/src_features/provideDomainName/cmd_provide_domain_name.c index 0d0849f..8cd974b 100644 --- a/src_features/provideDomainName/cmd_provide_domain_name.c +++ b/src_features/provideDomainName/cmd_provide_domain_name.c @@ -10,6 +10,7 @@ #include "challenge.h" #include "mem.h" #include "hash_bytes.h" +#include "network.h" static const uint8_t DOMAIN_NAME_PUB_KEY[] = { #ifdef HAVE_DOMAIN_NAME_TEST_KEY @@ -124,8 +125,8 @@ bool has_domain_name(const uint64_t *chain_id, const uint8_t *addr) { bool ret = false; if (g_domain_name_info.valid) { - // TODO: Remove once other domain name providers are supported - if ((*chain_id == ETHEREUM_MAINNET_CHAINID) && + // Check if chain ID is known to be Ethereum-compatible (same derivation path) + if ((chain_is_ethereum_compatible(chain_id)) && (memcmp(addr, g_domain_name_info.addr, ADDRESS_LENGTH) == 0)) { ret = true; } From e019eed3ab4b9bb9b866539d0df399f8e170ce6b Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 6 Jul 2023 14:46:00 +0200 Subject: [PATCH 48/85] Added a new ragger test --- .../nanosp/domain_name_non_mainnet/00002.png | Bin 585 -> 394 bytes .../domain_name_unknown_chain/00000.png | Bin 0 -> 414 bytes .../domain_name_unknown_chain/00001.png | Bin 0 -> 368 bytes .../domain_name_unknown_chain/00002.png | Bin 0 -> 585 bytes .../domain_name_unknown_chain/00003.png | Bin 0 -> 327 bytes .../domain_name_unknown_chain/00004.png | Bin 0 -> 436 bytes .../domain_name_unknown_chain/00005.png | Bin 0 -> 472 bytes .../domain_name_unknown_chain/00006.png | Bin 0 -> 382 bytes .../nanox/domain_name_non_mainnet/00002.png | Bin 585 -> 394 bytes .../nanox/domain_name_unknown_chain/00000.png | Bin 0 -> 414 bytes .../nanox/domain_name_unknown_chain/00001.png | Bin 0 -> 368 bytes .../nanox/domain_name_unknown_chain/00002.png | Bin 0 -> 585 bytes .../nanox/domain_name_unknown_chain/00003.png | Bin 0 -> 327 bytes .../nanox/domain_name_unknown_chain/00004.png | Bin 0 -> 434 bytes .../nanox/domain_name_unknown_chain/00005.png | Bin 0 -> 472 bytes .../nanox/domain_name_unknown_chain/00006.png | Bin 0 -> 381 bytes .../stax/domain_name_non_mainnet/00001.png | Bin 15045 -> 12824 bytes .../stax/domain_name_non_mainnet/00002.png | Bin 7485 -> 9348 bytes .../stax/domain_name_non_mainnet/00003.png | Bin 9348 -> 5086 bytes .../stax/domain_name_unknown_chain/00000.png | Bin 0 -> 8435 bytes .../stax/domain_name_unknown_chain/00001.png | Bin 0 -> 15045 bytes .../stax/domain_name_unknown_chain/00002.png | Bin 0 -> 6933 bytes .../stax/domain_name_unknown_chain/00003.png | Bin 0 -> 9348 bytes .../stax/domain_name_unknown_chain/00004.png | Bin 0 -> 5086 bytes tests/ragger/test_domain_name.py | 31 +++++++++++++++++- 25 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00000.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00001.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00002.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00003.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00004.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00005.png create mode 100644 tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00006.png create mode 100644 tests/ragger/snapshots/nanox/domain_name_unknown_chain/00000.png create mode 100644 tests/ragger/snapshots/nanox/domain_name_unknown_chain/00001.png create mode 100644 tests/ragger/snapshots/nanox/domain_name_unknown_chain/00002.png create mode 100644 tests/ragger/snapshots/nanox/domain_name_unknown_chain/00003.png create mode 100644 tests/ragger/snapshots/nanox/domain_name_unknown_chain/00004.png create mode 100644 tests/ragger/snapshots/nanox/domain_name_unknown_chain/00005.png create mode 100644 tests/ragger/snapshots/nanox/domain_name_unknown_chain/00006.png create mode 100644 tests/ragger/snapshots/stax/domain_name_unknown_chain/00000.png create mode 100644 tests/ragger/snapshots/stax/domain_name_unknown_chain/00001.png create mode 100644 tests/ragger/snapshots/stax/domain_name_unknown_chain/00002.png create mode 100644 tests/ragger/snapshots/stax/domain_name_unknown_chain/00003.png create mode 100644 tests/ragger/snapshots/stax/domain_name_unknown_chain/00004.png diff --git a/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00002.png b/tests/ragger/snapshots/nanosp/domain_name_non_mainnet/00002.png index 6a5a9d64a202a062cb8bb576a84ba653e232345c..6af0ec54b2a0718d258e534bf29b059567fc8a37 100644 GIT binary patch delta 368 zcmV-$0gwL41d0QYBYy!=NklQ31IlDwCGRAX5@5>HjYF!y}X z2vV>EA|xdM003aRpVb{mDJ2oHKXc9_?*H}MoqA{s zu*tJcY=yejLXWk7f2|0dy>6pvo8(`qTG{I65yYJVb@)7i+kbBP3Oxhg5}^AZ4YXa#J<-?t+bu)@005Z5xlJ6sn~bnq4fGx`M}(kT>(7Fk=bgPe zwr1}fw0LE+*Wcyl8Q+nw*+|R%s?+^4FsJ>!7_-bgWmc?y!!cS#9Ar`kU~^TrP`V#q6YCxBp=Wc31*Z za|pplCC2K$e8+w{ILUsi&`EBBOb&)3yZ`_I000000000000000z%VZ&h5f)0OD|#o O0000Fdu__dw@MOS{tr(OJ6PoPLP9@*UxLb&ZA1lC4x zvBG!hMH^#>l)7kF<%E_%_tzyc0DA^z7O&?@FshG~zfc zeYg)OrT_o{001Xo`7cV6F5PinZ3RUt^2VwMCwNgqfg_sgp49P63cmjx@Fp$j#-~R6 z9W=|o`6{6A%^cJKW8Rm7R%x^V000000G!J|8HZ1szRqx300000NkvXXu0mjfQq~Wq diff --git a/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00000.png b/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..487ea10fcfeb2f3e6b79239459672251d49addd7 GIT binary patch literal 414 zcmV;P0b%}$P)vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*fn&`6tH9gqo;^MN#J@G-NZG(W*iG}t#e1Fb- zKV8KTt0a`{lX$B4$~o~B?x*6e)~<@4Iz4h@Jmb~b5&vc;g`2H9{psfXevRGF%X%)F z{W^G1#bn40-weR!F*3L+ubT($m0wc}!uNKw0-sV5H z;CF7g9MJJ=+rKjGEBl+3>A2QyMfKUZ+;mUbm;0)$KRWh$yq((D^ZhGdwuD|?hi~Df z@|&)@8Hr8?_0j7y!?>j6!~H8~TztJ`f#FwsF1bzDbkz>zesQ*DR9hWnx9on|hmN^& zyJ|dM`zN>MP3ZiWI3+;%Z?hr$v=dI#e(*&r?E!in863#FcU<{Z?XiYs!60EzS3j3^ HP6 literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00002.png b/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..6a5a9d64a202a062cb8bb576a84ba653e232345c GIT binary patch literal 585 zcmV-P0=E5$P)Fdu z__dw@MOS{tr(OJ6PoPLP9@*UxLb&ZA1lC4xvBG!qQ&wg@Ymi`OA5aK9q=YC=*Fi;`yDjPzxkl=%^cJKW8Rm7R%x^V000000G!J| X8HZ1szRqx300000NkvXXu0mjfUbPWB literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00003.png b/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..85a797b91fa8909529984c6f23fc9581b79ffb48 GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{6)ba4!+nDh3AW8Pr}0oH)1 zuWEPxd)!&dy}CnU(gjz^$NRQ#nkaNa-X_e0lYwE{?~YkJrWD0Ine+N>;oc%f?R1%6 zJ#*{gG?!j`Jvb2JZiuEZ?ea$7niHD%Ds0 zzeoR3588Y)Ce~p}uY+sOmD84@%NC#h-ymS7nAnPBi zdF|e$X&)6|5bm70JHXoFKX2x)MGy6v85p(|UKieF%X40FTk%o*r2kz^EW6(&-sxF8 z`+RLqESv6&B(qz-%O79T-4ppX&OR;J-+9_UqvjP$_s@`Wxzwsu$?q#&b2QSTI5qI}IeE+uQ$d($HH~rmjmfzpG^!&>@vHo;H|A#$&J>60(rv&w- z{Y$*re=CCT)rWkxbu*ft7z>`O-oI7u=d4xjo3yuXwAx+AyG_?&s?U?T(oz$vN~hG^ zITd^LMfdfDVy;c?KbE!zHs9!cv+j?u-i)SGA(L0?zp6X2s;;m5>ao50i9jz_e_Gr2 zjaxr8`Rh@Y?ag!bLo2gxTv~bJ)XKV#_qKdJdgcDJ@>9jrf~PT`jyPOzcvQ5zaQmZw zsyQ_iV&5BC&*W(?<|>M3c>Lz-s+s2Awug&us=u4vloD}$y3^rY@dWQRp`~22>^5u8 z-Wjt=zq~iKakEWo=0=}0$4N$E@I8h8IZK)78&qol`;+03*-H(EtDd literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00005.png b/tests/ragger/snapshots/nanosp/domain_name_unknown_chain/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..570ce28d53e82ac396ba25c370110058f3a638f9 GIT binary patch literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~oQ31IlDwCGRAX5@5>HjYF!y}X z2vV>EA|xdM003aRpVb{mDJ2oHKXc9_?*H}MoqA{s zu*tJcY=yejLXWk7f2|0dy>6pvo8(`qTG{I65yYJVb@)7i+kbBP3Oxhg5}^AZ4YXa#J<-?t+bu)@005Z5xlJ6sn~bnq4fGx`M}(kT>(7Fk=bgPe zwr1}fw0LE+*Wcyl8Q+nw*+|R%s?+^4FsJ>!7_-bgWmc?y!!cS#9Ar`kU~^TrP`V#q6YCxBp=Wc31*Z za|pplCC2K$e8+w{ILUsi&`EBBOb&)3yZ`_I000000000000000z%VZ&h5f)0OD|#o O0000Fdu__dw@MOS{tr(OJ6PoPLP9@*UxLb&ZA1lC4x zvBG!hMH^#>l)7kF<%E_%_tzyc0DA^z7O&?@FshG~zfc zeYg)OrT_o{001Xo`7cV6F5PinZ3RUt^2VwMCwNgqfg_sgp49P63cmjx@Fp$j#-~R6 z9W=|o`6{6A%^cJKW8Rm7R%x^V000000G!J|8HZ1szRqx300000NkvXXu0mjfQq~Wq diff --git a/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00000.png b/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..487ea10fcfeb2f3e6b79239459672251d49addd7 GIT binary patch literal 414 zcmV;P0b%}$P)vpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*fn&`6tH9gqo;^MN#J@G-NZG(W*iG}t#e1Fb- zKV8KTt0a`{lX$B4$~o~B?x*6e)~<@4Iz4h@Jmb~b5&vc;g`2H9{psfXevRGF%X%)F z{W^G1#bn40-weR!F*3L+ubT($m0wc}!uNKw0-sV5H z;CF7g9MJJ=+rKjGEBl+3>A2QyMfKUZ+;mUbm;0)$KRWh$yq((D^ZhGdwuD|?hi~Df z@|&)@8Hr8?_0j7y!?>j6!~H8~TztJ`f#FwsF1bzDbkz>zesQ*DR9hWnx9on|hmN^& zyJ|dM`zN>MP3ZiWI3+;%Z?hr$v=dI#e(*&r?E!in863#FcU<{Z?XiYs!60EzS3j3^ HP6 literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00002.png b/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..6a5a9d64a202a062cb8bb576a84ba653e232345c GIT binary patch literal 585 zcmV-P0=E5$P)Fdu z__dw@MOS{tr(OJ6PoPLP9@*UxLb&ZA1lC4xvBG!qQ&wg@Ymi`OA5aK9q=YC=*Fi;`yDjPzxkl=%^cJKW8Rm7R%x^V000000G!J| X8HZ1szRqx300000NkvXXu0mjfUbPWB literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00003.png b/tests/ragger/snapshots/nanox/domain_name_unknown_chain/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..85a797b91fa8909529984c6f23fc9581b79ffb48 GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{6)ba4!+nDh3AW8Pr}0oH)1 zuWEPxd)!&dy}CnU(gjz^$NRQ#nkaNa-X_e0lYwE{?~YkJrWD0Ine+N>;oc%f?R1%6 zJ#*{gG?!j`Jvb2JZiuEZ?ea$7niHD%Ds0 zzeoR3588Y)Ce~p}uY+sOmD84@%NC#h-ymS7nAnPBi zdF|e$X&)6|5bm70JHXoFKX2x)MGy6v85p(|UKieF%X40FTk%o*r2kz^EW6(&-sxF8 z`+RLqESv6&B(qz-%O79T-4ppX&OR;J-+9_UqvjP$_s@`Wxzwsu$?qyDU;XaOUjRnu`wU6rmV;;(%8h-cKt95^+cIY}x^|>`ynr&iL>69AV zQ?XZH9Ls(%r|F4eU1s7g$2l(7wEwqoFI!-AH6`DME7ab-W_RyC{Y0P#t1qo>JIAe` zn*86P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000U4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00001.png b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00001.png index 25278595239f5dad36d574d40b68a59e5512c75d..661ea68efa75f3947e58200c587b153cf08f73a7 100644 GIT binary patch literal 12824 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 Pn9PhUZ`a&%fBL@w`ChqM literal 15045 zcmd^mXH=6-xGiEuMJ!n87O-FdQF;kBK!||!&_M)*(5sYysK6&ul#(b2NSDw{s8R%_ zMTkH`ga`pc3?zimLL{Nwm+w30taE?dboMh zK`$Y-g*lIONfrRgzvhPpxa@9M`wjHpbPLlT^2l zdlAKt#F3Z&&`$2!($3ypN^ia#U%*sk0{i1TDK>wu)(Wz za1XZ)`L4j7W7$G`>d7LOa>N29x zeP0qJX)&yjeudknC7z7h@0B^>O$eI64O5sk^&UfEcX^*E_{e}%CCt=)5iZ3eCGHs- z*tipHcx8s!kdcV)^^YLP$%82lKtpq@%R3{lpmPG%`o?DW!AU)SWf^u|g*|?sNX){l zbV)w`t5fTr&{eqg4;z(x;yi-+=lo9eRKG}@eDN~x-tAjCcL+ht?O~y-0ph~iZ!j!% z=j^V+-A`n+qNUsm{dMm>1I>jcN6LZ*k9emvC1(GnXVJX+SpX>;6?(TF{FHxV&*qT4$Rwoy>F$*sdG0!BEBL?_yLN)5D zaC#0}j`ybw$8W7(-L-vD02uF_h}bnL0#4&dsAWEXtXmA{Y-PhTc^3h<`4LDNN}+4yBD6w>3|?Xf)T&jn}7>3^CUNofU@_ z%=u-}*$WqN?d|ROqX!r6?a~;rF*l#CKUOfUq~3pPxSxCPDxZG)${xq*?Nfc&I^Ub4 z&mYFr@n$E)J>dB#SnN6V)bZ%Qj~@T|AEv4MA~8(CGI6Yw0MxGKEP2k}qbVQzOsOp6 z$vuZ@uYd=o#su`wa$v`SFbL9t?}exS973U*TdrXI*ME68WSS*{PkG|UX_zd#zLoW| zi*5FmFjBtXr9WuOL)vrwk-*?|TaRe13-dOTTDJ&6IXO8CMw{y!8}GwLt%&tZCX>1n zO0yD|MRz#-Qmt~ursJ;MPm%0;>1NcD9kH*D$PmqO{`fop_$9rRo&Ch%wpGAb*K)B~ zERmrU@qDKqnVt6C&w}$ZQ!RA0<|lvg3(g7I6v?3+nY!75jm8OY)HQ4X8IPen48;Sz z4{y|0G4!FQyM(sdD~HrcB4 z`~AS#oeI-wi!3u;d~7bCEc&LeMnhF|MXe}Rg0QDbPMPy{Q@w|59ApNMiqa}Sb>I!P zBP=Sa;ghv_I#^}O9kU6i2<$HO*UYW)O+Oe0G&TSi}JTgDgS9t0G zl6nfUsj}T@+BvqSO=7px%Bq;*=_-Dr4wVEdj`!AzD711s)D=lo7@$(A0T!+nBsMVf z$3KV+dj!ZFRWszvF)(_6IbIftS&l6R#=rk46uY*xlzV9qHRunFLEvmvHf?j$Zu9Pv ze^VI;o(Ggs2Fl#A-j#F!lmlvrA3Z^h0Q(r0qJj5u+i`s;XadM|Jv}|Z_qBR37;N^- z%p6T~Qvha4f~;CK`5P2vs}03{2q2S;1>tb`9Fs$*W0u$FgVh~&Ci4(|+IC?-Gg2;e zO72|M#-FV%#5rR>(Um(wQ@19?+0SR99uR^O5_!erP9cm6PA)$9&oB9Z%d!9YD$`n3 zhQ%Xufi!NUjn{}m^4l{V5{p{xwXh7G+XYN6kcUw9^yVV>Un+w&-JV z;wba|u8si5AiL8*kmxz~Zf}QjPIQo3R^Da(l)Hu_f2W>i!|UEJ(IqUH`W(S!%3Zsj07a7joEBSd3CqzaoOSRMvsSw-X(9M3OONGh~Wk) zF>{pLgi4kzFsNjWJqWeAOyO5%1oU_!Sw-pmeIZ0;#*f>-Q>p8?mj%b7w2cL|&s}IL zu)AorvANmmbe*T|$pMhN?ISA-!LN%_Iqf{-`un@s$3Oq+7B^z`a}Jy&;G=k~r~1>OAd@EF z>pYQ7`w$$}LEN6X}>+3V3O2BUIh8zznr?B)5df$Lk}NRtH9&+FSKISe7k!dig`IV z-vl(wx^1LonC$yf`n9Al;RtJI5_^H9H!iqlY&@)Q0$IKM zb~=yK>oSlST|^?0^in?V)I4LoGn2M9&?KF>gz$Giz!K}#xvc_|%$=dPk!P(-hkFQx z4KXWA>Owpr8ZUVNm(hMg+|Q263Rn};PqfDhQQn%h1UW@Bsqmf^mwCeb74?!>Urx6k zmHsF95pad|Om308E%+$X|M^y9KEJ>pD70-x^*-&?mN+bNeb!+NWwT4J46od7PXE;O zy%vR9*t!qD?_w2Z8&8T+Lx?E*u@$TRibJIgM(8XLhj<8s6_zz#`YNxA(2NuiA`LQv z!yl~As)?jXF4R2NTba8nqEB~w251uq@zYLU zFkfmJZ&ubf{<3C0%D++@o&{O|PVtxjT_s(GK$3v+88)M&LW>_ZCVrweM{dAicLYE_ z#V;fzBxqLAdMSe1ZzT0b6qcttcR(Rn^oZ&HZ6pX+7|}p1>2od5f@)qe-kF9rCcW9h zNSw2=A!=ZQ9IyAHjJcf0u4rJ%D&E9307=f>{5!=1IlXZ_iINZ2(mHK82d&7NhaQhw zRp=>HiqD(yE^f=%0rbdXc}0T@0SnwMGTB+-lrqlMN-5m6Sm_-6!kF#sJLD-uWYG=J zb-Dw7{z~7-&U#+F!atJ{7@y<~a8ezc8b9`3TV^I)+=H4Etbe_$xTS|c8>zHa*z zgGSk+`IQy;Z9OUprPd7~OoAoLAh4YjUWWeOkY}!`nt8}_=>*h6dqhF3&4cvD9{qiQ z(j}+k^UUh^4fQ2E;@~e8aX5h!J6ml*;uH@G;hh5BGLtBGIEPtAo=%SCGL|{te6cwc zlTzzP`69XC&x`6oCFlqHapvZ-F{QxHZjI3jTEq#2a7c1U$hvdgVpuDRZ?$~DB{zwZ za?3pf#d^nI7IT7xPV|%>W7!S;*tGQkN^+d*EONGev4J2769zi(GN_bMYRm8xsW|Le zffsN!70KQDOuNc7Y4J^ubXuV;NL3*u>9}LiZSLbPbFWaHaN^Db8i)gb^yj0|5x;=k z1kRDlDz3i`$6TwwjU1P9-92R4#QAH6Xe9y_>Bl#htA+cQnbVu5ZHEg-e<77C7wmZ< zF7fa??+;#tsNZX+JqmoKB8#j3>4-gxd>OZjoq2~2VT}9;K41r}C`O51ve-LX?~m5} zI58d8YA=hFva8616=%2-=&W3{X=K#jojg@h%CV1g+k*<}`bz*(8ArZ7L9k+f>oCcG zueAEM5$8=mI`#mp5ny`~O6EOi!GrpnT;YXOS#&q`hNx!#c5mO~PmQ>wNM6jPHIv3M zA9tsT?QlQcft6#2_$y)x1@1e9ixO>Hww)ACof5AmAn0B<$#s5uj;aXa9Mu-aJ`M3I zctge&&YZ3z*B@$XWsT!`F_iDX3e-Qy)w1tF0(?OwU!g!Qf7j_Z-D z4XFHy!r-(mhUeSN!k>}RE=qo)7|ZgF*rG3H<=am?&9v>;NH3Oit8?Jl%uU zOX;mV&j{I@(aL8=Vt32E(9+V1(`sbbJaC|IJmz3)<&YRu_~9m8k~GF-+v?Ba@vZvh zHfC~9{)W0>G+H8nyee(^WmDPf!Uy2LGu!TvZC!@V2CB4r#4>>DoRtw!TB`G|eR|U3brD z>WF?iG?)jH69ZYt?1uFXYT*SaCM`2@`|~egL}4e%mwuV9EJ0@nu@l1cgj~d7USY#) ziW?JzojtN74h{SDqtcm!vh(Mj#wa9F3e)Wy0g$Ja9wKLXBBB1%>LkoL%CDpqmbq!> z&^E3gC!>zEK4uGSyQ@{JAmt;9-Mf72B36IR&hwuXJxzmFtcXCvqQ=I3+yctwdHkWJ zq;6Q_ZWV-_Lj!;7Z7-P-Anx&Yg-}F&6C0zZyHyyaov(_RC}+g?3lk%z$5Y z^#mu>=K^hQYj)q&5}961o`l`;w4c!2Hws@|5-RHaF}#_}4!h4<_O|(0=|3%BWnq`3 zaJ#3_;+y?KHOb*;bp)_$=-|znBk13V$(z8#etP|3-0`T#?;HQr%;hiRZrUR#ir4$Q#=4aq8=sbf#fH2>$1<ZoDZLbzvE`PP zMt}<gC^?Bn~|gAME9n&Qlg>up@nC49>40n=*Y!o z3I6aCV&W=x9%7*fKyZdG@d9Vm6Es+8LE6-5*oVo-+j%gpdp^(Z?q`HoLe_oDLD(rP z#T~FxbR=O1sssm%G{SVzPHpN40U@KB8lOuG6k4hko+q%nV#T06$K)cI4?vi z(hz>t=s`vitv2IdF-l+8e1aUNaLvD| zKuZV4S{Gp7?^!;Fw+Hynt`ps(h|&SiuJq^uH0QIY#|4}g6i%`8ms`MA6h zhibQ(d^UOOcd3P!6atuoDyB(f%S3{}XK^UzQX7dmJZFla;4D7+lyoD3;P}P!EJxZ> z;tjB*cEj#8SvT;z8D+xoVcsgpz>=UHf)IW+ABkUe#Z|p>3SgL>pDoI`A&aIR^&oM~ z%d6#85h5DkuAot~XIjl`;D$GUqzR_xN(tuC=yF>x0S}{3_LWGCOP^Hz0NT``md@gQ zw+;ca>K2b1t2#-kSD7F?c98Xs&RiWrBNRhG${IJSaC=|#YhIK^CyAZMVB*}8N_k;6 zO&L=WU=e4^BMXG!4_lbz1S?E2wm?$vdir5m^unjau3<|x?8`r-0TtXmn zq`3z4Di5kY3^!*io^}2nMSmp3TmNaz0p>K2lncMh*oqs1LZ5uGxAAVOs+Ft~#V}S| zof#D#CHRJw5_@g9N=2o0NOqiJg7*o|T)LFv=qO6{epUx&l@_Hdf*0{P?R_)qg8=5< zd-Im}kn&qh!(bshRr8AE_t)*MgWmbrte3?g9W3y)OpaN3WV)@uL!@;Guu;%FGVW@M ziIDONlypOMD+M0tM-cV+>CB*KBNTBt&}m6|CtXt+Q4Ytw&`t z+EQxjmGq7`m8NZ4+%*l!_6J2}Bqt}gF)1Wq&EokxZ9Q}W_EIfth6K<#a??InncOXa zg=tTf1V|vA+_2Nef?`MZj~zB!P)EqkEYBI>yZu1)dZ*vOnzRMLsQ$bdl}3^dwDmY` zk~tUK(rAEpwYn&$XmG>4H0}*)nffFu%JQXqyX3Ei;P}Xn@5&-Q{^)FDL9`c4>%~XL zt%=l*>WFjbPK?hp6`M>KD?7qa6zN%v{elU7kSdcRP^JeV zy)=>HEzM?J*i>X}N&VB9J9k*Ap-5{@U7ffC&{&lg+$7ceuuUv$CmWTD_elpq1y6qH?XG3kOt?cn1<~uP|Vgx`+E+in5%$%!ot?WFr`&$Hl zay$HU=Z`z9Z)*kCCLWYJTvKWmPt5G&hfQFDB6mZy&QwfXQz8hHA+hK%0kZFYUywta zw@BCkAt_L~(~M-OL-+|q>NByk5m^QRC7+*jREXbzTU1Gee$|LW{m9v1v`Xf>duRbW9`Li>$I^TQtm=XSG(@}Iwe z?d2KgpYzpo@ki2-QW{X#lYm)?_@m22%Ze}CbQ*Vwgol-&9RjSt7ahGA@Wm`4*PcH> zmLWYOe<|e%Cw%uSIazypYo2`|1eCM71uSIS_xpN3OCYTTMy-x4cz-7_Uod# zc@toPMcq%8>`U<$1Tx^J{T91>#UtzVWIUmIV=IoA9@$RvZWuyj{5%)AHld104l{H# zD31{BfkeXROu}>i2>E0bL4tQ7$Gs+FllgoB@MMd8d0OKr;}}{*_P)xfeyC`Vh|W0` z#I`1F{iR6#F7`6Pgy@ta36p!=jMJ$k!YxAYIqvGXu=p|Te_GA$>T+&71!i30FgIT+ zojwv|XGuVRlhI4rkulPG3IQxts0?cK6V3K2zX@C4m!7ux!Ldjdd069A`? z-P-pL5>mbgfW|e~T!6jSlAY?v$a+o@|09d8WvkcCWI<$j2&SDNj4O5?cOfZ}+T(py zFvzZSf0mAM9f?VCI%hBf=tE65un~opi3LCnbY^%rj7S_W$zB*yNX(!DXO-gmCuMt& zY70E^eLEf8QsPqX0se7_fjy7s=EhcfSKxE5T#I;(WdzrL8!J5Z^vM&)lGG1qZf@ZN z(zIDnDz=S@*ZV%7N=BUSx5_-z`tfv6wMSK*7roRX zEAN!H{J5WZPxZlzn`I-_KzUC`MzH$2u4qpwFUG!c=9rH3+k}^P9(a-r{JwNxg18#e zn&($^H0#4}bAZhCeKFMi*W~r^&=f5}MqoqGD!_$313kMlxILL6GndXNq5Q03Ctn%N<@i-#{tAa5UM1+PRRF zFUzA!1X|(;4J@7~hR#x(H&C8@29bHneg1br6l!(C#*p4$qp*)(PrD9e0B4CQhp8KYQe=8Z z!m=|E<{&Y)Hp>;e2+vwSp!VMphEweR%u>RXXbGhkppfiu`hhGpk$ zbbn3R<%2;2MlNfo;4oOCysiH`>=}8jpl}!9K_L#&tZ%>5uM=-*eyT1;T5swq-2vr%Gaw}l_dEc*O1X8k)G#D89*`HxkdCG3tE;zjIVLG!%$3PcB5 z^8y#FmonCKg$;Kg1PN+u8#l^@l(#VfT|XWL2xKZrIqkwcN-HOz%gJLMYU0UuguXOv zlypvkxoA&{X~D^(qB#O4npuWxMX3dN$j2T~R8&;EhZv8_@>m?czMO(5FU|T{!St+` zs$9-K2JeP&YK!gBJ@3*&?ARYH-tHOobl@(ZgsMovH=gQF8uE=OcoFL>=n4jLl}ZLD zHUmZY*^|u`nMFg}**hu-N1=yY?M0j>3B&>7yL-k0n>%!}ly1$cVZpaqEJd}bcgY-* zN)m8#ef-LEI<0s_ZxWqC1q7n}t9*`pfHh#QHNzvYw?e(SMLbzIC`;Y|uu_m!7Mi^q zh;ylW;z4%B4Y-V=xn{%j&K_SMWlKL8mf$EjI5^b&_Sid<@~g_c(YGHEg?v;EOoL)> zB^&aHJb^iV^#diAIT2dk)Bn~!t9wwjy})rguGhOERsLvL_epI(wJgKpRGNyz^?T>_ zQZ^$2k!$HmT9n8M(Iat};}euJ>XMUsoXyQ)#b!SGm5k;EUzIb=10B*}Zq*}8g~8`} zmw^V11rxKSyZr$5#H+x3^~UYa$MyG23z^~XrvDb^e%M-TH|NEA)#Y6-uqv1wL|w_h zwZHxS3)-=LjxssX>5?y3O@wY;*jC3MNhuoZ)V|k~`kqh!Ce&~r^0m_V?1Af6S6TK5 zqbtUW^XXJ!si|J7O4$xgt(9dMMrfI*N@I%d@vww3=Yd0c?G5&^m6{LrUU98H-7#M& zrrmz;C11YZ-QQjd3UJ@Ydo+9ZRZPvuoMgU&R4!sIWsRJEF#eh?xbSj(-sOW$WmgzA^;PjVVr}ztvHG&lzGJih98JV&NRSE5#z2 z=G}1L{qTXK1|tc-Z`%<#9lVNZfhw;bsw(~&`BUOd2m-WjiSo7xeZ}jTx1Q2jyFfGB zY1cSRu)7w)l$s3mIdR`>V`dkk*Z1v5VSU;#*B((=)&=B|vL@jNjImRKP>8+Mo;)XBDjUb47(>-b+iEV}8-+j+;bB3zUF?qBl+wkl!awAIm zT{7(~@|{S#vMrdxW;Z1GDPAN?pPTvx@I0hN=VPt>%boZKjFz$B@10kW*rOd~aqo|N zS9yHml0of}4Zixa2YAId0|at;j>`Todd<49{2N8${x=F1hKs%Bo8$dbwa`DMl(%gZ zmoA4Md95)ATLlkhst&HlP`rqvLFL)tcP?YNR&z@@c`Xx$8JQGcwVSdmMbQ?z8?%}w z7{RG1FQaz^f`!AvynZ&;O>v18X2%sTUN~=upp09sXRRE<6t}Sz40N@o%}GyEB=Zlo z+E<$PWaeE)d~(^7*pcDaGBMxaj9rOfT>9-YSSgd^HS`|qmj6Yw3WXYf5Yzr;MRURp zTaPn*sIjdx>&Bm78@81%3P}673&wy4DjwL_Mee{Z->9yjcTHDGqg%fLod;g2<_lww zk$;REp@KGo+JFT_=i-jmqyN!WeIt)D=Ru1CB%~FMByzo%QE}?GCVDd#YqUA_qP^Sa z5C(8|6cvp>v`4g*#}sO%!=7~KhSZd44g|gjhUC+b85Z>8V2iCR!jiG7DuC6)10uMF z?bX)x;3iuOnbW(@Re74}WfXN;GFleyP&YdLPX_ymCbubS^6OrDo2Q104FDV~9@$-~ z2D!p6fv%fQhhc9E42|+GbGEj`4UhIzt5ubn=3e@?j;7Ea(#@0+lRu2zvTA1%Otv&5 zetMGFbIBzX6!-{s@=8Hze+R2OB_n!PI~-{jU-@ z>ydZYA4UC)NRd3gOXSq_PSs?fs`QkOdT(sKVr79Qp51yF_TXxXL(vz~jxU2mlBu*X zS5&Oya~e4*vUdMU8`Cmte72P4uQmtY zS!u)UR{g6&Kboq11DNR3t-B$1x`xO}GB(lz$_z7_KME#B4OzpULl3RG<9bS-*TYqFkuI~5d;6IkA@43G@ zHRuP-Nc%SXlmaH|ZplXrVyD9q*{1NrA#c}D1Fj^FjBKKM^%=ro9GdgBW_pW!or*-# z6HEAs$y zt0As-@e~3ilu_q2*j~ILgdwFt0NSjM_&NkH1F@B$k}lV10I&p z3;C3|E}+l=WQ-9^8_>@Q8&Md}Y@0DKsKy3Amtu;weeVntYKlFnJrvnaVAlceVm5qd z5SAo1oP=~KSu+`vZ>~_!GDPGa_wTUW9O*js?r!!_4dAV=ppVQw3jD^OhyWawR(T%D zW!CyTW-z*!&^sr1)EUj@hlGM zRo?5$K1%rK%e?gTQTq^ydS0{j-wXDtBEok3R`211h~*j(;IO6C!MaRh$zNyWlEjGO zZdZLg>h?-A(`s)sRiq+XE9eCzJ1g^S$(N$E2G(-_FP;3mu8$ogLW9=o{1_(U3e9+? zr%RS@rBbtP+l#%?EdAl<`P))S&U_!HznH3LZopUC&c$TPx$CWa9#xU0gqXOstnp19 zi)LM?{W8lavO?%3CvVurW(pV8Z^gWk*KU5N#I!a66Wao8`8vM!8Fe+66o z&`KbDzI2OSK~L(*Pv~B5c{r7}=n|jzg8@JUz_raMH`XPSwV;B`DQ~qeWQ`UbuYd)z(jq97fwq3 zOrkY_Yc5_F_je+C)qMg%HeV3_XbETewD0t%gPQW zp1nC2D7>Zl4+$};K`n9z3}gA1rQ?5bx#3*tUrm30*(Y^m;DRQmecy&D8jPS&DUxH? z+|r*LjCk5Mxd84=E;v3m2*n} zDxP{3uBtY1T2BEucTy|~L8f+9b_BH7)u#H_1I1IgHt7N=nrhaiXrN`TGQSE1U84Ze<>jt1jLp@@+?t;&xATO6R_gfNp>++m4h&~9)^e_VCm ztVEJ{L_Xao@PMJ+_rJ){sMCj#I}LEZ0+QyX$CBvmY_uySh7n{9r8zpe_Lw z4<*ggRiw-Yw^v!@n2aAoVhTYJG#KUL*JNwdO|6fZvj;14Pa})wDE>|Ml^jo9 z0W%1ASHk(Kiw1i~DgMU$w}-@rf6U_|h7}ZxM8$s~3BoW%wf%CIe5?u2C)q)*_G~UZ zo7xTWP_`)F2M33l-rjEE@$IcLwc z_|g|EoHhWLi@^0H67qE{g)RgFP$K0KDnHDtJi|omx~>*~&gJ-eetw(tz!iaRW8i9m zh~S+rahFh2T2$fh~+zJY5y)cTnd9hZ4w z`6@|33St=;xby>=S-!eC5ZD2asb80^6)C<~m4mgJpca6-*x3#vn?IB!T-r$z$vv0j zn=8VjqLRtbUnT;T=6^o`q4?e_qiETKSg+%#x$t3`dJOvNBe_`Z!D($L&wQGrx4RxN zZ#(TWg%Y+{tU_VowtECTm0JAC;iMjbLz?49WjAl-WV+PTc7k+|ttexX>h<_2KuZ-q$d9e0=LTgRZrWGl^0M}xfH zV|rE1QY5kSCyWgS0SW%E8)EAvO&cv0Fjeb&PXH@>#GC-BnVkgg+_dCCZmM#k+_i)Le!0kFHjmAu*KTmMkoF`b#aj z3Ite4k}jc8H2L7 z;FW9sWiemsYC$A)SugWB3PvmT9fyV$SAsuuU!M&P{4(0PYoz-iw5V>L53&|F^pX*+ zsHR}6RXuSE3OF~1SvM3v;%frsaxyF5EbJL|1vseOi57oZilE3%-yDi<|vhZWEp2VBpsZw@Suyw2J6QNtSj&kLb-=}vzIE*2%& zgzuT_Jku(aP16`$iKt6-ESb=tph}%ZWDA4r0KAtXIVl%kLY%W|#uIkd2yuDrp-9DX zaJ&oCL|HhI{6yvOxP41#zj@2|*iDAt^K;1gZ5VRv12*wkZgTgP=~{SXB#ICF;P^O ziLp-%DT6UdgJH( zCi)v28`}}%8`mt^*x3JMV*|Z71OjTbZgteKu}PR3Uo)@{c}|o&2^a%#2Y2TDa59DNS4h-0Lu36?0>vLavcYiLh+ct z1lkhK=SG>xDDmQTNL)giT(f4Uxlp-x2o!jJ3TR8oj#KD9m(#Hto`Z)pmHXgfAoJG) z=FN3r1=Rf26d%SGUkcoo5v~rUq!euwQ)St1Aj7^+`>^Qm-P9Q`azfs z$c5Al7~2?TtWNWuP}KXn5V~?MmlKSt=MWG4{9;sm_PRSe^pjB9jSG!zvMwc&R}9?Q zL&(AV3rSB`*=CxS^erK|h7Z|uJgAY7Tej>uzEnIYYVyA~!vDY|{_iXPvHkM@80xNH z84|`B--u;+VJ3yhg%@sjs7JYNB+DUroN|G}l~KuC(s_L)+*a=4aQ`fJ~f`5YX$NG4mQQR2%xu%!Rw- z0}cHF&o|VfS1&uwsb;|fzy#b}TbeH^0GxS81Q-n{Zq)-O#QFBzD>qWG04EFuOy%Cx z&uqX=o>=!oFeUiSv|p=w*b_9hdSfyEBnMO^7Tsd@3AdNRqtev1BIS$_ic7utf^$vOrPPEi1)vV@5w)n#7XBW1CeGqkHS*(D#G_q%9 zKTe?|X18GrXEgB=$AIiCC^(A5XZlGs`D*iZZ+wcazwYF$ zH>wEEg?afT4W6AbaGJX`?;)j-#=Z)yUbJFbuO&Zzs$6Hwg;PlA1$QHp8P8|$EPY_K zharV|miSx%12r_RSgQPl>lhSzlhQdlbZZDS12|UnLd9;IfP4F0@iD;m`uKcrurydU z72nmhe)1}s&n4i?PIBB*>hA>x2bI4T54%VP9%lci)APT>O>Of?kp1{Zg(A~@c0i>P9JysrV=yX|u(A~U=B4@T5v z&IkObhT2`142cS&@oqTQp<7{Rwh~2cFNovR3cx3?>)Kx-GX~OjLa`AT1-7xX050ea zvhNM})X*d=V@AZiUv9^dSKVM^LB6Dxc?|=BK(*e$WkeyR-H$T$slmDq+1JpeV69(z zzdE!EO${wLEqR*Hsub*;7o5OSucpa57>EzU)koDE$3GywIm38{?w_*Vvb7p1~6MD+LHAa zv~0BBh;&Cb%hp^>>~S2pv`P@ zDv`)-BgsQCgT9k3)2;JXrj;AWa5VJ}WW&79T-RyJ?ry2lBkJmJwR5NVfe4|;(n#HK zWE~B~MrkQMo16FdQjBLzhu6cn4U2k^hiBRf<8gSel_#g5$hDVkXwtKpDI63+F;KUf-WuAljU8qsk4x_|aA%RRIn`k8iK2JFf{&a&uAcht>)0M%dCi_(d zT!j4#dAUj)z2syULBp5(BN}UBX$gp(W`?cJhrX-IeGRgG{qG2S3c|!U<)jM+0`CIA zhC}mfo;FGI8qAI2i~X4u0V}FwwQ`kiu+0!1QCgCbWDZ1_GkT9YzxFxK$9k#bxZXZ% z4N=Gl(Mc@+(9oZ(54Qt`ek*ECr=A}5YA=lGoJVh%nzNccO~y2OjrmZBS|QbLLEyMJiW51x{9Cf~h{G>&U7cZ@;2e z_fgd@n|jQU6jHAU0tqV2rJH!7UhZudv&8nb7qFO zx`q;*JgzR?2V17N28QreuCmdz_uPfA@>tCW(MK%xbKc%7yi$;V`XW9DzYNw@Y@KO~ znz>ez&3rh3)GQ{C-hh`~OvF7jzchE5g?+`FLO=#PVZRhl4leu5->T~`IB^O(7}?xw zb~?Z*Vqo*kn+2s5{iO~5rYTYXC7rz)X(NyI#W?%%QQjQKoOZ;7`ZJQ+-bfzu1p~?G zxZ7w>Gn!;Fk&Qv9&pVz|b*^<66N9e}^46x?jr8SEeyx1^qM1$<9VwgCa~4svwOi2H znqw@x^*fuB8KWsx#u+)@cjRqR8^5}?S??9p(ADTuF|0;J++d7 zQ?7B}5mzmq)U-0*57!ZML|3dmOH<$*JyuJ(Sv8*Eq2G*!@e$}FLaU57?a@~W`<4k+ z)OG-mTvQRaQQBCsf2>8{sIA<%W>H#k28IgiB#%AMGc(^uk)d(zwE1(Ry;-r2xCod?u}z zOmbqsKOK%F#{> ze3VIYxTS8x_#L{BrNRv?1Pv`p7vK~i$hGN3({=R0M;HG5eBI>racusTFhu4PzFO`e zd=+MwM)xpdt#?uUF%NyRdc{mJF=6b@7Jf(z`9 zpy7E|pJ{--&A2ZN1;k^>vvw(?lkN_O2Z94xB6hKeKl#?h*3&TwQg7?b?qy>JI-JJ$ z{Ctw31kz)@(2>dnCc=_2x9hUFsMzO(zH{mJc=M#|^y}D?M*}UiLD>l(1t6`+_N^n( zt=jdE-Bma3)j!a89=6?;6K>q|P}ZNsU0RNB*?3yMzKN5-_>jhq9HF~AnTh)%(-@}2 z^#>Zy%`0%dI*aG+(w1zAtXSYv#M74}>}yUMg|cJ!CVAFY*weFhpBb9Fo2izh_LhhV zd3p-F1|JTJS%06voCRPr8OyNphWNi)#i;O?rrouj%zKA`BKsD(rmRf47dZ8c2*nrI zUui2~EA7LO#46?jJI*oLh<)nB?bEz`{p6*4V{pp1t?bsNJl7{QRTWU+aGth@a&9Y6 zla%kHLA@gTEA)Bq$jb|-PuCRK*L2&db&@r{@j=MPygR#kZm6XG|XFS)|n8i_o< zn2-5oUN=bkYIB_Kj}xk(EalLz>`%D_TEf4Rw~Nx2_hUzbXc~iR!ZHK(lm9tUe5#5K10H0Fd6!&V*Ww&V2H4O~QjXNf)Z8>~^eujzObtkgh|* zsH9#YI))9Qmw#t!^ZkoBt{V-RmBVU&UPE1=cN2ED_w!Ezo9EtyudOsmFb!}pfv}Z6 zEtr7^ZJJ-RmG&0S!h?d%Zre)N2;~5Ergv?nsVDP+IulP@X_=FSe{Z~%^u>j&h8{Tq zDE>#dfvt4X>Y=|S%8BfHfU5WXIQlO$UEbS4n)ip`UnVtw^l#b{{R-EBD3fjW?$g1` z6W|-M)b>6(9U~ZOxv2@@+|R50$G-=Fds}FRiA_8J4~gisL!IP&OABTN21H4|3)l(2 zC1@DxD=!?OBNjSWd~xPW(^nSG_T?%|c?R8g!f@!^_sPR_tGz(jyROt}t6Q=M~& zR24JG{QCf~ay@%(qGGM)u!`B)!@VS66eRR^OOF0g8XQ5;@+P+Ge70JF~#Qs9nB0=Ir9#d|wjn)5!1N5i=uN zLy=x9&m25N;uq@6&mJoOA2w?SE(Fhb=Ur+W=|b`W>;i+PPo->f4%(Y~Qa3 z8i9KNudCDg)VPA`zeu`k5Y9siIc&?;JNP8>Mf5 zA9 zU@g8LkvVa9!yVINNnMLUaO!eRgm;rY+QOfm$1qCBdC!q6(x@t3ej<;cjOc z6n$NYJB*jB(YHB7n>t-!-(m_3h3dsrSGY4=ccI8St^1x@oTzE-Bx=v7tK@@=6{vQ*}Zaqm{J# zuy;spbsg5N#uZk9-W-;!rP@9^$2|Ty91CABHE_&14fQAyZ+)V=X;_gg`n#7%r0_S( zpsxU16$&a2AU12HJf5<<4uNT4p4%`7Wsp1#Zs7F-s*Qd!Uu`z^?lQLzQIu6&&krml zIvuW8)Z0?5bWkHy+5U?=2Q5M1Kev-@g+xbI-T0& z8#cLs7iAqcOfTdBNb_#QxVmy^p)lv$58rmJ3!K6TLpIFP(yZpzn#b}>@;~J@3d(;Z zwF^voc0F@LbduA0=SPw%w)_s7ah7FC%3;+N7v1Pfh`XmCm*zFhQEpm! zjz=wWou{(>28cN**-wC&=F&4 zAv4hfO9PU|!$)5?$R4isAI^ncA%2>II4#{b2(oWo4SaJ~j(H`5eC_4tl83pfS3RA< zc;vw71pS<$+Zte0{?t|BX?ZGS;A1whZ3vk2YS@AK$pBjQU zo8o(jhr-GH-Iz56)TW?UBU|eHYcvUwkXU?yeenbd+%Be1obEW?!&GL~zS5>|mZh}` zd-2Jn&Rxxe7~2XM87vtT&(Jk-gT8rAYb8u%vv<4F0rvkR>(o(UI{JQQJ3SpgHG!9U^CHbB z@HL+mtd-i`i7N zVz@}o-uKTGVG3u(^#j12@GLI~ zK*|!FQ*};L+r^*&?{APD?UcW}eBt;8!Niv&<}jCxJT+0g-FasG_2~t2rQ8dG|z z#Z9jmk23L0>fL%9)dE%HjLmnc^zB-Ta~qnqpufk4GR*$z4=jNJQ%)~7^CLaE@g&JVcXmz%L#v$8k>AaStWD-xmDq#E$jLEv42C zfY^Tlij~1}l?Ea5F%a)WiTsCJ)!^uV)jwM_8Z(KL!bI&J&x8G)V$JTl*V#G&Ewv4D zn}aP5%U)(XmfLLbJ5Y!(@EB8je;&i87@Q9SQaHt#J)_cdg5cVyHh9|>8l|Is-^3b$z6KvsL@p*%XwMG`NtbxK z7ma5oYorz}X1GoEP01v>^yDQK->!H&l_ehk@(&=3_sQ){Gpk)1`Hvz!ow4qumQxPK z8Nf>4II_cH*$KWMIjNOu1sTmSe0O1MRxj0nVFA7>60g9eGpV29pLekU9@*(-{L(&{n z|G-rL0jRN}!C=Z-NKW6ofZDxpti2J&=B4|jU_nEgnTj=J)PeM~i&<|V0HpffKv8c` zKFX1mAdz?oqz&yYq}SIF{5IySr{G6=$EIBJB=g*c+Fq=8ZE*0B7t#1-)$D(^jf{fc-4BdB)9T=BC^rkirC*CELm+v$ zgp&ykKC{~4PIEn)E361XL#?X=Ls*T}n(FFmlY}R*poP$bF!ysUWO0txvs5QMW|mf6 ztwZo0A#K&kTl#m4KR>{SCk>s^E%YR>n@3)ph#swx$27cNI9>h#anX<)@lMRm?xWKxG=9(Mm~$2yi-!EXM}- zjFGEaH+d==KL&u|AAtxxQ)R3gWqwyO96)72>>Je2%?wyysqW!BGahuNcjd3Dx7h|*@J#PQN($a~ z)$}{{7_?+@_13Q88BT+Fkx|D5j!RWIyy(6I_FKe-k|J}d>Ceza(RSwUE`(Kce(7Ob z<;&tKJIAUS?mIP(&SPCMhib>IT}^gZ5QScx_VwdN9@i>90-A)j3^zJFCA{9DL7t@+ ztXDMPmrg-ccfvKmGabeg2iWjEn@XN|3dBJ8k5v z%$5H>bLsm&y#4s8F*XBXFQP0z6Up7T9lp1_s|!9_psM2vxU?gCjYj1$+mK}-x?2u2(+)^q6jaKwkGV zl#0_-?n_RaGrpPV0PQS}#Rq_O`As`3_0!kv97|{7^)*zn-u*hYiogovyi*^ISK>hq z99HGXEY$Y!NqMd?eG!k(;PB|mp}&OB&Ec1yi~0roP`K_uARJfqk(stUEw~%lORB^I zd|ry&9C#sF0)8&0J->4remG|KyZzognbcO=j;KR|)VUvVqpz6TLoMhz{SN}{AI)CK zNgvr&r%l~%Wna|EYud>O5bwmk;}lWtGho&1AQHfh>YCe0+z#Ago)BmvqQCYOOGGgk28?WqxcZcv9S@= z+KY)JWj)RQY@E2mu28%Am$P`ErvLaYoBtv4{QIU)&ps&c<4%UDKIP!P5u350`8D(v HrZEBUnj1PTR_0cjTdA~6l1u0)E~tQ$rQd9dHYFFd z(Ui#z6AcBC%x~iuDkUl@BJPBUn6iinoVU5oUvRE7=Q`JQ=K19TuJ?VP_jx||=l*=| zo4aTIPHq0i>>C{&oy}gSPn_4$(S4|+v*x+}8sHZf|JG_99rJZwCyri7Ef({{NfW1^ zWu8l8egAypQNyF=YYdMX>K@D7vU}aOHMcJVAAIz!ZV!QzDub+l++Z_@fhsi5*jcjm zj<|}lH;h41QaERCrpKr@L!qk^=3Sq8aNQ>TJttzT9Q-4^OO4Ss@6}CPb?DEwc+!>7;$xCc9-4dKG_!=F z8GD}VjwJWDeZ0}gmn7;IRiaQR)B7g_11rQtZ8(V|-dq<{4f(yl1>F)huTZrjSh_wI zPpYaG5BRcui0m?}9rxa4xcl>JMASNw#x*d1`s%CZ#h-QR4gnxY!vMEfvyMhYM4Y#& z`Z}y~E2DsABj`5Fs;UG=6?U5R;ADAk2quD(XduLL^Ssu(K{KZlP|3TX168Y>3fGFD z1*a^+mHQ{l%dBRpqp^<6>4wBxiTmkQpPZ+?1gB6kk|mPqXX1_U3wTb>k7w32owe5ZDee45tZ zhCW>IVt`a&{m^Bg?YVbMgzx33e;V{VH8TdQ(+}tQHTPj%JEo#k&})JtT|*AE z?V#B`@R0J4Hyn$6iR{X#py~mkL8deUa59Y!0X>aKa}}-7r;e^5E%L5CLa>(H{IeXW z2OCQt$Sbd%PV79753bG=Y8G}I83dVmn-OSdqhSq6FP=PQbL|M5D|{<#URyswz-oia z6J>UG*<|IXg|GU(mk zp#Q=M<#OF${U#o>`T;NxC>FI-s_M`MeVkdxdjN|_7dldfVPH`xucJ|g7L0CA+bwJ6 z;Q{gVbcIze00L8EYvv+y;+RTKjw|=li+9?!s5{ja`lM^B();ae4u=EzMN>(!(&eNs zTRy1#cQGAJk04r;`9cRAIaNpPt(F=0JIl4OhKf%B0{5MFe z#@}=y?v5@vtzU1s!bsnbC6NBmbyRy1rg^R?vvMh2IzsSc!=?*-EJ!30KQUvWv>}3| zHSGs7Q`+(z*oIn-{=|b`)U1A{*15u>`Au=oj>{y|#mDtgg+wAznSl}RkD~G1p-_T) zuZs@YZ0_+wywj>iO(RrEb1tw;e~r_spAAG0Kzh>XplA;NI)z)YOa&f!`85<)hSmltw^JKzET42aV1KQqUrh@q30O`74<8Q@ zjtvXv#R7>{8CBTz)8cq(Om}r~;C89QS^b$M($?47vrE9z@ycRcRaLKT{7d7&KyzGY z$pP5KpWQ&E;qJkahYNP$I+HnzF}I+ktuq65H^JWx>cB%#KSJ*}V4GLJq|Pa4+3bK7 z*KVR*rRHO`bgsB}z5@PEoUBstu?z-7v1&fpYrWwO_(tZTnq4(4*bcQu?RpCC29hMx zfb-U9M%xnHF6GN}0hl4*RYqa78gvw+sK=t#y})NsB)j_RnU6(jtKFLgcdVCFf8}r% zj677cG$0rKOsFQybK~OT2-~@P)r7sVCa-Onc~kifw7 zFdP0ee|%r_vM?7Qc&QCQM6DAEEv=0y+l|#U4}&V z-u`cnEyvam`^(fAtfE;}ky!d*SItPJJQvzATYz7)r%u;)V!W}8k_MgfaXYUbZw$=KWb9a zf_sLNmb}71In>5)#{{NhkL&A1BX}bZQ8bPB8lF1Cp3(U$xzQ5GaWPfj}w&(nE078H$heZi@Ldf5H6~^(j-@{)?TR9dxNa(}RDo zy-MU_G6jHLt>6<_<~Iu?T?jxPOkeWz=-=Z{c2PMNDl3*Ol5nLbTM$DrOd*pQUPeb%yW zicZ^`wOQ*A+F+|de`iDcH}=Z^Jo=x&{jFl`AAtS82bgAMe(mx(pvz`Mz_yMBK5b){ zHB7^tjtqCZ+zFXXM#J6NvvKg@Yp&R#{Vy40=T!2bWBe>2zKmfEQKxe{5vX@JAkl@9 z3_g~5yeCV4@Zl^Kp$Eu2B9WcyhOm<#@c&JXVT9Q-8^UaMz!(a>79=r}9O}|>z8ZY8 zKD&Qoz&YdUfoO=?K$6<`l$0-fLiLIKpvD23avW%K4TEhoLkV7R0 zkG{NgB)!z%9U0bPI(UQ|>qvM+Vs9$0jH+ZunH?)(3B+*Ez(AlA!I}uEKg7*WPfyR~ z5)PPn9xCvuW4v$)M>`hfU004@CD5fKLtj#hVWiKD0P+2i#v!sOGRjUQTWM4E3YGdJ`*Ujz%M-uM@NJlc0XnFFY6BG>#G{ zFTDc<1U^+ARahCdLK?C;n*{!;{qtj02Kjt`-fqnm_&676F_z}VZ zom&Z=S$b3??}PZBGZrTnG`0i14=CSA(jN*&$b*D_Nq)h>)dR`2oBWjQ2?G)L#k~i9 zwI{U?MoQJ{Fiw){*xqn|;6QpMk67T|Yf;^DR}j#pho}6EDG1JfNHYtmZ>Uit4g^K_`d9wfX5m zFq<7fTQ6)7J)jr&ns`$(5-z8|>8W&0k{dvH0l{~&61|qyhB?R0Qdo$KfXzPEZhjII%%$Tgp^v;E{1 zz;+0LxHIsWj*{l-Qw`)HHhwj2{zBpYLu2P2=?_wzRqqwaH1WnkAX2zzFGBI<)_=5~ z!sk#ISG#)G^=Evqw#>u_0a7$-|M8VsOGSc+u=0X^9GXrTEl~}(spFk&@Jz_gm``gv z_Ki~jHN_Sp8GL^t+n6LZkeDLvmi6jqe z2{Uu@K)WI|<`@OYj_@%ffhl|;>w4w7q3>2Fo4;Shq-6AtSeDL0 zS-<-ulv{ zE0T;XCJ)7ax`Tb~ZS)S0o^1ZN>0oDW*^SN^@(_St>CR=P61ZGFxHX-M?dTo55|q8y1A>IU`qY?GxfH!MnRfA zG1{x$9(Vq7MAWHnbsSN~wTQ(zmO4-L8t)_cmc~Q83YnVhg72X5Y%MG6L_7p%$+Zxl&PIx3a6B<3BtMJxUzKc z)XyUAAAx~QT=6KM&n<$g?#&jS$|M88@NOR#CoA#VAxgh_)cl`7V;T0~u{ScUY$H;cuM{`-b0f}M#-7n2}>SAdv;hh62Gf=;n? zC!TvD|9W~Cg+gJwCb9Rv360pd8p4J!FlrZ7h5V;tH(HhbabT$i8@tUH_*6thgSrSM zmE2|BfKcP2KRHxYy%#uzhUSa6B}56w=0r7l+Xeg**P8KLg7oR+^5XsR>ZI>3q)xpv3r67^V+C< ziEDe>h+Q7ozrOA<7CQs$f7110$-WR6y9Ieer88vmy9YU~!$3$gPcGwyq|7TP%R^;Y+qdNg3fSh=|4W zs&V97z$7=2LZt@YR-!<)^mFF z8to3Dc;UYnb{!=6agXo69$L9nj#MYGBT29$b}d7(E}X+cvnm@VY1g(cVlj}~xaK~u zI0t_%;BpHop1Hy2j5!kZQQRd~jd>%M`^y^aWh(G_ZTBVQx#)c4? z7FEO{72$pS$+0bAy@Dmc!;^2bKv4I$NVZn;?y;~Nm`E2i27^gUb5ZH@Un%sU2)tv_ zhW;|g>03!fuu~>{8HxgWt)u>q7Qvb#XQVK0xm6EPn zuj#%0TqBWH+_CeO_$B->Y)>9melGp@)2Ta42b|Yk51m1UDF0YB2jG$AhEVgHA#_n8 zDum;A$`VLFmM3YIp@VqZhiPmiu%BynbHp~uYL zI;pOtq85O>CJXeTqEY&kFX;jA%lYB)_#1_lHq3UIF%wMW*w1%d$>!Ts~+b}VJLB?(e5Du*Vp=;rZ z{$Mck4p1-ZVmOBJ(Ds#Rp+gP8C=t;a(w#cvmWQ%s0~uCMBR!@-LH)0~`Zr8}XxAJN XxbCHaqOicrlekbaVUB30700{$f diff --git a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00003.png b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00003.png index 50df3498127a21582b14f2b69375b5f885b7217f..7a05bf7b31c3fca94a4a464ad8709d1c20600e36 100644 GIT binary patch literal 5086 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 literal 9348 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�lMY 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 OK5L6x=JnUSlm825`x|rs literal 0 HcmV?d00001 diff --git a/tests/ragger/snapshots/stax/domain_name_unknown_chain/00001.png b/tests/ragger/snapshots/stax/domain_name_unknown_chain/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..25278595239f5dad36d574d40b68a59e5512c75d GIT binary patch literal 15045 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�lMY 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 literal 0 HcmV?d00001 diff --git a/tests/ragger/test_domain_name.py b/tests/ragger/test_domain_name.py index be08ebc..f137610 100644 --- a/tests/ragger/test_domain_name.py +++ b/tests/ragger/test_domain_name.py @@ -139,13 +139,42 @@ def test_send_fund_non_mainnet(firmware: Firmware, moves += [ NavInsID.RIGHT_CLICK ] * 5 moves += [ NavInsID.BOTH_CLICK ] else: - moves += [ NavInsID.USE_CASE_REVIEW_TAP ] * 3 + moves += [ NavInsID.USE_CASE_REVIEW_TAP ] * 2 moves += [ NavInsID.USE_CASE_REVIEW_CONFIRM ] navigator.navigate_and_compare(ROOT_SCREENSHOT_PATH, "domain_name_non_mainnet", moves) +def test_send_fund_unknown_chain(firmware: Firmware, + backend: BackendInterface, + navigator: Navigator, + test_name: str): + app_client = EthAppClient(backend) + challenge = common(app_client) + + with app_client.provide_domain_name(challenge, NAME, ADDR): + pass + + with app_client.send_fund(BIP32_PATH, + NONCE, + GAS_PRICE, + GAS_LIMIT, + ADDR, + AMOUNT, + 9): + moves = list() + if firmware.device.startswith("nano"): + moves += [ NavInsID.RIGHT_CLICK ] * 5 + moves += [ NavInsID.BOTH_CLICK ] + else: + moves += [ NavInsID.USE_CASE_REVIEW_TAP ] * 3 + moves += [ NavInsID.USE_CASE_REVIEW_CONFIRM ] + navigator.navigate_and_compare(ROOT_SCREENSHOT_PATH, + "domain_name_unknown_chain", + moves) + + def test_send_fund_domain_too_long(firmware: Firmware, backend: BackendInterface, navigator: Navigator): From 116a320df382ca123ab782b489402138fb9c6953 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Mon, 19 Jun 2023 10:49:29 +0200 Subject: [PATCH 49/85] Removed ticker end space from hardcoded tokens --- src/tokens.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/tokens.c b/src/tokens.c index e17e482..a513758 100644 --- a/src/tokens.c +++ b/src/tokens.c @@ -24,36 +24,36 @@ const tokenDefinition_t TOKENS_EXTRA[NUM_TOKENS_EXTRA] = { // Ropsten DeversiFi tokens {{0x4c, 0x5f, 0x66, 0x59, 0x61, 0x97, 0xa8, 0x6f, 0xb3, 0x0a, 0x24, 0x35, 0xe2, 0xef, 0x4d, 0xdc, 0xb3, 0x93, 0x42, 0xc9}, - "tUSDT ", + "tUSDT", 6}, {{0x1c, 0x0f, 0x17, 0x43, 0x67, 0x40, 0xbf, 0xb9, 0x2c, 0x10, 0x70, 0xee, 0x86, 0x32, 0x2d, 0xe8, 0x90, 0x83, 0x7c, 0x6a}, - "tUSDT ", + "tUSDT", 6}, {{0xcd, 0x07, 0x7a, 0xbe, 0xdd, 0x83, 0x1a, 0x34, 0x43, 0xff, 0xbe, 0x24, 0xfb, 0x76, 0x66, 0x1b, 0xbb, 0x17, 0xeb, 0x69}, - "tZRX ", + "tZRX", 18}, {{0x40, 0xd8, 0x97, 0x85, 0x00, 0xbf, 0x68, 0x32, 0x4a, 0x51, 0x53, 0x3c, 0xd6, 0xa2, 0x1e, 0x3e, 0x59, 0xbe, 0x32, 0x4a}, - "tBTC ", + "tBTC", 18}, // Goerli DeversiFi tokens {{0xd9, 0x97, 0xa8, 0x63, 0x46, 0xe7, 0x65, 0x18, 0xe6, 0x92, 0x25, 0x56, 0xf3, 0x4d, 0x76, 0x61, 0x30, 0xc0, 0xbb, 0xfd}, - "tUSDT ", + "tUSDT", 6}, {{0xc1, 0xd5, 0x79, 0xeb, 0xff, 0x7c, 0x0f, 0x6c, 0xfd, 0x9a, 0xd5, 0xfb, 0x26, 0x7f, 0xec, 0x73, 0xbe, 0x70, 0xc8, 0xf7}, - "tBTC ", + "tBTC", 18}, {{0xa8, 0xf3, 0x14, 0x4f, 0xea, 0x2c, 0x37, 0x5a, 0xd0, 0x58, 0xec, 0x12, 0x09, 0x9a, 0x5a, 0x21, 0xa2, 0x6f, 0xe9, 0x96}, - "tDVF ", + "tDVF", 18}, {{0x4c, 0xda, 0xbe, 0xc1, 0x2a, 0x39, 0x7f, 0xb6, 0xef, 0xaf, 0x46, 0x13, 0xd5, 0xdf, 0xd7, 0x9b, 0x30, 0x9a, 0xe9, 0xfa}, - "tXDVF ", + "tXDVF", 18}, }; @@ -69,11 +69,11 @@ const tokenDefinition_t TOKENS_EXTRA[NUM_TOKENS_EXTRA] = { const tokenDefinition_t const TOKENS_ETHEREUM[NUM_TOKENS_ETHEREUM] = { {{0xdb, 0x25, 0xf2, 0x11, 0xab, 0x05, 0xb1, 0xc9, 0x7d, 0x59, 0x55, 0x16, 0xf4, 0x57, 0x94, 0x52, 0x8a, 0x80, 0x7a, 0xd8}, - "EURS ", + "EURS", 2}, {{0xa7, 0x44, 0x76, 0x44, 0x31, 0x19, 0xA9, 0x42, 0xdE, 0x49, 0x85, 0x90, 0xFe, 0x1f, 0x24, 0x54, 0xd7, 0xD4, 0xaC, 0x0d}, - "GNT ", + "GNT", 18}, }; @@ -89,19 +89,19 @@ const tokenDefinition_t const TOKENS_ELLAISM[NUM_TOKENS_ELLAISM] = { const tokenDefinition_t const TOKENS_ETHEREUM_CLASSIC[NUM_TOKENS_ETHEREUM_CLASSIC] = { {{0x6F, 0x6D, 0xEb, 0x5d, 0xb0, 0xC4, 0x99, 0x4A, 0x82, 0x83, 0xA0, 0x1D, 0x6C, 0xFe, 0xEB, 0x27, 0xFc, 0x3b, 0xBe, 0x9C}, - "Smart ", + "Smart", 0}, {{0x08, 0x5f, 0xb4, 0xf2, 0x40, 0x31, 0xea, 0xed, 0xbc, 0x2b, 0x61, 0x1a, 0xa5, 0x28, 0xf2, 0x23, 0x43, 0xeb, 0x52, 0xdb}, - "BEC ", + "BEC", 8}, {{0x5a, 0xce, 0x17, 0xf8, 0x7c, 0x73, 0x91, 0xe5, 0x79, 0x2a, 0x76, 0x83, 0x06, 0x9a, 0x80, 0x25, 0xb8, 0x3b, 0xbd, 0x85}, - "PLAY ", + "PLAY", 0}, {{0x6A, 0xDa, 0x6F, 0x48, 0xC8, 0x15, 0x68, 0x95, 0x02, 0xC4, 0x3e, 0xC1, 0xa5, 0x9F, 0x1b, 0x5D, 0xD3, 0xC0, 0x4E, 0x1F}, - "UNV ", + "UNV", 18}, }; @@ -118,27 +118,27 @@ const tokenDefinition_t const TOKENS_RSK[NUM_TOKENS_RSK] = {}; const tokenDefinition_t const TOKENS_UBIQ[NUM_TOKENS_UBIQ] = { {{0xd2, 0x45, 0x20, 0x7c, 0xfb, 0xf6, 0xeb, 0x6f, 0x34, 0x97, 0x0d, 0xb2, 0xa8, 0x07, 0xab, 0x1d, 0x17, 0x8f, 0xde, 0x6c}, - "APX ", + "APX", 8}, {{0xff, 0x3b, 0xf0, 0x57, 0xad, 0xf3, 0xb0, 0xe0, 0x15, 0xb6, 0x46, 0x53, 0x31, 0xa6, 0x23, 0x6e, 0x55, 0x68, 0x82, 0x74}, - "BEER ", + "BEER", 0}, {{0x08, 0x53, 0x3d, 0x6a, 0x06, 0xce, 0x36, 0x52, 0x98, 0xb1, 0x2e, 0xf9, 0x2e, 0xb4, 0x07, 0xcb, 0xa8, 0xaa, 0x82, 0x73}, - "CEFS ", + "CEFS", 8}, {{0x94, 0xad, 0x7e, 0x41, 0xc1, 0xd4, 0x40, 0x22, 0xc4, 0xf4, 0x7c, 0xb1, 0xba, 0x01, 0x9f, 0xd1, 0xa0, 0x22, 0xc5, 0x36}, - "DOT ", + "DOT", 8}, {{0x4b, 0x48, 0x99, 0xa1, 0x0f, 0x3e, 0x50, 0x7d, 0xb2, 0x07, 0xb0, 0xee, 0x24, 0x26, 0x02, 0x9e, 0xfa, 0x16, 0x8a, 0x67}, - "QWARK ", + "QWARK", 8}, {{0x5e, 0x17, 0x15, 0xbb, 0x79, 0x80, 0x5b, 0xd6, 0x72, 0x72, 0x97, 0x60, 0xb3, 0xf7, 0xf3, 0x4d, 0x6f, 0x48, 0x50, 0x98}, - "RICKS ", + "RICKS", 8}, }; From 17b1cfc0ad099eb54909def6009559b3536c91a3 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 18 Jul 2023 09:36:25 +0200 Subject: [PATCH 50/85] Now uses proper Ethereum icon with shades of gray --- glyphs/stax_ethereum_64px.gif | Bin 556 -> 569 bytes icons/stax_app_ethereum.gif | Bin 309 -> 301 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/glyphs/stax_ethereum_64px.gif b/glyphs/stax_ethereum_64px.gif index 48fa1ac7ea659bc6b4e0b2b6076f5e561a7a2e1f..7cd7be3df3b16f999b32518f7cbc09db0d115112 100644 GIT binary patch literal 569 zcmV-90>=GENk%w1VL$*t0J8u9PEJmyrlyIBi7F~8-rnA|wY7eJer9H7?d|Qv#Kb#0 zJN5PT4-XF|B_(!tcK`qXA^8LV00000EC2ui06+jh000F4@X1N5y*TU5yZ>M)j%1f4 zWjYE9qP|_>GzM&Ah%*nw?N0(-qXGE&61v&2V1yxp!r{QxOv#eNp`%*LC6!qeR|Lgo z2gNZ6`2}YMYR|Ln9=76~0KKloYY2OMLt=gwWo=oB4GM)8S9^+yaE%fO27!W7J(PNw zk%(d>mM3ubRMi2gCJ)5nvj_Z`2~XBX@(q!iNp!8){s3pj8tB^g`krsleG0lNIsd zV;8Z(DG4WhKnq|}0Kt_89kj~9=!Yc(Hy?QXnNMQ8C)45`(ILQD0*m#+4M=)58Ao|Z zcv6T7ksQiuTev{`QlOPbYb7T<@uooP$u?CfplmtTVl|glcqI{Fl0pJx-oA2)=0L1m z2N(ww^H;-(|A;?U7BPHs)1 z@|SO{c~>w7*;_*47X*6?h5SP5;*#w)pYR&G^yw2ifySO82paAhECmODA;EF-=+mpe H5CH%?UW)>O literal 556 zcmZ?wbhEHbbYO5`_{_}!1gxyAJUl$&;^O-H`f+h_3l=Q6aN)wsmoGnm{`~jv-~a#r zgA~Dl;!hSZQ}I8yXKrG8s&8U?W^y)PdSY&FqOF0Ri75y&=z!FKY+zvdS8&pE^1q! zF;iBNjZwGv!|SfLq(v8byq0w`>s3#7*x!A1=P`kOmzm6}Bz5b8^trj3#8|yrUAa2D zI=HR->Y3~&371ZbV&$CJ#WpvpaFPy7ab+fqM2hja6;=|z4m z2j;B}TYNO>kOO<*si+k9PS)BBK^rZ(*jHT-V%lag=iUa6g@*f|6tGts-e$RWkMWW_ zXWqTSx9;pcrs|3?aT7o33j#XgcmZW^!_K$SDuc;Qx1Wj`I6#S&_D< ztMjs%oQ1EKvyf;EbHT|itp$(fPCm!)d)TXTpC(u3BIUTL>HB_(!tcK`qXA^8LV00000EC2ui03ZM$000Eq@X1N5y*SIHw8zE36kj<3 zPUDzm;-pQ&YT?^72svMDe2Q^tA47VCh?E8a zB>^M>2AZ3F2pt?H0{|om2#}^7LrxzB2M!7(0Iy~M4=6JvD=2mR literal 309 zcmZ?wbhEHbRA5kG_{_}!1Z-?vbuzxE0kMXJ9z|G0iLJOmSg4J0risi$7WmALf)Sk(go}7F?v@Fn!yz zcek|vHr=^-;D=Mr;l`%dsT?hpmx4c?RbFGCZl&<|~V7JthzHN+D>C*jg;r~U&z50#?U#1Ri}LM+SO^SDr`ng=EW?Lq23(6^^DA{ uYpaukxsOh=J5lUhb|S>c#`L1Fzm4uSp)}k5w=bElzb(W4_<_D4gEatp_-&B@ From 09d4b2114ad3d95f810e2ddadfbb77bc19d9c732 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Mon, 5 Jun 2023 17:54:19 +0200 Subject: [PATCH 51/85] Improve transaction wording --- src_nbgl/ui_approve_tx.c | 46 ++++++++++++++++++++++++++++---- src_plugins/erc20/erc20_plugin.c | 4 +++ 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src_nbgl/ui_approve_tx.c b/src_nbgl/ui_approve_tx.c index 51a4c5c..44eb79b 100644 --- a/src_nbgl/ui_approve_tx.c +++ b/src_nbgl/ui_approve_tx.c @@ -1,4 +1,4 @@ - +#include #include #include "shared_context.h" #include "ui_callbacks.h" @@ -219,19 +219,55 @@ static void reviewContinueCommon(void) { reviewChoice); } +// Replace "Review" by "Sign" and add questionmark +static void prepare_sign_text(void) { + uint8_t sign_length = strlen("Sign"); + uint8_t review_length = strlen("Review"); + + memmove(staxSharedBuffer, "Sign", sign_length); + memmove(staxSharedBuffer + sign_length, + staxSharedBuffer + review_length, + strlen(staxSharedBuffer) - review_length + 1); + strlcat(staxSharedBuffer, "?", sizeof(staxSharedBuffer)); +} + +// Force operation to be lowercase +static void get_lowercase_operation(char *dst, size_t dst_len) { + const char *src = strings.common.fullAmount; + size_t idx; + + for (idx = 0; (idx < dst_len - 1) && (src[idx] != '\0'); ++idx) { + dst[idx] = (char) tolower((int) src[idx]); + } + dst[idx] = '\0'; +} + static void buildFirstPage(void) { if (tx_approval_context.fromPlugin) { + char op_name[sizeof(strings.common.fullAmount)]; plugin_ui_get_id(); - SPRINTF(staxSharedBuffer, - "Review %s\ntransaction:\n%s", - strings.common.fullAddress, - strings.common.fullAmount); + + get_lowercase_operation(op_name, sizeof(op_name)); + if (pluginType == EXTERNAL) { + snprintf(staxSharedBuffer, + sizeof(staxSharedBuffer), + "Review transaction\nto %s\non %s", + op_name, + strings.common.fullAddress); + } else { + snprintf(staxSharedBuffer, + sizeof(staxSharedBuffer), + "Review transaction\nto %s\n%s", + op_name, + strings.common.fullAddress); + } nbgl_useCaseReviewStart(get_app_icon(true), staxSharedBuffer, NULL, "Reject transaction", reviewContinue, rejectTransactionQuestion); + prepare_sign_text(); } else { nbgl_useCaseReviewStart(get_app_icon(true), "Review transaction", diff --git a/src_plugins/erc20/erc20_plugin.c b/src_plugins/erc20/erc20_plugin.c index 04062d8..220e05f 100644 --- a/src_plugins/erc20/erc20_plugin.c +++ b/src_plugins/erc20/erc20_plugin.c @@ -182,7 +182,11 @@ void erc20_plugin_call(int message, void *parameters) { case ETH_PLUGIN_QUERY_CONTRACT_ID: { ethQueryContractID_t *msg = (ethQueryContractID_t *) parameters; +#ifdef HAVE_NBGL + strlcpy(msg->name, "ERC20 token", msg->nameLength); +#else strlcpy(msg->name, "Type", msg->nameLength); +#endif strlcpy(msg->version, "Approve", msg->versionLength); msg->result = ETH_PLUGIN_RESULT_OK; } break; From 61015e384097d8252b7d118fe5bbe700ef462a40 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 6 Jun 2023 16:58:27 +0200 Subject: [PATCH 52/85] NBGL message signing refactoring --- .../signMessageEIP712_common/common_712.c | 4 +- src_nbgl/ui_712_common.c | 48 ---------- src_nbgl/ui_712_common.h | 13 --- src_nbgl/ui_message_signing.c | 57 ++++++++++++ src_nbgl/ui_message_signing.h | 16 ++++ src_nbgl/ui_sign_712.c | 10 +- src_nbgl/ui_sign_712_v0.c | 10 +- src_nbgl/ui_sign_message.c | 92 +++++++------------ src_nbgl/ui_signing.c | 3 + src_nbgl/ui_signing.h | 12 +++ 10 files changed, 137 insertions(+), 128 deletions(-) delete mode 100644 src_nbgl/ui_712_common.c delete mode 100644 src_nbgl/ui_712_common.h create mode 100644 src_nbgl/ui_message_signing.c create mode 100644 src_nbgl/ui_message_signing.h create mode 100644 src_nbgl/ui_signing.c create mode 100644 src_nbgl/ui_signing.h diff --git a/src_features/signMessageEIP712_common/common_712.c b/src_features/signMessageEIP712_common/common_712.c index abc1fd5..084a528 100644 --- a/src_features/signMessageEIP712_common/common_712.c +++ b/src_features/signMessageEIP712_common/common_712.c @@ -7,7 +7,7 @@ static const uint8_t EIP_712_MAGIC[] = {0x19, 0x01}; -unsigned int ui_712_approve_cb() { +unsigned int ui_712_approve_cb(void) { uint8_t privateKeyData[INT256_LENGTH]; uint8_t hash[INT256_LENGTH]; uint8_t signature[100]; @@ -75,7 +75,7 @@ unsigned int ui_712_approve_cb() { return 0; // do not redraw the widget } -unsigned int ui_712_reject_cb() { +unsigned int ui_712_reject_cb(void) { reset_app_context(); G_io_apdu_buffer[0] = 0x69; G_io_apdu_buffer[1] = 0x85; diff --git a/src_nbgl/ui_712_common.c b/src_nbgl/ui_712_common.c deleted file mode 100644 index a1b13e3..0000000 --- a/src_nbgl/ui_712_common.c +++ /dev/null @@ -1,48 +0,0 @@ -#include "ui_nbgl.h" -#include "ui_712_common.h" -#include "common_712.h" - -static void (*g_resume_func)(void) = NULL; - -void nbgl_712_review_approve(void) { - ui_712_approve_cb(NULL); -} - -void nbgl_712_review_reject(void) { - ui_712_reject_cb(NULL); -} - -void nbgl_712_confirm_rejection_cb(bool confirm) { - if (confirm) { - nbgl_useCaseStatus("Message signing\ncancelled", false, nbgl_712_review_reject); - } else { - (*g_resume_func)(); - } -} - -void nbgl_712_confirm_rejection(void) { - nbgl_useCaseChoice(&C_warning64px, - "Reject message?", - NULL, - "Yes, reject", - "Go back to message", - nbgl_712_confirm_rejection_cb); -} - -void nbgl_712_review_choice(bool confirm) { - if (confirm) { - nbgl_useCaseStatus("MESSAGE\nSIGNED", true, nbgl_712_review_approve); - } else { - nbgl_712_confirm_rejection(); - } -} - -void nbgl_712_start(void (*resume_func)(void), const char *title) { - g_resume_func = resume_func; - nbgl_useCaseReviewStart(&C_Message_64px, - title, - NULL, - "Reject", - resume_func, - nbgl_712_confirm_rejection); -} diff --git a/src_nbgl/ui_712_common.h b/src_nbgl/ui_712_common.h deleted file mode 100644 index ab8bd4f..0000000 --- a/src_nbgl/ui_712_common.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef UI_712_COMMON_H_ -#define UI_712_COMMON_H_ - -#include - -void nbgl_712_approve(void); -void nbgl_712_reject(void); -void nbgl_712_confirm_rejection_cb(bool confirm); -void nbgl_712_confirm_rejection(void); -void nbgl_712_review_choice(bool confirm); -void nbgl_712_start(void (*resume_func)(void), const char *title); - -#endif // UI_712_COMMON_H_ diff --git a/src_nbgl/ui_message_signing.c b/src_nbgl/ui_message_signing.c new file mode 100644 index 0000000..609dd81 --- /dev/null +++ b/src_nbgl/ui_message_signing.c @@ -0,0 +1,57 @@ +#include "ui_nbgl.h" +#include "common_712.h" +#include "ui_message_signing.h" +#include "glyphs.h" + +static void (*g_resume_func)(void) = NULL; +static void (*g_approved_func)(void) = NULL; +static void (*g_rejected_func)(void) = NULL; + +static void ui_message_rejection_handler(bool confirm) { + if (confirm) { + nbgl_useCaseStatus("Message signing\ncancelled", false, g_rejected_func); + } else { + (*g_resume_func)(); + } +} + +static void ui_message_confirm_rejection(void) { + nbgl_useCaseChoice(&C_warning64px, + "Reject message?", + NULL, + "Yes, reject", + "Go back to message", + ui_message_rejection_handler); +} + +void ui_message_review_choice(bool confirm) { + if (confirm) { + nbgl_useCaseStatus("MESSAGE\nSIGNED", true, g_approved_func); + } else { + ui_message_confirm_rejection(); + } +} + +void ui_message_start(const char *title, + void (*start_func)(void), + void (*resume_func)(void), + void (*approved_func)(void), + void (*rejected_func)(void)) { + g_resume_func = resume_func; + g_approved_func = approved_func; + g_rejected_func = rejected_func; + nbgl_useCaseReviewStart(&C_Message_64px, + title, + NULL, + "Reject", + start_func, + ui_message_confirm_rejection); +} + +void ui_message_712_approved(void) { + ui_712_approve_cb(); +} + +void ui_message_712_rejected(void) { + ui_712_reject_cb(); +} diff --git a/src_nbgl/ui_message_signing.h b/src_nbgl/ui_message_signing.h new file mode 100644 index 0000000..03f6367 --- /dev/null +++ b/src_nbgl/ui_message_signing.h @@ -0,0 +1,16 @@ +#ifndef UI_MESSAGE_SIGNING_H_ +#define UI_MESSAGE_SIGNING_H_ + +#include + +void ui_message_review_choice(bool confirm); +void ui_message_start(const char *title, + void (*start_func)(void), + void (*resume_func)(void), + void (*approved_func)(void), + void (*rejected_func)(void)); + +void ui_message_712_approved(void); +void ui_message_712_rejected(void); + +#endif // UI_MESSAGE_SIGNING_H_ diff --git a/src_nbgl/ui_sign_712.c b/src_nbgl/ui_sign_712.c index bfe53fd..fa63a34 100644 --- a/src_nbgl/ui_sign_712.c +++ b/src_nbgl/ui_sign_712.c @@ -6,7 +6,7 @@ #include "common_712.h" #include "nbgl_use_case.h" #include "network.h" -#include "ui_712_common.h" +#include "ui_message_signing.h" static nbgl_layoutTagValue_t pair; @@ -62,11 +62,15 @@ static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { } static void handle_display(nbgl_navCallback_t cb) { - nbgl_useCaseRegularReview(0, 0, "Reject", NULL, cb, nbgl_712_review_choice); + nbgl_useCaseRegularReview(0, 0, "Reject", NULL, cb, ui_message_review_choice); } void ui_712_start(void) { - nbgl_712_start(&ui_712_switch_to_message, "Review typed message"); + ui_message_start("Review typed message", + NULL, + &ui_712_switch_to_message, + &ui_message_712_approved, + &ui_message_712_rejected); } void ui_712_switch_to_message(void) { diff --git a/src_nbgl/ui_sign_712_v0.c b/src_nbgl/ui_sign_712_v0.c index e5dc92e..7d6eddb 100644 --- a/src_nbgl/ui_sign_712_v0.c +++ b/src_nbgl/ui_sign_712_v0.c @@ -3,7 +3,7 @@ #include "common_712.h" #include "network.h" #include "ethUtils.h" -#include "ui_712_common.h" +#include "ui_message_signing.h" static nbgl_layoutTagValue_t pairs[2]; @@ -43,9 +43,13 @@ static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { } static void start_review(void) { - nbgl_useCaseRegularReview(0, 2, "Reject", NULL, display_review_page, nbgl_712_review_choice); + nbgl_useCaseRegularReview(0, 2, "Reject", NULL, display_review_page, ui_message_review_choice); } void ui_sign_712_v0(void) { - nbgl_712_start(&start_review, "Sign typed message"); + ui_message_start("Sign typed message", + NULL, + &start_review, + &ui_message_712_approved, + &ui_message_712_rejected); } diff --git a/src_nbgl/ui_sign_message.c b/src_nbgl/ui_sign_message.c index 5ea2c89..766d9c7 100644 --- a/src_nbgl/ui_sign_message.c +++ b/src_nbgl/ui_sign_message.c @@ -6,17 +6,17 @@ #include "glyphs.h" #include "nbgl_use_case.h" #include "common_ui.h" +#include "ui_message_signing.h" +#include "ui_signing.h" typedef enum { - UI_191_NBGL_START_REVIEW_DISPLAYED = 0, - UI_191_NBGL_GO_TO_NEXT_CONTENT, - UI_191_NBGL_BACK_FROM_REJECT_CANCEL, - UI_191_NBGL_GO_TO_SIGN, - UI_191_NBGL_SIGN_DISPLAYED, -} e_ui_nbgl_191_state; + UI_191_ACTION_IDLE = 0, + UI_191_ACTION_ADVANCE_IN_MESSAGE, + UI_191_ACTION_GO_TO_SIGN +} e_ui_191_action; + +static e_ui_191_action g_action; -static e_ui_nbgl_191_state state; -static e_ui_nbgl_191_state state_before_reject_cancel; static bool skip_message; static nbgl_layoutTagValue_t pair; @@ -37,7 +37,7 @@ static bool display_message(nbgl_pageContent_t *content) { uint16_t len = 0; bool reached; - if (state != UI_191_NBGL_BACK_FROM_REJECT_CANCEL) { + if (g_action == UI_191_ACTION_ADVANCE_IN_MESSAGE) { strncpy(staxSharedBuffer + eip191MessageIdx, strings.tmp.tmp + stringsTmpTmpIdx, SHARED_BUFFER_SIZE - eip191MessageIdx); @@ -55,7 +55,7 @@ static bool display_message(nbgl_pageContent_t *content) { stringsTmpTmpIdx = 0; question_switcher(); - if (state != UI_191_NBGL_GO_TO_SIGN) { + if (g_action != UI_191_ACTION_GO_TO_SIGN) { return false; } } else if (reached || eip191MessageIdx == SHARED_BUFFER_SIZE) { @@ -72,13 +72,7 @@ static bool display_message(nbgl_pageContent_t *content) { content->tagValueList.nbMaxLinesForValue = 9; content->tagValueList.wrapping = false; - if (state == UI_191_NBGL_BACK_FROM_REJECT_CANCEL) { - // We come back from Reject screen. - // The previously displayed content must be redisplayed. - // Do not call question_switcher() to avoid replacing - // string.tmp.tmp content. - state = state_before_reject_cancel; - } else if (stringsTmpTmpIdx >= strlen(strings.tmp.tmp)) { + if ((g_action != UI_191_ACTION_IDLE) && (stringsTmpTmpIdx >= strlen(strings.tmp.tmp))) { // Fetch the next content to display into strings.tmp.tmp buffer. stringsTmpTmpIdx = 0; question_switcher(); @@ -88,9 +82,9 @@ static bool display_message(nbgl_pageContent_t *content) { static void display_sign(nbgl_pageContent_t *content) { content->type = INFO_LONG_PRESS, content->infoLongPress.icon = &C_Message_64px; - content->infoLongPress.text = "Sign Message?"; + content->infoLongPress.text = "Sign Message"; content->infoLongPress.longPressText = "Hold to sign"; - state = UI_191_NBGL_SIGN_DISPLAYED; + g_position = UI_SIGNING_POSITION_SIGN; } static bool nav_callback(uint8_t page, nbgl_pageContent_t *content) { @@ -100,7 +94,7 @@ static bool nav_callback(uint8_t page, nbgl_pageContent_t *content) { skip_message = true; skip_rest_of_message(); } - if ((state != UI_191_NBGL_GO_TO_SIGN) && (state != UI_191_NBGL_SIGN_DISPLAYED)) { + if ((g_action != UI_191_ACTION_GO_TO_SIGN) && (g_position != UI_SIGNING_POSITION_SIGN)) { if (skip_message) { // do not refresh when this callback triggers after user validation ret = false; @@ -114,68 +108,48 @@ static bool nav_callback(uint8_t page, nbgl_pageContent_t *content) { return ret; } -static void choice_callback(bool confirm) { - if (confirm) { - nbgl_useCaseStatus("MESSAGE\nSIGNED", true, sign_message); - sign_message(); - } -} - static void continue_review(void) { - nbgl_useCaseForwardOnlyReview("Reject", NULL, nav_callback, choice_callback); + nbgl_useCaseForwardOnlyReview("Reject", NULL, nav_callback, ui_message_review_choice); } -static void confirm_transaction_rejection_choice(bool confirm) { - if (confirm) { - reject_message(); +static void resume_message(void) { + e_ui_191_action action_bak = g_action; + + if (g_position == UI_SIGNING_POSITION_START) { + ui_191_start(); } else { - // Go to previous screen accordingly - if (state == UI_191_NBGL_START_REVIEW_DISPLAYED) { - ui_191_start(); - } else { - if (state != UI_191_NBGL_SIGN_DISPLAYED) { - state_before_reject_cancel = state; - state = UI_191_NBGL_BACK_FROM_REJECT_CANCEL; - } - continue_review(); - } + g_action = UI_191_ACTION_IDLE; + continue_review(); + g_action = action_bak; } } -static void confirm_transaction_rejection() { - nbgl_useCaseChoice(&C_warning64px, - "Reject message?", - NULL, - "Yes, Reject", - "Go back to message", - confirm_transaction_rejection_choice); -} - void ui_191_start(void) { - state = UI_191_NBGL_START_REVIEW_DISPLAYED; + g_position = UI_SIGNING_POSITION_START; + skip_message = false; eip191MessageIdx = 0; stringsTmpTmpIdx = 0; - nbgl_useCaseReviewStart(&C_Message_64px, - "Review message", - NULL, - "Reject", - continue_review, - confirm_transaction_rejection); + ui_message_start("Review message", + &ui_191_switch_to_message, + &resume_message, + &sign_message, + &reject_message); } void ui_191_switch_to_message(void) { + g_position = UI_SIGNING_POSITION_REVIEW; + g_action = UI_191_ACTION_ADVANCE_IN_MESSAGE; // No question mechanism on Stax: // Message is already displayed - state = UI_191_NBGL_GO_TO_NEXT_CONTENT; continue_review(); } void ui_191_switch_to_sign(void) { + g_action = UI_191_ACTION_GO_TO_SIGN; // Next nav_callback callback must display // the hold to approve screen - state = UI_191_NBGL_GO_TO_SIGN; if (skip_message) { continue_review(); // to force screen refresh } diff --git a/src_nbgl/ui_signing.c b/src_nbgl/ui_signing.c new file mode 100644 index 0000000..2becdf0 --- /dev/null +++ b/src_nbgl/ui_signing.c @@ -0,0 +1,3 @@ +#include "ui_signing.h" + +e_ui_signing_position g_position; diff --git a/src_nbgl/ui_signing.h b/src_nbgl/ui_signing.h new file mode 100644 index 0000000..e9248ac --- /dev/null +++ b/src_nbgl/ui_signing.h @@ -0,0 +1,12 @@ +#ifndef UI_SIGNING_H_ +#define UI_SIGNING_H_ + +typedef enum { + UI_SIGNING_POSITION_START = 0, + UI_SIGNING_POSITION_REVIEW, + UI_SIGNING_POSITION_SIGN +} e_ui_signing_position; + +extern e_ui_signing_position g_position; + +#endif // UI_SIGNING_H_ From 9396ae81d72f1f640a05192c7c8a647fca276e3d Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Fri, 16 Jun 2023 11:57:08 +0200 Subject: [PATCH 53/85] EIP-712 now has proper resume position --- src_nbgl/ui_sign_712.c | 25 +++++++++++++++++++++++-- src_nbgl/ui_sign_712_v0.c | 37 +++++++++++++++++++++++++++++++++++-- 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/src_nbgl/ui_sign_712.c b/src_nbgl/ui_sign_712.c index fa63a34..6ad32d4 100644 --- a/src_nbgl/ui_sign_712.c +++ b/src_nbgl/ui_sign_712.c @@ -7,6 +7,7 @@ #include "nbgl_use_case.h" #include "network.h" #include "ui_message_signing.h" +#include "ui_signing.h" static nbgl_layoutTagValue_t pair; @@ -45,7 +46,8 @@ static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { case 1: switch (ui_712_next_field()) { case EIP712_NO_MORE_FIELD: - return display_sign_page(page, content); + ui_712_switch_to_sign(); + ret = true; break; case EIP712_FIELD_INCOMING: case EIP712_FIELD_LATER: @@ -65,19 +67,38 @@ static void handle_display(nbgl_navCallback_t cb) { nbgl_useCaseRegularReview(0, 0, "Reject", NULL, cb, ui_message_review_choice); } +static void resume_review(void) { + switch (g_position) { + case UI_SIGNING_POSITION_START: + ui_712_start(); + break; + case UI_SIGNING_POSITION_REVIEW: + ui_712_switch_to_message(); + break; + case UI_SIGNING_POSITION_SIGN: + ui_712_switch_to_sign(); + break; + default: + return; // should not happen + } +} + void ui_712_start(void) { + g_position = UI_SIGNING_POSITION_START; ui_message_start("Review typed message", - NULL, &ui_712_switch_to_message, + &resume_review, &ui_message_712_approved, &ui_message_712_rejected); } void ui_712_switch_to_message(void) { + g_position = UI_SIGNING_POSITION_REVIEW; handle_display(display_review_page); } void ui_712_switch_to_sign(void) { + g_position = UI_SIGNING_POSITION_SIGN; handle_display(display_sign_page); } diff --git a/src_nbgl/ui_sign_712_v0.c b/src_nbgl/ui_sign_712_v0.c index 7d6eddb..1022c58 100644 --- a/src_nbgl/ui_sign_712_v0.c +++ b/src_nbgl/ui_sign_712_v0.c @@ -4,6 +4,7 @@ #include "network.h" #include "ethUtils.h" #include "ui_message_signing.h" +#include "ui_signing.h" static nbgl_layoutTagValue_t pairs[2]; @@ -32,6 +33,7 @@ static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { content->tagValueList.nbMaxLinesForValue = 0; content->tagValueList.pairs = (nbgl_layoutTagValue_t *) pairs; } else if (page == 1) { + g_position = UI_SIGNING_POSITION_SIGN; content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); content->infoLongPress.text = "Sign typed message"; content->infoLongPress.longPressText = "Hold to sign"; @@ -42,14 +44,45 @@ static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { return true; } +static void display_review(void) { + uint8_t page; + + switch (g_position) { + case UI_SIGNING_POSITION_REVIEW: + page = 0; + break; + case UI_SIGNING_POSITION_SIGN: + page = 1; + break; + default: + return; // should not happen + } + nbgl_useCaseRegularReview(page, + 2, + "Reject", + NULL, + display_review_page, + ui_message_review_choice); +} + static void start_review(void) { - nbgl_useCaseRegularReview(0, 2, "Reject", NULL, display_review_page, ui_message_review_choice); + g_position = UI_SIGNING_POSITION_REVIEW; + display_review(); +} + +static void resume_review(void) { + if (g_position == UI_SIGNING_POSITION_START) { + ui_sign_712_v0(); + } else { + display_review(); + } } void ui_sign_712_v0(void) { + g_position = UI_SIGNING_POSITION_START; ui_message_start("Sign typed message", - NULL, &start_review, + &resume_review, &ui_message_712_approved, &ui_message_712_rejected); } From 779fc4b61dbc3d2fed261bf1dfc54c5bd7270c4d Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 18 Jul 2023 10:44:20 +0200 Subject: [PATCH 54/85] Now uses macros for NBGL contstant texts --- src_nbgl/ui_approve_tx.c | 25 ++++++++++++------------ src_nbgl/ui_confirm_parameter_selector.c | 3 ++- src_nbgl/ui_display_privacy.c | 5 +++-- src_nbgl/ui_message_signing.c | 9 +++++---- src_nbgl/ui_message_signing.h | 5 +++++ src_nbgl/ui_sign_712.c | 8 ++++---- src_nbgl/ui_sign_712_v0.c | 8 ++++---- src_nbgl/ui_sign_message.c | 12 +++++++----- src_nbgl/ui_signing.h | 9 +++++++++ src_nbgl/ui_stark_limit_order.c | 7 ++++--- src_nbgl/ui_stark_transfer.c | 7 ++++--- src_nbgl/ui_stark_unsafe_sign.c | 8 ++++---- 12 files changed, 63 insertions(+), 43 deletions(-) diff --git a/src_nbgl/ui_approve_tx.c b/src_nbgl/ui_approve_tx.c index 44eb79b..a0eb6f4 100644 --- a/src_nbgl/ui_approve_tx.c +++ b/src_nbgl/ui_approve_tx.c @@ -4,9 +4,11 @@ #include "ui_callbacks.h" #include "ui_nbgl.h" #include "ethUtils.h" +#include "ui_signing.h" #include "plugins.h" #include "domain_name.h" +#define TEXT_TX "transaction" // 1 more than actually displayed on screen, because of calculations in StaticReview #define MAX_PLUGIN_ITEMS_PER_SCREEN 4 #define TAG_MAX_LEN 43 @@ -51,10 +53,10 @@ static void onConfirmAbandon(void) { } static void rejectTransactionQuestion(void) { - nbgl_useCaseConfirm("Reject transaction?", + nbgl_useCaseConfirm(REJECT_QUESTION(TEXT_TX), NULL, - "Yes, reject", - "Go back to transaction", + REJECT_CONFIRM_BUTTON, + RESUME(TEXT_TX), onConfirmAbandon); } @@ -159,7 +161,7 @@ static void reviewContinue(void) { .centeredInfo.text3 = NULL, .centeredInfo.style = LARGE_CASE_INFO, .centeredInfo.offsetY = -32, - .footerText = "Reject transaction", + .footerText = REJECT(TEXT_TX), .footerToken = REJECT_TOKEN, .tapActionText = "Tap to continue", .tapActionToken = START_REVIEW_TOKEN, @@ -211,12 +213,9 @@ static void reviewContinueCommon(void) { useCaseTagValueList.smallCaseForValue = false; useCaseTagValueList.wrapping = false; infoLongPress.icon = get_app_icon(true); - infoLongPress.text = tx_approval_context.fromPlugin ? staxSharedBuffer : "Review transaction"; - infoLongPress.longPressText = "Hold to sign"; - nbgl_useCaseStaticReview(&useCaseTagValueList, - &infoLongPress, - "Reject transaction", - reviewChoice); + infoLongPress.text = tx_approval_context.fromPlugin ? staxSharedBuffer : SIGN(TEXT_TX); + infoLongPress.longPressText = SIGN_BUTTON; + nbgl_useCaseStaticReview(&useCaseTagValueList, &infoLongPress, REJECT(TEXT_TX), reviewChoice); } // Replace "Review" by "Sign" and add questionmark @@ -264,15 +263,15 @@ static void buildFirstPage(void) { nbgl_useCaseReviewStart(get_app_icon(true), staxSharedBuffer, NULL, - "Reject transaction", + REJECT(TEXT_TX), reviewContinue, rejectTransactionQuestion); prepare_sign_text(); } else { nbgl_useCaseReviewStart(get_app_icon(true), - "Review transaction", + REVIEW(TEXT_TX), NULL, - "Reject transaction", + REJECT(TEXT_TX), reviewContinue, rejectTransactionQuestion); } diff --git a/src_nbgl/ui_confirm_parameter_selector.c b/src_nbgl/ui_confirm_parameter_selector.c index 43f93fc..657b3b6 100644 --- a/src_nbgl/ui_confirm_parameter_selector.c +++ b/src_nbgl/ui_confirm_parameter_selector.c @@ -1,4 +1,5 @@ #include "common_ui.h" +#include "ui_signing.h" #include "ui_nbgl.h" #include "network.h" @@ -61,7 +62,7 @@ static void buildScreen(void) { nbgl_useCaseReviewStart(get_app_icon(true), staxSharedBuffer, NULL, - "Reject", + REJECT_BUTTON, reviewContinue, reviewReject); } diff --git a/src_nbgl/ui_display_privacy.c b/src_nbgl/ui_display_privacy.c index fb014ba..2b08175 100644 --- a/src_nbgl/ui_display_privacy.c +++ b/src_nbgl/ui_display_privacy.c @@ -1,4 +1,5 @@ #include "common_ui.h" +#include "ui_signing.h" #include "ui_nbgl.h" #include "ui_callbacks.h" #include "nbgl_use_case.h" @@ -45,14 +46,14 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { } static void reviewContinue(void) { - nbgl_useCaseRegularReview(0, 2, "Reject", NULL, displayTransactionPage, reviewChoice); + nbgl_useCaseRegularReview(0, 2, REJECT_BUTTON, NULL, displayTransactionPage, reviewChoice); } static void buildFirstPage(void) { nbgl_useCaseReviewStart(get_app_icon(true), review_string, NULL, - "Reject", + REJECT_BUTTON, reviewContinue, reviewReject); } diff --git a/src_nbgl/ui_message_signing.c b/src_nbgl/ui_message_signing.c index 609dd81..582426b 100644 --- a/src_nbgl/ui_message_signing.c +++ b/src_nbgl/ui_message_signing.c @@ -1,4 +1,5 @@ #include "ui_nbgl.h" +#include "ui_signing.h" #include "common_712.h" #include "ui_message_signing.h" #include "glyphs.h" @@ -17,10 +18,10 @@ static void ui_message_rejection_handler(bool confirm) { static void ui_message_confirm_rejection(void) { nbgl_useCaseChoice(&C_warning64px, - "Reject message?", + REJECT_QUESTION(TEXT_MESSAGE), NULL, - "Yes, reject", - "Go back to message", + REJECT_CONFIRM_BUTTON, + RESUME(TEXT_MESSAGE), ui_message_rejection_handler); } @@ -43,7 +44,7 @@ void ui_message_start(const char *title, nbgl_useCaseReviewStart(&C_Message_64px, title, NULL, - "Reject", + REJECT_BUTTON, start_func, ui_message_confirm_rejection); } diff --git a/src_nbgl/ui_message_signing.h b/src_nbgl/ui_message_signing.h index 03f6367..6946736 100644 --- a/src_nbgl/ui_message_signing.h +++ b/src_nbgl/ui_message_signing.h @@ -3,6 +3,11 @@ #include +#define TEXT_MESSAGE "message" +#define TEXT_TYPED_MESSAGE "typed " TEXT_MESSAGE +#define TEXT_REVIEW_EIP712 REVIEW(TEXT_TYPED_MESSAGE) +#define TEXT_SIGN_EIP712 SIGN(TEXT_TYPED_MESSAGE) + void ui_message_review_choice(bool confirm); void ui_message_start(const char *title, void (*start_func)(void), diff --git a/src_nbgl/ui_sign_712.c b/src_nbgl/ui_sign_712.c index 6ad32d4..032e312 100644 --- a/src_nbgl/ui_sign_712.c +++ b/src_nbgl/ui_sign_712.c @@ -14,8 +14,8 @@ static nbgl_layoutTagValue_t pair; static bool display_sign_page(uint8_t page, nbgl_pageContent_t *content) { (void) page; content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); - content->infoLongPress.text = "Sign typed message"; - content->infoLongPress.longPressText = "Hold to sign"; + content->infoLongPress.text = TEXT_SIGN_EIP712; + content->infoLongPress.longPressText = SIGN_BUTTON; return true; } @@ -64,7 +64,7 @@ static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { } static void handle_display(nbgl_navCallback_t cb) { - nbgl_useCaseRegularReview(0, 0, "Reject", NULL, cb, ui_message_review_choice); + nbgl_useCaseRegularReview(0, 0, REJECT_BUTTON, NULL, cb, ui_message_review_choice); } static void resume_review(void) { @@ -85,7 +85,7 @@ static void resume_review(void) { void ui_712_start(void) { g_position = UI_SIGNING_POSITION_START; - ui_message_start("Review typed message", + ui_message_start(TEXT_REVIEW_EIP712, &ui_712_switch_to_message, &resume_review, &ui_message_712_approved, diff --git a/src_nbgl/ui_sign_712_v0.c b/src_nbgl/ui_sign_712_v0.c index 1022c58..8719f5d 100644 --- a/src_nbgl/ui_sign_712_v0.c +++ b/src_nbgl/ui_sign_712_v0.c @@ -35,8 +35,8 @@ static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { } else if (page == 1) { g_position = UI_SIGNING_POSITION_SIGN; content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); - content->infoLongPress.text = "Sign typed message"; - content->infoLongPress.longPressText = "Hold to sign"; + content->infoLongPress.text = TEXT_SIGN_EIP712; + content->infoLongPress.longPressText = SIGN_BUTTON; } else { return false; } @@ -59,7 +59,7 @@ static void display_review(void) { } nbgl_useCaseRegularReview(page, 2, - "Reject", + REJECT_BUTTON, NULL, display_review_page, ui_message_review_choice); @@ -80,7 +80,7 @@ static void resume_review(void) { void ui_sign_712_v0(void) { g_position = UI_SIGNING_POSITION_START; - ui_message_start("Sign typed message", + ui_message_start(TEXT_REVIEW_EIP712, &start_review, &resume_review, &ui_message_712_approved, diff --git a/src_nbgl/ui_sign_message.c b/src_nbgl/ui_sign_message.c index 766d9c7..0748bdc 100644 --- a/src_nbgl/ui_sign_message.c +++ b/src_nbgl/ui_sign_message.c @@ -9,6 +9,9 @@ #include "ui_message_signing.h" #include "ui_signing.h" +#define TEXT_REVIEW_EIP191 REVIEW(TEXT_MESSAGE) +#define TEXT_SIGN_EIP191 SIGN(TEXT_MESSAGE) + typedef enum { UI_191_ACTION_IDLE = 0, UI_191_ACTION_ADVANCE_IN_MESSAGE, @@ -21,7 +24,6 @@ static bool skip_message; static nbgl_layoutTagValue_t pair; -// static uint32_t eip191MessageIdx = 0; static uint32_t stringsTmpTmpIdx = 0; @@ -82,8 +84,8 @@ static bool display_message(nbgl_pageContent_t *content) { static void display_sign(nbgl_pageContent_t *content) { content->type = INFO_LONG_PRESS, content->infoLongPress.icon = &C_Message_64px; - content->infoLongPress.text = "Sign Message"; - content->infoLongPress.longPressText = "Hold to sign"; + content->infoLongPress.text = TEXT_SIGN_EIP191; + content->infoLongPress.longPressText = SIGN_BUTTON; g_position = UI_SIGNING_POSITION_SIGN; } @@ -109,7 +111,7 @@ static bool nav_callback(uint8_t page, nbgl_pageContent_t *content) { } static void continue_review(void) { - nbgl_useCaseForwardOnlyReview("Reject", NULL, nav_callback, ui_message_review_choice); + nbgl_useCaseForwardOnlyReview(REJECT_BUTTON, NULL, nav_callback, ui_message_review_choice); } static void resume_message(void) { @@ -131,7 +133,7 @@ void ui_191_start(void) { eip191MessageIdx = 0; stringsTmpTmpIdx = 0; - ui_message_start("Review message", + ui_message_start(TEXT_REVIEW_EIP191, &ui_191_switch_to_message, &resume_message, &sign_message, diff --git a/src_nbgl/ui_signing.h b/src_nbgl/ui_signing.h index e9248ac..e7b8f71 100644 --- a/src_nbgl/ui_signing.h +++ b/src_nbgl/ui_signing.h @@ -1,6 +1,15 @@ #ifndef UI_SIGNING_H_ #define UI_SIGNING_H_ +#define SIGN_BUTTON "Hold to sign" +#define REJECT_BUTTON "Reject" +#define SIGN(msg) "Sign " msg "?" +#define REVIEW(msg) "Review " msg +#define REJECT(msg) "Reject " msg +#define REJECT_QUESTION(msg) REJECT(msg) "?" +#define REJECT_CONFIRM_BUTTON "Yes, reject" +#define RESUME(msg) "Go back to " msg + typedef enum { UI_SIGNING_POSITION_START = 0, UI_SIGNING_POSITION_REVIEW, diff --git a/src_nbgl/ui_stark_limit_order.c b/src_nbgl/ui_stark_limit_order.c index 4c164c5..ac4693e 100644 --- a/src_nbgl/ui_stark_limit_order.c +++ b/src_nbgl/ui_stark_limit_order.c @@ -1,4 +1,5 @@ #include "common_ui.h" +#include "ui_signing.h" #include "ui_nbgl.h" #include "ui_callbacks.h" #include "nbgl_use_case.h" @@ -39,7 +40,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { } else if (page == 1) { content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(false); content->infoLongPress.text = "Review stark limit order"; - content->infoLongPress.longPressText = "Hold to sign"; + content->infoLongPress.longPressText = SIGN_BUTTON; } else { return false; } @@ -48,14 +49,14 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { } static void reviewContinue(void) { - nbgl_useCaseRegularReview(0, 2, "Reject", NULL, displayTransactionPage, reviewChoice); + nbgl_useCaseRegularReview(0, 2, REJECT_BUTTON, NULL, displayTransactionPage, reviewChoice); } static void buildFirstPage(void) { nbgl_useCaseReviewStart(get_app_icon(false), "Review stark limit order", NULL, - "Reject", + REJECT_BUTTON, reviewContinue, reviewReject); } diff --git a/src_nbgl/ui_stark_transfer.c b/src_nbgl/ui_stark_transfer.c index 0b752eb..28abe38 100644 --- a/src_nbgl/ui_stark_transfer.c +++ b/src_nbgl/ui_stark_transfer.c @@ -2,6 +2,7 @@ #include "shared_context.h" #include "ui_callbacks.h" #include "ui_nbgl.h" +#include "ui_signing.h" #include "starkDisplayUtils.h" #include "ethUtils.h" #include "network.h" @@ -84,7 +85,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { if (page == 2) { content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(false); content->infoLongPress.text = "Review transaction"; - content->infoLongPress.longPressText = "Hold to sign"; + content->infoLongPress.longPressText = SIGN_BUTTON; } return false; @@ -93,7 +94,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { static void reviewContinue(void) { nbgl_useCaseRegularReview(0, context.conditional ? 3 : 2, - "Reject", + REJECT_BUTTON, NULL, displayTransactionPage, reviewChoice); @@ -119,7 +120,7 @@ void ui_stark_transfer(bool selfTransfer, bool conditional) { nbgl_useCaseReviewStart(get_app_icon(false), "Review stark transaction", subTitle, - "Reject", + REJECT_BUTTON, reviewContinue, reviewReject); } diff --git a/src_nbgl/ui_stark_unsafe_sign.c b/src_nbgl/ui_stark_unsafe_sign.c index 70579bb..45a8556 100644 --- a/src_nbgl/ui_stark_unsafe_sign.c +++ b/src_nbgl/ui_stark_unsafe_sign.c @@ -1,5 +1,5 @@ - #include "common_ui.h" +#include "ui_signing.h" #include "ui_nbgl.h" #include "ui_callbacks.h" #include "nbgl_use_case.h" @@ -42,7 +42,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { } else if (page == 1) { content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(false); content->infoLongPress.text = "Unsafe Stark Sign"; - content->infoLongPress.longPressText = "Hold to sign"; + content->infoLongPress.longPressText = SIGN_BUTTON; } else { return false; } @@ -51,14 +51,14 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { } static void reviewContinue(void) { - nbgl_useCaseRegularReview(0, 2, "Reject", NULL, displayTransactionPage, reviewChoice); + nbgl_useCaseRegularReview(0, 2, REJECT_BUTTON, NULL, displayTransactionPage, reviewChoice); } static void buildFirstPage(void) { nbgl_useCaseReviewStart(get_app_icon(false), "Unsafe Stark Sign", NULL, - "Reject", + REJECT_BUTTON, reviewContinue, reviewReject); } From 9186911abbf894a00b0dad2eb96b02aaaeee8b29 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Mon, 12 Jun 2023 14:18:57 +0200 Subject: [PATCH 55/85] Changed the info/settings page ordering --- src_nbgl/ui_settings.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src_nbgl/ui_settings.c b/src_nbgl/ui_settings.c index 7981356..b8c81eb 100644 --- a/src_nbgl/ui_settings.c +++ b/src_nbgl/ui_settings.c @@ -24,6 +24,13 @@ static bool navCallback(uint8_t page, nbgl_pageContent_t* content) { switch (page) { case 0: + content->type = INFOS_LIST; + content->infosList.nbInfos = 2; + content->infosList.infoTypes = (const char**) infoTypes; + content->infosList.infoContents = (const char**) infoContents; + break; + + case 1: switches[index++] = (nbgl_layoutSwitch_t){.initState = N_storage.dataAllowed ? ON_STATE : OFF_STATE, .text = "Blind signing", @@ -48,7 +55,7 @@ static bool navCallback(uint8_t page, nbgl_pageContent_t* content) { content->switchesList.switches = (nbgl_layoutSwitch_t*) switches; break; - case 1: + case 2: switches[index++] = (nbgl_layoutSwitch_t){.initState = N_storage.verbose_eip712 ? ON_STATE : OFF_STATE, .text = "Verbose EIP712", @@ -69,13 +76,6 @@ static bool navCallback(uint8_t page, nbgl_pageContent_t* content) { content->switchesList.switches = (nbgl_layoutSwitch_t*) switches; break; - case 2: - content->type = INFOS_LIST; - content->infosList.nbInfos = 2; - content->infosList.infoTypes = (const char**) infoTypes; - content->infosList.infoContents = (const char**) infoContents; - break; - default: return false; break; From 82b40a634776d00e029f5b8a78185ceb5913723e Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Wed, 28 Jun 2023 17:13:13 +0200 Subject: [PATCH 56/85] Now conditionally show the plugin's icon depending if the TX is related to it --- src_nbgl/ui_approve_tx.c | 22 +++++++++++++++++++--- src_nbgl/ui_idle.c | 3 +++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src_nbgl/ui_approve_tx.c b/src_nbgl/ui_approve_tx.c index a0eb6f4..93fb826 100644 --- a/src_nbgl/ui_approve_tx.c +++ b/src_nbgl/ui_approve_tx.c @@ -179,6 +179,22 @@ static void reviewContinue(void) { } } +static const nbgl_icon_details_t *get_tx_icon(void) { + const nbgl_icon_details_t *icon = NULL; + + if (tx_approval_context.fromPlugin && (pluginType == EXTERNAL)) { + if (caller_app && caller_app->name) { + if ((strlen(strings.common.fullAddress) == strlen(caller_app->name)) && + (strcmp(strings.common.fullAddress, caller_app->name) == 0)) { + icon = get_app_icon(true); + } + } + } else { + icon = get_app_icon(false); + } + return icon; +} + static void reviewContinueCommon(void) { uint8_t nbPairs = 0; @@ -212,7 +228,7 @@ static void reviewContinueCommon(void) { useCaseTagValueList.nbPairs = nbPairs; ///< number of pairs in pairs array useCaseTagValueList.smallCaseForValue = false; useCaseTagValueList.wrapping = false; - infoLongPress.icon = get_app_icon(true); + infoLongPress.icon = get_tx_icon(); infoLongPress.text = tx_approval_context.fromPlugin ? staxSharedBuffer : SIGN(TEXT_TX); infoLongPress.longPressText = SIGN_BUTTON; nbgl_useCaseStaticReview(&useCaseTagValueList, &infoLongPress, REJECT(TEXT_TX), reviewChoice); @@ -260,7 +276,7 @@ static void buildFirstPage(void) { op_name, strings.common.fullAddress); } - nbgl_useCaseReviewStart(get_app_icon(true), + nbgl_useCaseReviewStart(get_tx_icon(), staxSharedBuffer, NULL, REJECT(TEXT_TX), @@ -268,7 +284,7 @@ static void buildFirstPage(void) { rejectTransactionQuestion); prepare_sign_text(); } else { - nbgl_useCaseReviewStart(get_app_icon(true), + nbgl_useCaseReviewStart(get_tx_icon(), REVIEW(TEXT_TX), NULL, REJECT(TEXT_TX), diff --git a/src_nbgl/ui_idle.c b/src_nbgl/ui_idle.c index 8f1d0f8..ee708d5 100644 --- a/src_nbgl/ui_idle.c +++ b/src_nbgl/ui_idle.c @@ -32,6 +32,9 @@ const nbgl_icon_details_t *get_app_icon(bool caller_icon) { } else { icon = &ICONGLYPH; } + if (icon == NULL) { + PRINTF("%s(%s) returned NULL!\n", __func__, (caller_icon ? "true" : "false")); + } return icon; } From b458aa49cb55f98e8f78e813c78d5c290a620f7a Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 29 Jun 2023 14:33:50 +0200 Subject: [PATCH 57/85] Fix NBGL EIP-191 occasional double-refresh on the sign page --- src_nbgl/ui_sign_message.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src_nbgl/ui_sign_message.c b/src_nbgl/ui_sign_message.c index 0748bdc..76b86b2 100644 --- a/src_nbgl/ui_sign_message.c +++ b/src_nbgl/ui_sign_message.c @@ -82,11 +82,17 @@ static bool display_message(nbgl_pageContent_t *content) { return true; } -static void display_sign(nbgl_pageContent_t *content) { - content->type = INFO_LONG_PRESS, content->infoLongPress.icon = &C_Message_64px; - content->infoLongPress.text = TEXT_SIGN_EIP191; - content->infoLongPress.longPressText = SIGN_BUTTON; - g_position = UI_SIGNING_POSITION_SIGN; +static bool display_sign(nbgl_pageContent_t *content) { + bool ret = false; + + if (g_position != UI_SIGNING_POSITION_SIGN) { + content->type = INFO_LONG_PRESS, content->infoLongPress.icon = &C_Message_64px; + content->infoLongPress.text = TEXT_SIGN_EIP191; + content->infoLongPress.longPressText = SIGN_BUTTON; + g_position = UI_SIGNING_POSITION_SIGN; + ret = true; + } + return ret; } static bool nav_callback(uint8_t page, nbgl_pageContent_t *content) { @@ -105,7 +111,7 @@ static bool nav_callback(uint8_t page, nbgl_pageContent_t *content) { } } else { // the last page must contain a long press button - display_sign(content); + ret = display_sign(content); } return ret; } From 25562291e44d8788b34451f0591b549343e1d3de Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 18 Jul 2023 10:44:57 +0200 Subject: [PATCH 58/85] Fix Stax ragger tests --- tests/ragger/app/settings.py | 1 + .../stax/domain_name_non_mainnet/00000.png | Bin 8435 -> 8607 bytes .../stax/domain_name_non_mainnet/00002.png | Bin 9348 -> 9538 bytes .../stax/domain_name_unknown_chain/00000.png | Bin 8435 -> 8607 bytes .../stax/domain_name_unknown_chain/00003.png | Bin 9348 -> 9538 bytes .../stax/domain_name_verbose_False/00000.png | Bin 8435 -> 8607 bytes .../stax/domain_name_verbose_False/00002.png | Bin 9348 -> 9538 bytes .../stax/domain_name_verbose_True/00000.png | Bin 8435 -> 8607 bytes .../stax/domain_name_verbose_True/00003.png | Bin 9348 -> 9538 bytes .../stax/domain_name_wrong_addr/00000.png | Bin 8435 -> 8607 bytes .../stax/domain_name_wrong_addr/00002.png | Bin 9348 -> 9538 bytes 11 files changed, 1 insertion(+) diff --git a/tests/ragger/app/settings.py b/tests/ragger/app/settings.py index 48d78cc..225910c 100644 --- a/tests/ragger/app/settings.py +++ b/tests/ragger/app/settings.py @@ -52,6 +52,7 @@ def settings_toggle(fw: Firmware, nav: Navigator, to_toggle: list[SettingID]): moves += [NavInsID.BOTH_CLICK] # Back else: moves += [NavInsID.USE_CASE_HOME_SETTINGS] + moves += [NavInsID.USE_CASE_SETTINGS_NEXT] for setting in settings: setting_idx = settings.index(setting) if (setting_idx > 0) and (setting_idx % settings_per_page) == 0: diff --git a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00000.png b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00000.png index a23d9177c3caeaee251141b056d94ed980f4bb5a..795ca0c2a185ec1e7722d7540106a25979c5cf4f 100644 GIT binary patch literal 8607 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 literal 8435 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 OK5L6x=JnUSlm825`x|rs diff --git a/tests/ragger/snapshots/stax/domain_name_non_mainnet/00002.png b/tests/ragger/snapshots/stax/domain_name_non_mainnet/00002.png index 2d6b095b8b7856ce0c19502a1fbd21cfb09c22a7..7f634cc4a8e9160c710a1271dffe84a1e4208ac9 100644 GIT binary patch literal 9538 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 literal 9348 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 HrfK8+sp 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 literal 8435 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 OK5L6x=JnUSlm825`x|rs diff --git a/tests/ragger/snapshots/stax/domain_name_unknown_chain/00003.png b/tests/ragger/snapshots/stax/domain_name_unknown_chain/00003.png index 50df3498127a21582b14f2b69375b5f885b7217f..299779759a1189fd5b709b27ed08b2435a5027d2 100644 GIT binary patch literal 9538 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 literal 9348 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�lMY za7}u1=toil%>n=}{y~vG?t2b;l%2=y#vo0^P3CU=p^gP*0bY&H_Km}`_8O^7W=(Lz z>LH32HqMsZ#9g8%82w-Y1yDd1HZ59Y&TbrlE-fd30OZ2tv5U%)H@%65hnFouxvbD! zR-80RpnX0YTX!coDCE@*S1#g#b3;W%%+v<<5ZJh1{GczLTjha0Br@day@XZJrU--wHuoVBq#H=KR6z6nhE_TYvq)h{%6 zXM^493klsk&{d-+C6W^b#C4S^i;yN|UPL8p{ejLB{05VfO7dXlS(d$6D^Z&O&`*Pg z#q9c7_0}skKHLa{6|HypDpd^Nb;+h=P7S28qCz1N2vOjtd&afM=46gcs)_Xx7`hx! zX0zGFhdg1WbOa3TM;kfrdEyv7y=$tF3g(NsZ>29II>s;As?126gI>t7M16WQ#$M5| z7{;VPx@1xlM$osMC!WW>AHVeep5yuP-mqY=^f_QDtc4RNzc_tyN?kiMJgJgtQE-*& zpKs<}dO19Y0e*Y-unE^!nl$6&woF{=w3u8F?FoASC`L2fbzSJ#O_Y^} z%TGZ}@a#t+Oz)l6uK{&Ex+n_H;{AAeWlNv{i$KYFOytvWWlQP%^c`dDrHo9I&fiH! z^`9-e`dFfq&fj<|=N%BO8s~U_4LoltSFlX6wgrnon6HSO>-3m=;`>m{^i*GZga#lm6Ro13r6OjWk8V}<3qfeAz7=jTbIvsWe;bhzKo5^1~LjC|lv1R*HPl$o%nuU{^eb0P+a z3f4z#ZA;R+IC`Aq(A*UZZS}ckOWez=zn0)=OkK_LVF%At&xw1g$MGw_=P=fqr|R-G zmrJU*6%v7+&H7TJ?KOU8i1gLYb>&&zx`?v6nbU39h5+Ot=pE-$2A8hrglcFucV$>pCef;F&3m^vkzAGnPweT|==)cr#C_zQt_uq2aHYs59Mb5%-n#%=7X*C>Jif zdfXjBo$Xo-gi5E9h?ewX#KW+MrfGG&Scn-9D?88=-B(u=bkrg2_6=w1obH%XdJ^#& zUEBH%YCY2?d6c!ewUtBNQYCfiN@}v%X0Zp-Yald%?9%dI^C>=xzb#nM;GwUytK8FjTB08}3W=W7!LowJ3ku(ug4RE3C16S9Ky7w> z^>()b;%9F&YR2PNoJ4!#q)y^V4w8n~rK?4VS};%a+n;H-iVjJ6w-1!F*C3@N!nesI zQMI5Dm@#?#%o~LquMjx{48@0{ZDN}94V8LRoTB8lF{i!^Z=3(p3`GCo@c8zQX2fXm zuLyaZme%|yrD-`yX{GjCy0eGQ0Sx6rNS$0K-jC}Rz3ezNnBU!?LGYO~ISV+s(D5!G zZ2Q#H!Z)hb`7PZ;DDnK8opfxQ{g*%4T$?wNpkynxcl2wgpvv;qI@G%Ygf)- z&a9HGq)2S1lH0ZbN$j2>NA4tG_n{$OH4rl{TQHsQAbT5&m#+bfz*nYfL7<86uS) zG&(Jj5nrWJ@K(tRem}Ry4Wr@xr#2;}Q%yLB zVkDw%VgndS#@6%iGI}0Y)Y#naf#n-nf z>tdC1V8xUAB|gLNO_H!AKFY7{o?}`?rLic&k<}>j)|TVj63B35vDyCJyxf=PRZ^dB zKPdYNIYJ-TLwJDu6o5f7A9@L?j3dUv%3O6}OepFV@}uk7BWfR5;8uErK8h znjZzw)*5l=FSHdXu;)LW_52s;#*p8z2#_wTbe z%Nhkt2;TMd&*HdNM^{^U)50iOoPk`*bc>K2- z!Keme#h0J4myh3es2aih#oMRJ11BBDyR*FwHdaN(rA*$kt-t$QwSd99RF6K?5z@i< zg5Ihc$VR+dS4}s^X=?P=Bwe?;I1<%e(W#8l8f}b^IWXfC*?qsF!vz~OKsknKSg4%) z+V?Z|hqCb`KGpIR4Nr?2F0xNPfT{Srf~t*|CWY$BFw_F1Dh=0&hTImE*(hGx*gE{M zu&r%9RjV1djX1~$L(iz@bV^9Hhw_F?$Gh9wVp&;nM?Yc0t; z6B3m<&b;2TxUio6n3!J$7bFHkzotg82gOW%1{Iy;a1zYo$Z%adjoRP4Cs>dukBd0= zqj*0W!{zDM^^;sJZY)Qysy5ez0vg?qacPe!5mn9^mEktrv~b1q zcFkObo=jLsQ$QFi4mns-jm=+~C=_TkmJ?{VqjvS_CX~u!1~^bGNQe*Po%nIl!O5q-jgk%70)6Nl8Y{+cxWk%j>>)ZEnBKe&MhrG z%#3UWay04wL*&)BRk!@ZJnf3SWSCJ|De+BQiX=Uf`{rz-J{tB_{39- z|I+U`H%!1*Zf7w=<#3dZn`>cw6ovH-n<(pjMtwS0x#?>c%_@{}ovrrDjd`D@%LYxg zHPD6e*vP1;;qBRL1ScimH{P=p`-+B`;aU5PdLSFa(j3mXX&9bcCSgQn)%T0{`z(g& zt@kFzD7wngE7N~=5tDPsUbT)tLUU)?QX&c3{)d8gv9lieh5RRu6WRVVXEQ{vqFbVs z`)bzDtzLK2ca4XSqETU1Xc^C0yC+hvlTtKlQn91vQ$GnPG*2t;Pq#)XkOJ^hhx;vh z3l%8SGjAMwhRLRBZ~O(1y5Rj%>Fd|ITDaR|4!L0}ZXorsGlM4pkkvyW8hoWSm;)Rp zolXZ*u?@Wo>|wKtLG!piZ1{%2Exmk7BPSaR( z8$IKo#wKj#{8#N3$9_}y-fp!?kB~zz3Xf5$rez;UnULEDlxMB(Zc>hwH+&Pdv|vl9 ziz3W{6BaX!ki~Tyxjwwq(^kyv6?c?7W3GKb1^1&ZQ-u*R?G&PegO8>cF&z$D^yfmSR!#oHC zw7`kVMdcBBf%I{`CQ?{2@g%Z5U``SgfK8+sp z7()=6R*qw88w6>DIu%3`Z4eRRxvl5B*7q;?em~Dz&ska554p4MeO>py_TJZizwTt- zcD9!}cKVo*kdTbS&Feo42?_ryBqZ{?qzG`u+@-fpNa#$k!*!cGk6tpV%onvc32Cr# zoR;v;d!*ZAKG^s}_DQRQU^QZpJRaHLQ+$=*P&mZ){y{}4n12^VoVtic{q(|Or zNrJ)$m|<*AQstTBGh!)e_FMcpi#coqBi?-Sv6&r z_9G-?;O*)B-prI1HY9i8t$#lLc00&XEo$<1?xmA-kpS8iaXFEFNkFj79VzpL!5i{OP?0MrjZe9n)QtM zvpMDxl+4Zk04ouxwyq>5a0?n*g~mlXYsXt-^N8pA*u|+@XIO1U8Wh*B#zHm9sR8Cx zZ@$24f&AMA*WQI}JS^n^1q^Zhr@b9UI zOD@uMAQ=*uKB`)kYC5>P!<2g5YggN|s#fCrf<1$+%_=8+eSL#GKP}|}0WvCQ=Ssl> zk?DGT*_PDug5FKZFfvV$6^pCDxlP9kwzh)i^`2=CX9?fik<$O9+V&K7|3-jklnSLu zr^wM&As}BY*mD`HKIR>?9$@LJ5S1-!;7WLV&!Irf#&5rou^VaHb>%v0C6x~g`SVGr zXpe4{18I{NL@e8RM(^&sBSMW{8a10xI204+oN^-+!+VCPsg%v6W;pMIdL1bSCWKgG$__9 zuaM2}?L6W5F(d8$5Mm9;Osh&bxP(boi5MYKF%rRwnUsFKAw^U)hiHNRKMz}FDY$EibydUx}eX3PUYGhCWj@BOARSz z`>TioDYSUTRbeb#X}8~neDd(CYqT0PSVh#>#t$ZnQcmy97cSFiZcbTsJ)U}QAqB{f z@PP2=scb$=ng7^c7BVyHXY^N6sQQM6h*X(A`(dQ@E5R;3v(npG>4RilsCR7w* z{@_)E97#XP5cIOD8nS*MMjaGhgOZT}aAAoMb?<(Q66hTYHkHv)7R+^URj_kyhnHzO z97s5O76K`$4pfW_Swo2LGv_H&Q?XEmv=S4^CuSYXRTuthHCz&XqVY@B{qTdP3$I25 zJn)1RA##K4+2awSrWed8&^(2E-#$FPm-`)jaCZT_r>)hNQOf3%S1wo!@Qh{bS6~VGmC$``Qz!OC0OihPf z@n%P7(xiZfGdS%~Al*2^6|~6sdR+@!r%MqwkT}a$k0Lcaff1tB0NsGU+>EgY@AT7n zOb)n{mZ!Rj6p0R0A`xky{BK3zESkI}2o*yCN3FVE=Cus0h5w=q3HSy}gUwugoRH^q zCtJd$4Hw|KYfa0NYlM*B1#(0gtkZS1bCDtY!E8myb`4Vz>F>61TmoKn-G#%DEi$>lnwzfHv zUu^L4*1igMMI&G1`|i4b9je4NzD|hUeVkc!f8+7D{e&G$zzN-*$3UGt((sR5p$_|+ zuUgkaGG=^H&F=S4WIO+yql&J}hPi;bt$UVtoK`@j>Gg8u88N;N6zUjau}X1;ayC>a-3$&PAT)-tz$-#B3NQvpl_C zZ0KasaRsHax7mw4-C1Uk7r^m*;HtnX7|W=jQ~RR!AL)N~pNxgCxormn+6gIw0%r*L zh$Eb1*@&!8IK|M3WEkW*C&0!G%cC|&At{*9!#Z=rV|34Tx#)v{r={4xSY6K{-_Q8I z8KI>^Ey2GG^vl(^EKNQ4Vx3l5S&1ql#f{jPVwNSb0hm!bsk(Ak4Rk}nE;yIYnFSBP zi0Bf6p){eV5w6hFblEe08}arf4|!*j6X+S7p&D0#vZ@?o2Mxi_J6ttRN4Op(`Y3(} zHu1h_*tq-c^1p9#Yik>iCz$qxww@tv7@{ezXk$=sWtOP7W2;T*zFw*`)xWrPc38rD zY+{?o;{j*0#Pgm?e!sP%dj6Z*T5CC=nw6+8upcaYR-ES)>K^L zD$t3E#ds7BN_R#RUut7_iD3nr%Vr6bOYIHmu?-C;-#5nv>eeg^#U8m)0=|;<);ORK z&G5BeU0NdeFqx6j9F-?rT8)*-^B|x=1%pvgp!=oBcQrEd^G|d-uAD!gD2FSlYUs7o z6s;quL}ISNDq2?Bk5LWK)b|EXZt@VUdskJ$%AkL7>2qd7GgG{iJGlo#rSWL$$3gt! zY&0%4UK0WoxG>mFXEn$2+0(Q-fNQI{IG!XQ?m4pYlS_vA{(O%)=d4Q0E`6c?N?Lu`#F;M72iGZP{E z=TlmQFXyjM#fBw1UOgBkFRz=bqVBEudgs^#*YBM>Sgz)AZRW5tPZmNDcY6-bI?zQ7 z^aX2jbCnU}J?p2{XX`Fc?>O(z1ML@`TKZIIUMWTVUlRX}e|+%2I0lBSn{)=eFJ@K2 zDY$3n9lndE@yd*xqD@s2Y1ZY=O*&H8>wfS*KqF=;C(~g{>DIR^@-U%^G;Y!X-9rFQ zRd!cMqsPH1fDkQ!=4zj5#sXSQ84?REBVEioi)t-;c`X*Io=?<}Yz6Uo9oEA$H(rN6 zcmVnL6u?)olSj2^+zEOcJuXTG|K>Wn3H4VHB&O%!7@T4Z^a5j}t4>t->ZNtGHt5pO z+HB|COo?(wObY|t#n3xqRR81UtSS;`Dq^7>j-#=ie*C@|899-qCk+r9pR`buSvw{Y zH+agz5s(`W1w5zP{q@jN37be%>$sPev2oVf1iXKI_2)E@*ZM+lp{HX7oq<)&uTJ0k z3DD-BA<|C z&%$Wqz{qXF;%)NQTE{v!0oQ_Y=>yb7nN>*j&@EkLni(ap;Wi=uRP>1vPOqU8)c}sC zb;7+B>}u$BfH(t$bz8_EX8NTV00GF`o*xybZM$&80=2%I8{w)hWL23~PL$_$_YcnI z6RSO|8}dP3judP^8y9=3ZJ-r2hUmt*rm}R97u#IR*VcH6IwPN`$ndn&(<8+s~E|K(oggPF1BS>r97F`pHa&Uu<|g_E9sj4-!{R)!Hzv=Y=?!Vu<>=jzMMWYAWjwRFhpV^BE1Zmqbe{s7m%|W?3MJOWR^Y6R=YRC z4m1W%!IopoWtQSw%CZpMfcQX*)W>(5xs&8Egj*|KtnKgBw(&%7@>WdU24KF|Z1w>I zi*MM7$Z_TtonlOvto*?w_pZM)m?+tgGmUclbVsPB&RM=q{rC}s>r3A{Zc(sbg1Lbq zEduXkdF7z=pTZ%Rl*Fb-r001$BM;9u|J53kaBK99W5kWhPLuhmAfgLW;`h0NTOLBh zU_gflUr6O`4|ag4Z;otbo6k6-i2Xg4CQi{{wXys4a4Ct>r@8>}NyaxZ;_;THHK4a@Alzp_5W_x>D8nh2}7|hw^TnCG`3T zxizL*?KjQgZ;#ruJ7O32JKlxg0hDj`XIjvBniv3V;!n}IZ6E`>?O_wy30JoJ_|6q^ zBf!`xAmVif%=Dl`tcEn4cP4Ve(qM;T#R&Mxf5>*c9w#$i5mZ81NQ%7TXtMSLOldCc zG5pi<;}~|ta~`zn!k5?|CN{JuqJ5ITdu^A3r=#Z4Dr6smM^jY&4bDP=)9Y21>fj~q4#K@UBy4|(^lDyV<&*X! z&YQ5KE4^=z?u5A#{@;O?CG`nTR@I|eeW8VZG1tYC{ySv}Px()@T)%N~hc0BhYb?yCf zACxXfn&u=ar^71fHnR1Q*0I4>kcT3o;*c0^fhV{E+)>>9FI;0RP;i^kvXG|V=sc73 zJMOV4HnfR+(y`yCY1#16_P7ga^0|Q%39g+S5rF$bOg7DVl^$Ek<|7`Rw2K0w_v8+P z!HDnEf%?gcbyDCXXTR8Q5c*WgS#4r@hEDKgBPWAtaX;oTAHf@;6w_uklro$;B5Bj^TbPX`KQTq0RLzmEhJ8Z04?-`JTc1MU7oy= znQ1|fR3Um6&PvB7aKD4`Q~;}trT>CseEz!AUx``$`mlvcDJM~!!|T*KDOa+p#sNPa zu7C5ykLfUXcR;p4*B85a7|EK3qTOh?sgNPa$M=Zm+W4Sz16IXjY?Go!64mrSuF)b_+)hjl1^_BYS+!cYaf zh}&-Zk)&4RNW3q|_4nu>0Q7cvhx`uK~ToEiZ_6g2Lt^+Ad_B zCC&48b{=he`Pai=aN_%{s$U1F8JVDew1YJ&YV{`4 zD)IkkjemXrlqxK*wAx=R^9P5wKE2IcoJR-layT3YBMeW=zY+~t{3*KB6F{wpuQ4(P zO>Ti6yr>U*+ZFe1#{#m=7m&$hB9XYD=F@U$v*ms1aU%}uz*&4c0759vjDl>J&YntJ z$a`H|y9VrzPSO556cOe$$`{bSU5~5qaR2HJ+Xnh8agpz) zM}z z+2s8?V^gbVs;E)mz=!Yqw;V?utql6I-l}_gD+zBc9UnhG<)&kvcK2n(gtD|5eb4tW zqD*c)wNiF^Te%I8rHGq$uAA$fnxgEd1G}NduionAEEQu#_0&_gNTZhZfbee^3b7WF t?3LebPCl(Ge&lX-`u{(@J9Hp~f3I=GQ7Ekt_~V6;gPrsB#%q30{tMKtzH|Tp literal 8435 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 OK5L6x=JnUSlm825`x|rs diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_False/00002.png b/tests/ragger/snapshots/stax/domain_name_verbose_False/00002.png index 2d6b095b8b7856ce0c19502a1fbd21cfb09c22a7..7f634cc4a8e9160c710a1271dffe84a1e4208ac9 100644 GIT binary patch literal 9538 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 literal 9348 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 HrfK8+sp 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 literal 8435 zcmeHN{X5g`-jI^L@VFuh;9?A9lB_4j+;^ z#K*^X*!sHp9X`H&fAaD1zYyXFW-j0Etl{HR!djb~-i>|Eq%xmXU++!z8Nr>|cjtv! zxA+fnEdkMeW@F;I0z#(Oeiv635H2rM#^&2dk2DjtM6+Q;tryGr&q z3i5T)cJVkqKCKf;2d*Cc=lLfG|J1<$p&Cf#<?Z*Ks$K#D0z9M1B{G1}PYgX3nfp z54@==PfdL`i|}*=KDtfl%lslC)r>d{rLYT*1B1zI4KZWUq*Oimoc_w-A-XN8fN%;e z$uCl~klm`YksWi?#pMyDQ#;7t2P_~t@pvA=et6;~+vR9dYRnQ0=frt`Ss^Ej;CDhm z(n%}VsdV1a(V}0xMhU(Aud}Ba|NcV3QKIiU=Y3F7rCJ90si0z3caPamkV)C7LmsGX zRJUnaiC;vlP|vXMx}<`+w@*ih82zqefa3H%NhLJe4opUr(&h2@*9j)NV3C64?w)H@ z1QV`j+dB;h0i$E2{wX9m;Fmm6+{NWvENFw!6$+Mdbpdt>om1VITNMNYVVvX_;k284 z;61FamPYk^2uRMkYE95G1w|YAl2T6&-A!w4d-vnY+;3>DUKkGi7b0N!_fvbLXD36v z;Kd;Chps~EHh0L}Cuz^u5GFQO-affAEA4Td_ujwcNk?7U!>Ns{nhIKP%>^V`?jh%T z#peiqzwwK}K{!Of*g%g2FfEk)LY=53T87Eg5+yc?CVxTTx&xKa5oLq5>O@JCWzbvR zwmR|pc^e=H)rQ%`CYxOUXPMMzRCiEBF|E4?RcX{Z89Gf#ts(`pygUD>CN21T z4RYd}C-3eZ)f0c$)&0{^cu!mXRG(P9Cl%AAj+1qVMBw2m1U5!rNc0q1%P}uNAC;>d zNymCN;El}byy2d@>rEo?6j5nl+cahCQ0Y{k&zBKc+d3SvC0R@w$WN)0a*X?J2zJ8m zeC>(A28}Dm@=a+_iQySFNj75@CRTiNi6umD_Cj z@tpNBw_khZazD6eB<}ebZ(G;4%vm8G#4kcD%>MdzNZZdn`rwMtUXdDKNkWLm$|a>* z*{&nhIs082&WagJC#9Y!cvD+WIA!MS0)%s-fJGY{Hocs(H;5695nT}VwE*r1X>)Y( zv)2cH1t2?mki3-58+idke%%>D>a~L+!3o-3Y_Z zmqEJ?>NlSh-yhzrQ2Pnufi4Io^CrHkcDUDIRfjUI4?4N#QKdK_IutX?iVT#&VD z?a^A&P#((!wj5nJ_AYWM;d}qg%A?eM%c8j&wWoZf51QJMTjvoL_M#dSy2I=7^$cvV z44s#vbUpVK<`Tr=LPmv_C=%mDZVhH4OYEAXJBrMDf5KDPXR(17z z&UCG;z?-K|QKj=1_66(vOvTOZb?@$q-1u?d#CVhg#J(LpH?jEk_&YgpuCf`X!0Gi6 zU5(hJcmO(@=zkGe4d5f;>P-m?YHHZ^1EyLn{j`9kOJv++U!Qa$nbXPOPQ{VKVqo-` zN6(ehd&`kQ*16MA1Kz8gna@=3ya2O&^IT;r|7VS=;Kdy_^~57(>p0%*=FV8ss7ATo zuN43sa8!lY;~lCt@SK{va}8Yhfr+&&K|0U943!tKN-cjv)ASw@_1oGicF$VzgOg*3 z-k*uFYHyGjlD33P-Tuh^A!^38TB7a;A{rVWL+sfBFu3MT-i*6l&w))D*U&g`D%H<5 z@4VAo_-b%cfXNhVa;^;s>MZdm0Lcx`7}@bK>q!jOb(upqk8*%~-*UIhVsP)#?}20U ziG4=9SgWw}-&wC+^8#G+px^R$?@KkOLnvpgbNyXmhH{$uH!*I>O6Uf!24~*4;1Xn= zMzQR@09Q}Ve5cI{M`7r=inT8t@1fcDXWcolQ%~7$LcF~MSTmo&b<6upHjzaD(!VBr z+`^tMJhRRFg?y!**pYKc9kWS#FU1pR4Xm0ybFJpuQWb@AzNO0I{ModTuD(9BROx2x z7Kv;V6hi)$tgMW}oInO> zo-cP#V@VZk&VJZft0XTD2$QHUkv*7fRAj);{j%dObqgAG7vzwKR`s7IJa?#$$EzW%9G6D#H|x9G->QcC|>B{V<~&!7-r@ILEf~1iCL?CEBD2 z%J>Yl59&h?Ntffip!~>&*}iA%MC)52S{O+BtKg}7VI7<={p40+d++l|xne;F4hUGn z^B0KCdc^6^{K~4RK1V8TG9bkG14^hj`7b3a!Js#^Y zr%xQYBZ60$1DsCaXT}$F#LipimS2i)zG3*w@6@PHWR5<%GG3(m$@2xzyxDP|+g1j) zPX3om=fbZrM$=Mx)rROgW!a~5Vmb?-G}6u%gKIJ5tp zFOE)9JjWnZAwY1^Wn=$up*};9E4w68lVFnYMm~HM2FE6iE3hkDG!RV>jUDRTf zMSAbo2*ZN)={>#}aN$dJHGx2wK2?r+x@^7Vld<{}@>sN1GODNWU@GEW#rXN?hOGdv z(%_<^?k0TCfnGB)$=;S%OF^m33+*qf=EU4j%q4osxvXB48s!{G?|r-T)2&CVCB~i1 zh2iv01eE@9G1b-S8b+RK)L;6>$l5YaY}ID%aF+ltG#A{X$x8$CaE*Gt_)w|UrHd~W z=Gd;(^!`krm;D+kIM?Q@Bwc6@w@+RU8AM?7Aa95VQ<9a`h#x)YVO_)iTweU;p4F$)BCIW; zIG1uoA;)Z#Hd^P1>n|sLG3u4v=`<&HEX zy-u6kXY85fv=4jS&RryHh`um85yk$#hRa#N`aPs-wD3nyfvNGz1HS5P$jIhJK6NTtn?ZhqsjCdS|LOw-CTSHqX;lqZf45Fnv=3I_BWnkf_ z_eGYm(1gr@^trF%aQ~@I-jUb1e4KO7XrdVj6dc>(u>=NTz%%u&Ycf$anxehEU%gAi zqP@b0UA+J>9BH&vQmFZO7ALvT@bHSNxL>@ofj+ekTF zlB46Zj^`C>_oa|TmAj7PE3tr12Kasg`?hwp9nfVYC4;#>LbZCW$%DLY&iWFFRSJ{jq?21gK$t;5Q7G~Fgt+!2Y z85esr^I2kOwKL7hfSJicVU>hzqWmU3v9iDNjyM|yH_v^xjm9>pTKgJTS{Y0I`VCDB zW}$e{^WF7?*mm--w75(km;qt-@wixe??SXTwf+EdVMI!&0c42Ae}fF0a@(#BKmK^$ zLmu42t6@xK;oO^@#FD$?$1ljv>fsoVjy1no`B?yG!(``Kv)0Y-WNPi%C^q$-71YaD zAc=bmBG8ZOT@=}h4j|8ujS>rZbQXE?fLYA`d2^z#zv#tYo6HLu%^TEJY6^0_WXQBH67;Ei3tjahVLv}3Z0KQV$gwg0 z)zXco@vs{(jCUI-VZ0DtQ!T?jVceciF3zoM3)`d|+I=G(omgD%Q}X!n6qHER1g#V; zc&48=P_f+~(Yc`8w2{zd;GnBOC$`7PLfg)`7c*%;WiP4eIQsV8d834;Rq{sQ_7bO) z93@h(`1(S?amU|v;=h(_UP)}y+c%!)-?`7QWn(>F-{IsCPK*`6GBx^_`zKlg_6lzt zg|BDKtOP;)>fE))RN{-3tpPdZ=!m0^Jjn0pu{uaiQToj0!4jUhstYBbb;f~1aMU8j zKhaN=kEEv*?gE_BHgoh=@r~T?P)eA83_ST`3bGJsmvcS$dn{;bc&aUehkGk`7f`-0 zrbh$bO9?~DQ@Q#Cw&D@NC?jCn(UGKUFY)O4EJPmyCa*fhNvDw#^S(r1p1dT$Y7IP- zNC`yQSP#Vy{1Jws0cDUv`HG6T5GA&F)JJ-X%}4o*Sz<#sQsZ=(+rJ&P0QHus6W3Or z@S5m@X8Y%<{gF)g+Bc&ktw9RYO~JZU{Ql)Ho^eKg%g70N7s^$L=nmq?F#F66PMr>H--M&%k^{NcQg4au+`tmMoi5T#u> zX}$=$N$GrFzHn z%3#na2ek|B8F5={KI~{wI=?Cg@Wm$eP1CX_b@l{}8wW}<(0 z<;1fx7_-oG>jXNAobB0qZW)H_i(HzB5ElR}1@IZ7HpfY>KZ-2x_K~;U`*nABOY*`l2xofp1T8hF=ho#Jjcbb4MFnM z(l?o_B1w8drrwXD#i$?tq;V3yVNFJ^-^iza(c!O&v7H*nHTrfun>pwezV5z1*~~x} zz~>y_Z#3uEm<~k`2@5}9(l6^@U?-Sx)8(c8GzX9e3GXUn*jfw3N?`Z4LaUISwWfD zl8Cdu=@|EX4EVFY5ftMtVNn-XOxTNmD@CLitxjZc7olyu%zHNuzmNjnL=FAEsl{st zFXhi@X{HGGqFeoWnWznH-5oB}=Naw+D`0{d2yP(j+Rhk4@c|e7DEA^TGx{piWM-y* zw3~d5vh_#ZR#j#)-sDa=Rcr*}ATGel%_shav}?Y{hi|_b>qXK{+}T<{5lgcC0-akS zKOXo<3%nV-%AJm3=CTZ$dEveNoX!A;-b$g~v9`!sC86nq7S3?t8^l=QAoC!ySN)glbdc=_Vz&Sg#>E0XS-#WE-Zw zsB%HRvw%}bNm$rRSZp^0P#Qn#8Y$$I&X31zbGfsdggfHbH);MB%7Y zY46;I#>RO(%q34*>&YGJFR~}PhVS&vY!6|F`gB@q|Na{Iy>?0?SkeWM zq5eMtgYGZ}_U>dW1bf^i^Mi^oUbKnrI1`W07@j)9p*^?KK#=4-$yc0Vw~Z)HQ1De2pRQG(~3(J9X+DZ zA3062ly-%$Z=5qj)>7;`}UsG=ETuZ)LN?k!I&IDgt+JXfIm})jBr| zpGfnO>;EPH`vNf1;h}-H-!ZR^yGMGWX65CVZr_&w#kRDj=r>=l+WDp7Ht=T# OK5L6x=JnUSlm825`x|rs diff --git a/tests/ragger/snapshots/stax/domain_name_verbose_True/00003.png b/tests/ragger/snapshots/stax/domain_name_verbose_True/00003.png index 50df3498127a21582b14f2b69375b5f885b7217f..299779759a1189fd5b709b27ed08b2435a5027d2 100644 GIT binary patch literal 9538 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 literal 9348 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�lMY za7}u1=toil%>n=}{y~vG?t2b;l%2=y#vo0^P3CU=p^gP*0bY&H_Km}`_8O^7W=(Lz z>LH32HqMsZ#9g8%82w-Y1yDd1HZ59Y&TbrlE-fd30OZ2tv5U%)H@%65hnFouxvbD! zR-80RpnX0YTX!coDCE@*S1#g#b3;W%%+v<<5ZJh1{GczLTjha0Br@day@XZJrU--wHuoVBq#H=KR6z6nhE_TYvq)h{%6 zXM^493klsk&{d-+C6W^b#C4S^i;yN|UPL8p{ejLB{05VfO7dXlS(d$6D^Z&O&`*Pg z#q9c7_0}skKHLa{6|HypDpd^Nb;+h=P7S28qCz1N2vOjtd&afM=46gcs)_Xx7`hx! zX0zGFhdg1WbOa3TM;kfrdEyv7y=$tF3g(NsZ>29II>s;As?126gI>t7M16WQ#$M5| z7{;VPx@1xlM$osMC!WW>AHVeep5yuP-mqY=^f_QDtc4RNzc_tyN?kiMJgJgtQE-*& zpKs<}dO19Y0e*Y-unE^!nl$6&woF{=w3u8F?FoASC`L2fbzSJ#O_Y^} z%TGZ}@a#t+Oz)l6uK{&Ex+n_H;{AAeWlNv{i$KYFOytvWWlQP%^c`dDrHo9I&fiH! z^`9-e`dFfq&fj<|=N%BO8s~U_4LoltSFlX6wgrnon6HSO>-3m=;`>m{^i*GZga#lm6Ro13r6OjWk8V}<3qfeAz7=jTbIvsWe;bhzKo5^1~LjC|lv1R*HPl$o%nuU{^eb0P+a z3f4z#ZA;R+IC`Aq(A*UZZS}ckOWez=zn0)=OkK_LVF%At&xw1g$MGw_=P=fqr|R-G zmrJU*6%v7+&H7TJ?KOU8i1gLYb>&&zx`?v6nbU39h5+Ot=pE-$2A8hrglcFucV$>pCef;F&3m^vkzAGnPweT|==)cr#C_zQt_uq2aHYs59Mb5%-n#%=7X*C>Jif zdfXjBo$Xo-gi5E9h?ewX#KW+MrfGG&Scn-9D?88=-B(u=bkrg2_6=w1obH%XdJ^#& zUEBH%YCY2?d6c!ewUtBNQYCfiN@}v%X0Zp-Yald%?9%dI^C>=xzb#nM;GwUytK8FjTB08}3W=W7!LowJ3ku(ug4RE3C16S9Ky7w> z^>()b;%9F&YR2PNoJ4!#q)y^V4w8n~rK?4VS};%a+n;H-iVjJ6w-1!F*C3@N!nesI zQMI5Dm@#?#%o~LquMjx{48@0{ZDN}94V8LRoTB8lF{i!^Z=3(p3`GCo@c8zQX2fXm zuLyaZme%|yrD-`yX{GjCy0eGQ0Sx6rNS$0K-jC}Rz3ezNnBU!?LGYO~ISV+s(D5!G zZ2Q#H!Z)hb`7PZ;DDnK8opfxQ{g*%4T$?wNpkynxcl2wgpvv;qI@G%Ygf)- z&a9HGq)2S1lH0ZbN$j2>NA4tG_n{$OH4rl{TQHsQAbT5&m#+bfz*nYfL7<86uS) zG&(Jj5nrWJ@K(tRem}Ry4Wr@xr#2;}Q%yLB zVkDw%VgndS#@6%iGI}0Y)Y#naf#n-nf z>tdC1V8xUAB|gLNO_H!AKFY7{o?}`?rLic&k<}>j)|TVj63B35vDyCJyxf=PRZ^dB zKPdYNIYJ-TLwJDu6o5f7A9@L?j3dUv%3O6}OepFV@}uk7BWfR5;8uErK8h znjZzw)*5l=FSHdXu;)LW_52s;#*p8z2#_wTbe z%Nhkt2;TMd&*HdNM^{^U)50iOoPk`*bc>K2- z!Keme#h0J4myh3es2aih#oMRJ11BBDyR*FwHdaN(rA*$kt-t$QwSd99RF6K?5z@i< zg5Ihc$VR+dS4}s^X=?P=Bwe?;I1<%e(W#8l8f}b^IWXfC*?qsF!vz~OKsknKSg4%) z+V?Z|hqCb`KGpIR4Nr?2F0xNPfT{Srf~t*|CWY$BFw_F1Dh=0&hTImE*(hGx*gE{M zu&r%9RjV1djX1~$L(iz@bV^9Hhw_F?$Gh9wVp&;nM?Yc0t; z6B3m<&b;2TxUio6n3!J$7bFHkzotg82gOW%1{Iy;a1zYo$Z%adjoRP4Cs>dukBd0= zqj*0W!{zDM^^;sJZY)Qysy5ez0vg?qacPe!5mn9^mEktrv~b1q zcFkObo=jLsQ$QFi4mns-jm=+~C=_TkmJ?{VqjvS_CX~u!1~^bGNQe*Po%nIl!O5q-jgk%70)6Nl8Y{+cxWk%j>>)ZEnBKe&MhrG z%#3UWay04wL*&)BRk!@ZJnf3SWSCJ|De+BQiX=Uf`{rz-J{tB_{39- z|I+U`H%!1*Zf7w=<#3dZn`>cw6ovH-n<(pjMtwS0x#?>c%_@{}ovrrDjd`D@%LYxg zHPD6e*vP1;;qBRL1ScimH{P=p`-+B`;aU5PdLSFa(j3mXX&9bcCSgQn)%T0{`z(g& zt@kFzD7wngE7N~=5tDPsUbT)tLUU)?QX&c3{)d8gv9lieh5RRu6WRVVXEQ{vqFbVs z`)bzDtzLK2ca4XSqETU1Xc^C0yC+hvlTtKlQn91vQ$GnPG*2t;Pq#)XkOJ^hhx;vh z3l%8SGjAMwhRLRBZ~O(1y5Rj%>Fd|ITDaR|4!L0}ZXorsGlM4pkkvyW8hoWSm;)Rp zolXZ*u?@Wo>|wKtLG!piZ1{%2Exmk7BPSaR( z8$IKo#wKj#{8#N3$9_}y-fp!?kB~zz3Xf5$rez;UnULEDlxMB(Zc>hwH+&Pdv|vl9 ziz3W{6BaX!ki~Tyxjwwq(^kyv6?c?7W3GKb1^1&ZQ-u*R?G&PegO8>cF&z$D^yfmSR!#oHC zw7`kVMdcBBf%I{`CQ?{2@g%Z5U``SgfK8+sp z7()=6R*qw88w6>DIu%3`Z4eRRxvl5B*7q;?em~Dz&ska554p4MeO>py_TJZizwTt- zcD9!}cKVo*kdTbS&Feo42?_ryBqZ{?qzG`u+@-fpNa#$k!*!cGk6tpV%onvc32Cr# zoR;v;d!*ZAKG^s}_DQRQU^QZpJRaHLQ+$=*P&mZ){y{}4n12^VoVtic{q(|Or zNrJ)$m|<*AQstTBGh!)e_FMcpi#coqBi?-Sv6&r z_9G-?;O*)B-prI1HY9i8t$#lLc00&XEo$<1?xmA-kpS8iaXFEFNkFj79VzpL!5i{OP?0MrjZe9n)QtM zvpMDxl+4Zk04ouxwyq>5a0?n*g~mlXYsXt-^N8pA*u|+@XIO1U8Wh*B#zHm9sR8Cx zZ@$24f&AMA*WQI}JS^n^1q^Zhr@b9UI zOD@uMAQ=*uKB`)kYC5>P!<2g5YggN|s#fCrf<1$+%_=8+eSL#GKP}|}0WvCQ=Ssl> zk?DGT*_PDug5FKZFfvV$6^pCDxlP9kwzh)i^`2=CX9?fik<$O9+V&K7|3-jklnSLu zr^wM&As}BY*mD`HKIR>?9$@LJ5S1-!;7WLV&!Irf#&5rou^VaHb>%v0C6x~g`SVGr zXpe4{18I{NL@e8RM(^&sBSMW{8a10xI204+oN^-+!+VCPsg%v6W;pMIdL1bSCWKgG$__9 zuaM2}?L6W5F(d8$5Mm9;Osh&bxP(boi5MYKF%rRwnUsFKAw^U)hiHNRKMz}FDY$EibydUx}eX3PUYGhCWj@BOARSz z`>TioDYSUTRbeb#X}8~neDd(CYqT0PSVh#>#t$ZnQcmy97cSFiZcbTsJ)U}QAqB{f z@PP2=scb$=ng7^c7BVyHXY^N6sQQM6h*X(A`(dQ@E5R;3v(npG>4RilsCR7w* z{@_)E97#XP5cIOD8nS*MMjaGhgOZT}aAAoMb?<(Q66hTYHkHv)7R+^URj_kyhnHzO z97s5O76K`$4pfW_Swo2LGv_H&Q?XEmv=S4^CuSYXRTuthHCz&XqVY@B{qTdP3$I25 zJn)1RA##K4+2awSrWed8&^(2E-#$FPm-`)jaCZT_r>)hNQOf3%S1wo!@Qh{bS6~VGmC$``Qz!OC0OihPf z@n%P7(xiZfGdS%~Al*2^6|~6sdR+@!r%MqwkT}a$k0Lcaff1tB0NsGU+>EgY@AT7n zOb)n{mZ!Rj6p0R0A`xky{BK3zESkI}2o*yCN3FVE=Cus0h5w=q3HSy}gUwugoRH^q zCtJd$4Hw|KYfa0NYlM*B1#(0gtkZS1bCDtY!E8myb`4Vz>F>61TmoKn-G#%DEi$>lnwzfHv zUu^L4*1igMMI&G1`|i4b9je4NzD|hUeVkc!f8+7D{e&G$zzN-*$3UGt((sR5p$_|+ zuUgkaGG=^H&F=S4WIO+yql&J}hPi;bt$UVtoK`@j>Gg8u88N;N6zUjau}X1;ayC>a-3$&PAT)-tz$-#B3NQvpl_C zZ0KasaRsHax7mw4-C1Uk7r^m*;HtnX7|W=jQ~RR!AL)N~pNxgCxormn+6gIw0%r*L zh$Eb1*@&!8IK|M3WEkW*C&0!G%cC|&At{*9!#Z=rV|34Tx#)v{r={4xSY6K{-_Q8I z8KI>^Ey2GG^vl(^EKNQ4Vx3l5S&1ql#f{jPVwNSb0hm!bsk(Ak4Rk}nE;yIYnFSBP zi0Bf6p){eV5w6hFblEe08}arf4|!*j6X+S7p&D0#vZ@?o2Mxi_J6ttRN4Op(`Y3(} zHu1h_*tq-c^1p9#Yik>iCz$qxww@tv7@{ezXk$=sWtOP7W2;T*zFw*`)xWrPc38rD zY+{?o;{j*0#Pgm?e!sP%dj6Z*T5CC=nw6+8upcaYR-ES)>K^L zD$t3E#ds7BN_R#RUut7_iD3nr%Vr6bOYIHmu?-C;-#5nv>eeg^#U8m)0=|;<);ORK z&G5BeU0NdeFqx6j9F-?rT8)*-^B|x=1%pvgp!=oBcQrEd^G|d-uAD!gD2FSlYUs7o z6s;quL}ISNDq2?Bk5LWK)b|EXZt@VUdskJ$%AkL7>2qd7GgG{iJGlo#rSWL$$3gt! zY&0%4UK0WoxG>mFXEn$2+0(Q-fNQI{IG!XQ?m4pYlS_vA{(O%)=d4Q0E`6c?N?Lu`#F;M72iGZP{E z=TlmQFXyjM#fBw1UOgBkFRz=bqVBEudgs^#*YBM>Sgz)AZRW5tPZmNDcY6-bI?zQ7 z^aX2jbCnU}J?p2{XX`Fc?>O(z1ML@`TKZIIUMWTVUlRX}e|+%2I0lBSn{)=eFJ@K2 zDY$3n9lndE@yd*xqD@s2Y1ZY=O*&H8>wfS*KqF=;C(~g{>DIR^@-U%^G;Y!X-9rFQ zRd!cMqsPH1fDkQ!=4zj5#sXSQ84?REBVEioi)t-;c`X*Io=?<}Yz6Uo9oEA$H(rN6 zcmVnL6u?)olSj2^+zEOcJuXTG|K>Wn3H4VHB&O%!7@T4Z^a5j}t4>t->ZNtGHt5pO z+HB|COo?(wObY|t#n3xqRR81UtSS;`Dq^7>j-#=ie*C@|899-qCk+r9pR`buSvw{Y zH+agz5s(`W1w5zP{q@jN37be%>$sPev2oVf1iXKI_2)E@*ZM+lp{HX7oq<)&uTJ0k z3DD-BA<|C z&%$Wqz{qXF;%)NQTE{v!0oQ_Y=>yb7nN>*j&@EkLni(ap;Wi=uRP>1vPOqU8)c}sC zb;7+B>}u$BfH(t$bz8_EX8NTV00GF`o*xybZM$&80=2%I8{w)hWL23~PL$_$_YcnI z6RSO|8}dP3judP^8y9=3ZJ-r2hUmt*rm}R97u#IR*VcH6IwPN`$ndn&(<8+s~E|K(oggPF1BS>r97F`pHa&Uu<|g_E9sj4-!{R)!Hzv=Y=?!Vu<>=jzMMWYAWjwRFhpV^BE1Zmqbe{s7m%|W?3MJOWR^Y6R=YRC z4m1W%!IopoWtQSw%CZpMfcQX*)W>(5xs&8Egj*|KtnKgBw(&%7@>WdU24KF|Z1w>I zi*MM7$Z_TtonlOvto*?w_pZM)m?+tgGmUclbVsPB&RM=q{rC}s>r3A{Zc(sbg1Lbq zEduXkdF7z=pTZ%Rl*Fb-r001$BM;9u|J53kaBK99W5kWhPLuhmAfgLW;`h0NTOLBh zU_gflUr6O`4|ag4Z;otbo6k6-i2Xg4CQi{{wXys4a4Ct>r@8>}NyaxZ;_;THHK4a@Alzp_5W_x>D8nh2}7|hw^TnCG`3T zxizL*?KjQgZ;#ruJ7O32JKlxg0hDj`XIjvBniv3V;!n}IZ6E`>?O_wy30JoJ_|6q^ zBf!`xAmVif%=Dl`tcEn4cP4Ve(qM;T#R&Mxf5>*c9w#$i5mZ81NQ%7TXtMSLOldCc zG5pi<;}~|ta~`zn!k5?|CN{JuqJ5ITdu^A3r=#Z4Dr6smM^jY&4bDP=)9Y21>fj~q4#K@UBy4|(^lDyV<&*X! z&YQ5KE4^=z?u5A#{@;O?CG`nTR@I|eeW8VZG1tYC{ySv}Px()@T)%N~hc0BhYb?yCf zACxXfn&u=ar^71fHnR1Q*0I4>kcT3o;*c0^fhV{E+)>>9FI;0RP;i^kvXG|V=sc73 zJMOV4HnfR+(y`yCY1#16_P7ga^0|Q%39g+S5rF$bOg7DVl^$Ek<|7`Rw2K0w_v8+P z!HDnEf%?gcbyDCXXTR8Q5c*WgS#4r@hEDKgBPWAtaX;oTAHf@;6w_uklro$;B5Bj^TbPX`KQTq0RLzmEhJ8Z04?-`JTc1MU7oy= znQ1|fR3Um6&PvB7aKD4`Q~;}trT>CseEz!AUx``$`mlvcDJM~!!|T*KDOa+p#sNPa zu7C5ykLfUXcR;p4*B85a7|EK3qTOh?sgNPa$M=Zm+W4Sz16IXjY?Go!64mrSuF)b_+)hjl1^_BYS+!cYaf zh}&-Zk)&4RNW3q|_4nu>0Q7cvhx`uK~ToEiZ_6g2Lt^+Ad_B zCC&48b{=he`Pai=aN_%{s$U1F8JVDew1YJ&YV{`4 zD)IkkjemXrlqxK*wAx=R^9P5wKE2IcoJR-layT3YBMeW=zY+~t{3*KB6F{wpuQ4(P zO>Ti6yr>U*+ZFe1#{#m=7m&$hB9XYD=F@U$v*ms1aU%}uz*&4c0759vjDl>J&YntJ z$a`H|y9VrzPSO556cOe$$`{bSU5~5qaR2HJ+Xnh8agpz) zM}z z+2s8?V^gbVs;E)mz=!Yqw;V?utql6I-l}_gD+zBc9UnhG<)&kvcK2n(gtD|5eb4tW zqD*c)wNiF^Te%I8rHGq$uAA$fnxgEd1G}NduionAEEQu#_0&_gNTZhZfbee^3b7WF t?3LebPCl(Ge&lX-`u{(@J9Hp~f3I=GQ7Ekt_~V6;gPrsB#%q30{tMKtzH|Tp literal 8435 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 OK5L6x=JnUSlm825`x|rs diff --git a/tests/ragger/snapshots/stax/domain_name_wrong_addr/00002.png b/tests/ragger/snapshots/stax/domain_name_wrong_addr/00002.png index 2d6b095b8b7856ce0c19502a1fbd21cfb09c22a7..7f634cc4a8e9160c710a1271dffe84a1e4208ac9 100644 GIT binary patch literal 9538 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 literal 9348 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 Hr Date: Wed, 5 Jul 2023 18:08:39 +0200 Subject: [PATCH 59/85] Now properly uses the settings use case --- src_nbgl/ui_settings.c | 2 +- tests/ragger/app/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src_nbgl/ui_settings.c b/src_nbgl/ui_settings.c index b8c81eb..9a0ca33 100644 --- a/src_nbgl/ui_settings.c +++ b/src_nbgl/ui_settings.c @@ -116,5 +116,5 @@ static void controlsCallback(int token, uint8_t index) { } void ui_menu_settings(void) { - nbgl_useCaseSettings(APPNAME " settings", 0, 3, true, ui_idle, navCallback, controlsCallback); + nbgl_useCaseSettings(APPNAME " settings", 0, 3, false, ui_idle, navCallback, controlsCallback); } diff --git a/tests/ragger/app/settings.py b/tests/ragger/app/settings.py index 225910c..ec6bf78 100644 --- a/tests/ragger/app/settings.py +++ b/tests/ragger/app/settings.py @@ -59,5 +59,5 @@ def settings_toggle(fw: Firmware, nav: Navigator, to_toggle: list[SettingID]): moves += [NavInsID.USE_CASE_SETTINGS_NEXT] if setting in to_toggle: moves += [NavIns(NavInsID.TOUCH, get_setting_position(fw.device, setting))] - moves += [NavInsID.EXIT_HEADER_TAP] + moves += [NavInsID.USE_CASE_SETTINGS_MULTI_PAGE_EXIT] nav.navigate(moves, screen_change_before_first_instruction=False) From 04c9e890e599ba9731a73f753359e05916be8fa0 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 6 Jul 2023 16:02:40 +0200 Subject: [PATCH 60/85] Renamed the stax shared buffer --- src_nbgl/ui_approve_tx.c | 22 +++++++++++----------- src_nbgl/ui_confirm_parameter_selector.c | 23 ++++++++++++++--------- src_nbgl/ui_idle.c | 6 +++--- src_nbgl/ui_nbgl.h | 2 +- src_nbgl/ui_sign_message.c | 8 ++++---- 5 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src_nbgl/ui_approve_tx.c b/src_nbgl/ui_approve_tx.c index 93fb826..3722d8c 100644 --- a/src_nbgl/ui_approve_tx.c +++ b/src_nbgl/ui_approve_tx.c @@ -229,7 +229,7 @@ static void reviewContinueCommon(void) { useCaseTagValueList.smallCaseForValue = false; useCaseTagValueList.wrapping = false; infoLongPress.icon = get_tx_icon(); - infoLongPress.text = tx_approval_context.fromPlugin ? staxSharedBuffer : SIGN(TEXT_TX); + infoLongPress.text = tx_approval_context.fromPlugin ? g_stax_shared_buffer : SIGN(TEXT_TX); infoLongPress.longPressText = SIGN_BUTTON; nbgl_useCaseStaticReview(&useCaseTagValueList, &infoLongPress, REJECT(TEXT_TX), reviewChoice); } @@ -239,11 +239,11 @@ static void prepare_sign_text(void) { uint8_t sign_length = strlen("Sign"); uint8_t review_length = strlen("Review"); - memmove(staxSharedBuffer, "Sign", sign_length); - memmove(staxSharedBuffer + sign_length, - staxSharedBuffer + review_length, - strlen(staxSharedBuffer) - review_length + 1); - strlcat(staxSharedBuffer, "?", sizeof(staxSharedBuffer)); + memmove(g_stax_shared_buffer, "Sign", sign_length); + memmove(g_stax_shared_buffer + sign_length, + g_stax_shared_buffer + review_length, + strlen(g_stax_shared_buffer) - review_length + 1); + strlcat(g_stax_shared_buffer, "?", sizeof(g_stax_shared_buffer)); } // Force operation to be lowercase @@ -264,20 +264,20 @@ static void buildFirstPage(void) { get_lowercase_operation(op_name, sizeof(op_name)); if (pluginType == EXTERNAL) { - snprintf(staxSharedBuffer, - sizeof(staxSharedBuffer), + snprintf(g_stax_shared_buffer, + sizeof(g_stax_shared_buffer), "Review transaction\nto %s\non %s", op_name, strings.common.fullAddress); } else { - snprintf(staxSharedBuffer, - sizeof(staxSharedBuffer), + snprintf(g_stax_shared_buffer, + sizeof(g_stax_shared_buffer), "Review transaction\nto %s\n%s", op_name, strings.common.fullAddress); } nbgl_useCaseReviewStart(get_tx_icon(), - staxSharedBuffer, + g_stax_shared_buffer, NULL, REJECT(TEXT_TX), reviewContinue, diff --git a/src_nbgl/ui_confirm_parameter_selector.c b/src_nbgl/ui_confirm_parameter_selector.c index 657b3b6..80418e1 100644 --- a/src_nbgl/ui_confirm_parameter_selector.c +++ b/src_nbgl/ui_confirm_parameter_selector.c @@ -32,12 +32,12 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { content->tagValueList.nbPairs = 1; content->tagValueList.pairs = (nbgl_layoutTagValue_t *) &pair; } else if (page == 1) { - snprintf(staxSharedBuffer, - sizeof(staxSharedBuffer), + snprintf(g_stax_shared_buffer, + sizeof(g_stax_shared_buffer), "Confirm %s", (confirm_type == PARAMETER_CONFIRMATION) ? "parameter" : "selector"); content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(true); - content->infoLongPress.text = staxSharedBuffer; + content->infoLongPress.text = g_stax_shared_buffer; content->infoLongPress.longPressText = "Hold to confirm"; } else { return false; @@ -47,20 +47,25 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { } static void reviewContinue(void) { - snprintf(staxSharedBuffer, - sizeof(staxSharedBuffer), + snprintf(g_stax_shared_buffer, + sizeof(g_stax_shared_buffer), "Reject %s", (confirm_type == PARAMETER_CONFIRMATION) ? "parameter" : "selector"); - nbgl_useCaseRegularReview(0, 2, staxSharedBuffer, NULL, displayTransactionPage, reviewChoice); + nbgl_useCaseRegularReview(0, + 2, + g_stax_shared_buffer, + NULL, + displayTransactionPage, + reviewChoice); } static void buildScreen(void) { - snprintf(staxSharedBuffer, - sizeof(staxSharedBuffer), + snprintf(g_stax_shared_buffer, + sizeof(g_stax_shared_buffer), "Verify %s", (confirm_type == PARAMETER_CONFIRMATION) ? "parameter" : "selector"); nbgl_useCaseReviewStart(get_app_icon(true), - staxSharedBuffer, + g_stax_shared_buffer, NULL, REJECT_BUTTON, reviewContinue, diff --git a/src_nbgl/ui_idle.c b/src_nbgl/ui_idle.c index ee708d5..faa47ca 100644 --- a/src_nbgl/ui_idle.c +++ b/src_nbgl/ui_idle.c @@ -5,7 +5,7 @@ #include "glyphs.h" #include "network.h" -char staxSharedBuffer[SHARED_BUFFER_SIZE] = {0}; +char g_stax_shared_buffer[SHARED_BUFFER_SIZE] = {0}; nbgl_page_t *pageContext; #define FORMAT_PLUGIN "This app enables clear\nsigning transactions for\nthe %s dApp." @@ -46,8 +46,8 @@ void ui_idle(void) { app_name = caller_app->name; if (caller_app->type == CALLER_TYPE_PLUGIN) { - snprintf(staxSharedBuffer, sizeof(staxSharedBuffer), FORMAT_PLUGIN, app_name); - tagline = staxSharedBuffer; + snprintf(g_stax_shared_buffer, sizeof(g_stax_shared_buffer), FORMAT_PLUGIN, app_name); + tagline = g_stax_shared_buffer; } } else { // Ethereum app uint64_t mainnet_chain_id = ETHEREUM_MAINNET_CHAINID; diff --git a/src_nbgl/ui_nbgl.h b/src_nbgl/ui_nbgl.h index d7db175..921d604 100644 --- a/src_nbgl/ui_nbgl.h +++ b/src_nbgl/ui_nbgl.h @@ -6,7 +6,7 @@ #include #define SHARED_BUFFER_SIZE SHARED_CTX_FIELD_1_SIZE -extern char staxSharedBuffer[SHARED_BUFFER_SIZE]; +extern char g_stax_shared_buffer[SHARED_BUFFER_SIZE]; extern nbgl_page_t* pageContext; diff --git a/src_nbgl/ui_sign_message.c b/src_nbgl/ui_sign_message.c index 76b86b2..b785745 100644 --- a/src_nbgl/ui_sign_message.c +++ b/src_nbgl/ui_sign_message.c @@ -40,18 +40,18 @@ static bool display_message(nbgl_pageContent_t *content) { bool reached; if (g_action == UI_191_ACTION_ADVANCE_IN_MESSAGE) { - strncpy(staxSharedBuffer + eip191MessageIdx, + strncpy(g_stax_shared_buffer + eip191MessageIdx, strings.tmp.tmp + stringsTmpTmpIdx, SHARED_BUFFER_SIZE - eip191MessageIdx); reached = nbgl_getTextMaxLenInNbLines(BAGL_FONT_INTER_MEDIUM_32px, - (char *) staxSharedBuffer, + (char *) g_stax_shared_buffer, SCREEN_WIDTH - (2 * BORDER_MARGIN), 9, &len); stringsTmpTmpIdx = len - eip191MessageIdx; eip191MessageIdx = len; - staxSharedBuffer[eip191MessageIdx] = '\0'; + g_stax_shared_buffer[eip191MessageIdx] = '\0'; if (!reached && eip191MessageIdx < SHARED_BUFFER_SIZE) { stringsTmpTmpIdx = 0; @@ -65,7 +65,7 @@ static bool display_message(nbgl_pageContent_t *content) { } } - pair.value = staxSharedBuffer; + pair.value = g_stax_shared_buffer; pair.item = "Message"; content->type = TAG_VALUE_LIST; content->tagValueList.nbPairs = 1; From f3075b712434ac31830bf5576cfca6ff4e4b4a2a Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 18 Jul 2023 10:39:54 +0200 Subject: [PATCH 61/85] Moved message signing rejection cancellation from nbgl_useCaseChoice to nbgl_useCaseConfirm --- src_nbgl/ui_message_signing.c | 22 +++++++--------------- src_nbgl/ui_message_signing.h | 1 - src_nbgl/ui_sign_712.c | 17 ----------------- src_nbgl/ui_sign_712_v0.c | 9 --------- src_nbgl/ui_sign_message.c | 18 +----------------- 5 files changed, 8 insertions(+), 59 deletions(-) diff --git a/src_nbgl/ui_message_signing.c b/src_nbgl/ui_message_signing.c index 582426b..36a452c 100644 --- a/src_nbgl/ui_message_signing.c +++ b/src_nbgl/ui_message_signing.c @@ -4,25 +4,19 @@ #include "ui_message_signing.h" #include "glyphs.h" -static void (*g_resume_func)(void) = NULL; static void (*g_approved_func)(void) = NULL; static void (*g_rejected_func)(void) = NULL; -static void ui_message_rejection_handler(bool confirm) { - if (confirm) { - nbgl_useCaseStatus("Message signing\ncancelled", false, g_rejected_func); - } else { - (*g_resume_func)(); - } +static void ui_message_rejection_handler() { + nbgl_useCaseStatus("Message signing\ncancelled", false, g_rejected_func); } static void ui_message_confirm_rejection(void) { - nbgl_useCaseChoice(&C_warning64px, - REJECT_QUESTION(TEXT_MESSAGE), - NULL, - REJECT_CONFIRM_BUTTON, - RESUME(TEXT_MESSAGE), - ui_message_rejection_handler); + nbgl_useCaseConfirm(REJECT_QUESTION(TEXT_MESSAGE), + NULL, + REJECT_CONFIRM_BUTTON, + RESUME(TEXT_MESSAGE), + ui_message_rejection_handler); } void ui_message_review_choice(bool confirm) { @@ -35,10 +29,8 @@ void ui_message_review_choice(bool confirm) { void ui_message_start(const char *title, void (*start_func)(void), - void (*resume_func)(void), void (*approved_func)(void), void (*rejected_func)(void)) { - g_resume_func = resume_func; g_approved_func = approved_func; g_rejected_func = rejected_func; nbgl_useCaseReviewStart(&C_Message_64px, diff --git a/src_nbgl/ui_message_signing.h b/src_nbgl/ui_message_signing.h index 6946736..008f574 100644 --- a/src_nbgl/ui_message_signing.h +++ b/src_nbgl/ui_message_signing.h @@ -11,7 +11,6 @@ void ui_message_review_choice(bool confirm); void ui_message_start(const char *title, void (*start_func)(void), - void (*resume_func)(void), void (*approved_func)(void), void (*rejected_func)(void)); diff --git a/src_nbgl/ui_sign_712.c b/src_nbgl/ui_sign_712.c index 032e312..d17a1d3 100644 --- a/src_nbgl/ui_sign_712.c +++ b/src_nbgl/ui_sign_712.c @@ -67,27 +67,10 @@ static void handle_display(nbgl_navCallback_t cb) { nbgl_useCaseRegularReview(0, 0, REJECT_BUTTON, NULL, cb, ui_message_review_choice); } -static void resume_review(void) { - switch (g_position) { - case UI_SIGNING_POSITION_START: - ui_712_start(); - break; - case UI_SIGNING_POSITION_REVIEW: - ui_712_switch_to_message(); - break; - case UI_SIGNING_POSITION_SIGN: - ui_712_switch_to_sign(); - break; - default: - return; // should not happen - } -} - void ui_712_start(void) { g_position = UI_SIGNING_POSITION_START; ui_message_start(TEXT_REVIEW_EIP712, &ui_712_switch_to_message, - &resume_review, &ui_message_712_approved, &ui_message_712_rejected); } diff --git a/src_nbgl/ui_sign_712_v0.c b/src_nbgl/ui_sign_712_v0.c index 8719f5d..bc82563 100644 --- a/src_nbgl/ui_sign_712_v0.c +++ b/src_nbgl/ui_sign_712_v0.c @@ -70,19 +70,10 @@ static void start_review(void) { display_review(); } -static void resume_review(void) { - if (g_position == UI_SIGNING_POSITION_START) { - ui_sign_712_v0(); - } else { - display_review(); - } -} - void ui_sign_712_v0(void) { g_position = UI_SIGNING_POSITION_START; ui_message_start(TEXT_REVIEW_EIP712, &start_review, - &resume_review, &ui_message_712_approved, &ui_message_712_rejected); } diff --git a/src_nbgl/ui_sign_message.c b/src_nbgl/ui_sign_message.c index b785745..4577fa6 100644 --- a/src_nbgl/ui_sign_message.c +++ b/src_nbgl/ui_sign_message.c @@ -120,18 +120,6 @@ static void continue_review(void) { nbgl_useCaseForwardOnlyReview(REJECT_BUTTON, NULL, nav_callback, ui_message_review_choice); } -static void resume_message(void) { - e_ui_191_action action_bak = g_action; - - if (g_position == UI_SIGNING_POSITION_START) { - ui_191_start(); - } else { - g_action = UI_191_ACTION_IDLE; - continue_review(); - g_action = action_bak; - } -} - void ui_191_start(void) { g_position = UI_SIGNING_POSITION_START; @@ -139,11 +127,7 @@ void ui_191_start(void) { eip191MessageIdx = 0; stringsTmpTmpIdx = 0; - ui_message_start(TEXT_REVIEW_EIP191, - &ui_191_switch_to_message, - &resume_message, - &sign_message, - &reject_message); + ui_message_start(TEXT_REVIEW_EIP191, &ui_191_switch_to_message, &sign_message, &reject_message); } void ui_191_switch_to_message(void) { From 6a04c14df01679b802501074fc67da5f924797cb Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Fri, 30 Jun 2023 13:42:56 +0200 Subject: [PATCH 62/85] Add back the call to ui_idle in case of EIP712 failure Was removed during the Stax porting --- src_features/signMessageEIP712/commands_712.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src_features/signMessageEIP712/commands_712.c b/src_features/signMessageEIP712/commands_712.c index 7810b93..a1cc45f 100644 --- a/src_features/signMessageEIP712/commands_712.c +++ b/src_features/signMessageEIP712/commands_712.c @@ -13,7 +13,8 @@ #include "schema_hash.h" #include "filtering.h" #include "common_712.h" -#include "ethUtils.h" // allzeroes +#include "ethUtils.h" // allzeroes +#include "common_ui.h" // ui_idle /** * Send the response to the previous APDU command @@ -38,6 +39,7 @@ void handle_eip712_return_code(bool success) { if (!success) { eip712_context_deinit(); + ui_idle(); } } From af8123ad4594ab82fbe6bb9c9b645d680d3ec482 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Fri, 30 Jun 2023 18:04:05 +0200 Subject: [PATCH 63/85] Fix improper handling of empty arrays in EIP712 messages --- src_features/signMessageEIP712/path.c | 34 +++++++++++++++++++++------ 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src_features/signMessageEIP712/path.c b/src_features/signMessageEIP712/path.c index ec95242..e678dd0 100644 --- a/src_features/signMessageEIP712/path.c +++ b/src_features/signMessageEIP712/path.c @@ -143,14 +143,18 @@ static cx_sha3_t *get_last_hash_ctx(void) { * Finalize the last hashing context * * @param[out] hash pointer to buffer where the hash will be stored + * @return whether there was anything hashed at this depth */ -static void finalize_hash_depth(uint8_t *hash) { +static bool finalize_hash_depth(uint8_t *hash) { const cx_sha3_t *hash_ctx; + size_t hashed_bytes; hash_ctx = get_last_hash_ctx(); + hashed_bytes = hash_ctx->blen; // finalize hash cx_hash((cx_hash_t *) hash_ctx, CX_LAST, NULL, 0, hash, KECCAK256_HASH_BYTESIZE); mem_dealloc(sizeof(*hash_ctx)); // remove hash context + return hashed_bytes > 0; } /** @@ -192,6 +196,7 @@ static bool push_new_hash_depth(bool init) { */ static bool path_depth_list_pop(void) { uint8_t hash[KECCAK256_HASH_BYTESIZE]; + bool to_feed; if (path_struct == NULL) { return false; @@ -201,9 +206,11 @@ static bool path_depth_list_pop(void) { } path_struct->depth_count -= 1; - finalize_hash_depth(hash); + to_feed = finalize_hash_depth(hash); if (path_struct->depth_count > 0) { - feed_last_hash_depth(hash); + if (to_feed) { + feed_last_hash_depth(hash); + } } else { switch (path_struct->root_type) { case ROOT_DOMAIN: @@ -261,7 +268,7 @@ static bool array_depth_list_pop(void) { return false; } - finalize_hash_depth(hash); + finalize_hash_depth(hash); // return value not checked on purpose feed_last_hash_depth(hash); path_struct->array_depth_count -= 1; @@ -421,6 +428,8 @@ bool path_new_array_depth(const uint8_t *const data, uint8_t length) { uint8_t total_count = 0; uint8_t pidx; bool is_custom; + uint8_t array_size; + uint8_t array_depth_count_bak; if (path_struct == NULL) { apdu_response_code = APDU_RESPONSE_CONDITION_NOT_SATISFIED; @@ -430,6 +439,8 @@ bool path_new_array_depth(const uint8_t *const data, uint8_t length) { return false; } + array_size = *data; + array_depth_count_bak = path_struct->array_depth_count; for (pidx = 0; pidx < path_struct->depth_count; ++pidx) { if ((field_ptr = get_nth_field(NULL, pidx + 1)) == NULL) { apdu_response_code = APDU_RESPONSE_CONDITION_NOT_SATISFIED; @@ -442,7 +453,7 @@ bool path_new_array_depth(const uint8_t *const data, uint8_t length) { } total_count += depth_count; if (total_count > path_struct->array_depth_count) { - if (!check_and_add_array_depth(depth, total_count, pidx, *data)) { + if (!check_and_add_array_depth(depth, total_count, pidx, array_size)) { return false; } break; @@ -463,9 +474,18 @@ bool path_new_array_depth(const uint8_t *const data, uint8_t length) { cx_sha3_t *hash_ctx = get_last_hash_ctx(); cx_sha3_t *old_ctx = hash_ctx - 1; - memcpy(hash_ctx, old_ctx, sizeof(*old_ctx)); + if (array_size > 0) { + memcpy(hash_ctx, old_ctx, sizeof(*old_ctx)); + } else { + cx_keccak_init(hash_ctx, 256); + } cx_keccak_init(old_ctx, 256); // init hash } + if (array_size == 0) { + do { + path_advance(); + } while (path_struct->array_depth_count != array_depth_count_bak); + } return true; } @@ -515,7 +535,7 @@ static bool path_advance_in_array(void) { if ((path_struct->array_depth_count > 0) && (arr_depth->path_index == (path_struct->depth_count - 1))) { - arr_depth->size -= 1; + if (arr_depth->size > 0) arr_depth->size -= 1; if (arr_depth->size == 0) { array_depth_list_pop(); end_reached = true; From 8541d69d339a06e2d4a4aa1ae02a29b781728abd Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Wed, 5 Jul 2023 17:08:20 +0200 Subject: [PATCH 64/85] Add new test case for EIP712 --- .../input_files/13-empty_arrays-data.json | 37 +++++++++++++++++++ .../eip712/input_files/13-empty_arrays.ini | 4 ++ 2 files changed, 41 insertions(+) create mode 100644 tests/ragger/eip712/input_files/13-empty_arrays-data.json create mode 100644 tests/ragger/eip712/input_files/13-empty_arrays.ini diff --git a/tests/ragger/eip712/input_files/13-empty_arrays-data.json b/tests/ragger/eip712/input_files/13-empty_arrays-data.json new file mode 100644 index 0000000..7a1f939 --- /dev/null +++ b/tests/ragger/eip712/input_files/13-empty_arrays-data.json @@ -0,0 +1,37 @@ +{ + "domain": { + "chainId": 5, + "name": "Empty Arrays", + "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC", + "version": "1" + }, + "message": { + "list1": [], + "list2": [], + "list3": [ + [ + "1", + "2" + ], + [], + [ + "3", + "4" + ] + ] + }, + "primaryType": "Struct", + "types": { + "EIP712Domain": [ + { "name": "name", "type": "string" }, + { "name": "version", "type": "string" }, + { "name": "chainId", "type": "uint256" }, + { "name": "verifyingContract", "type": "address" } + ], + "Struct": [ + { "name": "list1", "type": "EIP712Domain[]" }, + { "name": "list2", "type": "uint8[]" }, + { "name": "list3", "type": "string[][]" } + ] + } +} diff --git a/tests/ragger/eip712/input_files/13-empty_arrays.ini b/tests/ragger/eip712/input_files/13-empty_arrays.ini new file mode 100644 index 0000000..4784a48 --- /dev/null +++ b/tests/ragger/eip712/input_files/13-empty_arrays.ini @@ -0,0 +1,4 @@ +[signature] +v = 1b +r = 5d0635a868602e29366da6328f8fadf2d6a9b4e69ee7a65928e85ca56fb1b515 +s = 257364d6faaf5687edf90c3984f4240b0ce7b2dee55aa1f8f39c32d0d4d8c93d From 17968338d8f82b3bf9018d189fcf335ecca40337 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 6 Jul 2023 13:46:54 +0200 Subject: [PATCH 65/85] Removed EIP712 verbose display of inner struct names --- src_features/signMessageEIP712/path.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src_features/signMessageEIP712/path.c b/src_features/signMessageEIP712/path.c index e678dd0..621d11d 100644 --- a/src_features/signMessageEIP712/path.c +++ b/src_features/signMessageEIP712/path.c @@ -314,7 +314,10 @@ static bool path_update(void) { } feed_last_hash_depth(hash); - ui_712_queue_struct_to_review(); + // TODO: Find a better way to show inner structs in verbose mode when it might be + // an empty array of structs in which case we don't want to show it but the + // size is only known later + // ui_712_queue_struct_to_review(); path_depth_list_push(); } return true; From cace9d642161709b7d1f011e87b23d6898615bfa Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Tue, 18 Jul 2023 16:41:49 +0200 Subject: [PATCH 66/85] Fix Stax EIP712 context cleaning --- src_nbgl/ui_message_signing.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src_nbgl/ui_message_signing.c b/src_nbgl/ui_message_signing.c index 36a452c..51e1a7e 100644 --- a/src_nbgl/ui_message_signing.c +++ b/src_nbgl/ui_message_signing.c @@ -1,6 +1,6 @@ #include "ui_nbgl.h" #include "ui_signing.h" -#include "common_712.h" +#include "ui_logic.h" #include "ui_message_signing.h" #include "glyphs.h" @@ -42,9 +42,9 @@ void ui_message_start(const char *title, } void ui_message_712_approved(void) { - ui_712_approve_cb(); + ui_712_approve(); } void ui_message_712_rejected(void) { - ui_712_reject_cb(); + ui_712_reject(); } From 4ed2521a07f2b3bdb0c28140bd0742cf12d42d13 Mon Sep 17 00:00:00 2001 From: Victor Forgeoux <100780559+vforgeoux-ledger@users.noreply.github.com> Date: Tue, 27 Jun 2023 17:11:25 +0200 Subject: [PATCH 67/85] Update networks Added LUSKO and LUSKO Testnet : https://github.com/LedgerHQ/app-ethereum/pull/436 Added PulseChain : https://github.com/LedgerHQ/app-ethereum/pull/430 Added Neon Devnet : https://github.com/LedgerHQ/app-ethereum/pull/439 Adding Chiado and Renamed xDAI to Gnosis : https://github.com/LedgerHQ/app-ethereum/pull/422 Added Venidium : https://github.com/LedgerHQ/app-ethereum/pull/382 --- src_common/network.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src_common/network.c b/src_common/network.c index 9959ee4..0dcda7d 100644 --- a/src_common/network.c +++ b/src_common/network.c @@ -16,9 +16,11 @@ static const network_info_t NETWORK_MAPPING[] = { {.chain_id = 4, .name = "Rinkeby", .ticker = "ETH"}, {.chain_id = 5, .name = "Goerli", .ticker = "ETH"}, {.chain_id = 10, .name = "Optimism", .ticker = "ETH"}, - {.chain_id = 42, .name = "Kovan", .ticker = "ETH"}, + {.chain_id = 42, .name = "LUKSO", .ticker = "LYX"}, + {.chain_id = 4201, .name = "LUKSO Testnet", .ticker = "LYXt"}, {.chain_id = 56, .name = "BSC", .ticker = "BNB"}, - {.chain_id = 100, .name = "xDai", .ticker = "xDAI"}, + {.chain_id = 100, .name = "Gnosis", .ticker = "xDAI"}, + {.chain_id = 10200, .name = "Chiado", .ticker = "xDAI"}, {.chain_id = 137, .name = "Polygon", .ticker = "MATIC"}, {.chain_id = 250, .name = "Fantom", .ticker = "FTM"}, {.chain_id = 42161, .name = "Arbitrum", .ticker = "ETH"}, @@ -64,6 +66,9 @@ static const network_info_t NETWORK_MAPPING[] = { {.chain_id = 106, .name = "Velas EVM", .ticker = "VLX"}, {.chain_id = 288, .name = "Boba Network", .ticker = "ETH"}, {.chain_id = 39797, .name = "Energi", .ticker = "NRG"}, + {.chain_id = 369, .name = "PulseChain", .ticker = "PLS"}, + {.chain_id = 245022926, .name = "Neon EVM Devnet", .ticker = "NEON"}, + {.chain_id = 4919, .name = "Venidium", .ticker = "XVM"}, {.chain_id = 248, .name = "Oasys", .ticker = "OAS"}}; static const network_info_t *get_network_from_chain_id(const uint64_t *chain_id) { From 03d1be4025ba9fb8210fead513723671b6e1b1ee Mon Sep 17 00:00:00 2001 From: Victor Forgeoux <100780559+vforgeoux-ledger@users.noreply.github.com> Date: Mon, 3 Jul 2023 14:29:05 +0200 Subject: [PATCH 68/85] Add Telos network Add Telos EVM Mainnet network (https://chainlist.org/chain/40) --- src_common/network.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src_common/network.c b/src_common/network.c index 0dcda7d..12dd90e 100644 --- a/src_common/network.c +++ b/src_common/network.c @@ -69,6 +69,7 @@ static const network_info_t NETWORK_MAPPING[] = { {.chain_id = 369, .name = "PulseChain", .ticker = "PLS"}, {.chain_id = 245022926, .name = "Neon EVM Devnet", .ticker = "NEON"}, {.chain_id = 4919, .name = "Venidium", .ticker = "XVM"}, + {.chain_id = 40, .name = "Telos EVM Mainnet", .ticker = "TLOS"}, {.chain_id = 248, .name = "Oasys", .ticker = "OAS"}}; static const network_info_t *get_network_from_chain_id(const uint64_t *chain_id) { From 2109de02864374845727c5e6d9214ba63e6904c5 Mon Sep 17 00:00:00 2001 From: Victor Forgeoux <100780559+vforgeoux-ledger@users.noreply.github.com> Date: Mon, 3 Jul 2023 15:13:58 +0200 Subject: [PATCH 69/85] Add OKB network https://chainlist.org/chain/196 --- src_common/network.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src_common/network.c b/src_common/network.c index 12dd90e..4768d13 100644 --- a/src_common/network.c +++ b/src_common/network.c @@ -70,6 +70,7 @@ static const network_info_t NETWORK_MAPPING[] = { {.chain_id = 245022926, .name = "Neon EVM Devnet", .ticker = "NEON"}, {.chain_id = 4919, .name = "Venidium", .ticker = "XVM"}, {.chain_id = 40, .name = "Telos EVM Mainnet", .ticker = "TLOS"}, + {.chain_id = 196, .name = "OKBChain Mainnet", .ticker = "OKB"}, {.chain_id = 248, .name = "Oasys", .ticker = "OAS"}}; static const network_info_t *get_network_from_chain_id(const uint64_t *chain_id) { From 64910546e0f8a634ec235a9a802248be3053540b Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 6 Jul 2023 14:23:02 +0200 Subject: [PATCH 70/85] Added Neon mainnet --- src_common/network.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src_common/network.c b/src_common/network.c index 4768d13..af147d6 100644 --- a/src_common/network.c +++ b/src_common/network.c @@ -68,10 +68,12 @@ static const network_info_t NETWORK_MAPPING[] = { {.chain_id = 39797, .name = "Energi", .ticker = "NRG"}, {.chain_id = 369, .name = "PulseChain", .ticker = "PLS"}, {.chain_id = 245022926, .name = "Neon EVM Devnet", .ticker = "NEON"}, + {.chain_id = 245022934, .name = "Neon EVM Mainnet", .ticker = "NEON"}, {.chain_id = 4919, .name = "Venidium", .ticker = "XVM"}, {.chain_id = 40, .name = "Telos EVM Mainnet", .ticker = "TLOS"}, {.chain_id = 196, .name = "OKBChain Mainnet", .ticker = "OKB"}, - {.chain_id = 248, .name = "Oasys", .ticker = "OAS"}}; + {.chain_id = 248, .name = "Oasys", .ticker = "OAS"}, +}; static const network_info_t *get_network_from_chain_id(const uint64_t *chain_id) { for (size_t i = 0; i < ARRAYLEN(NETWORK_MAPPING); i++) { From c52816e3981d1457364b648b5d10c9b9f72fab89 Mon Sep 17 00:00:00 2001 From: tjulien-ledger <84443769+tjulien-ledger@users.noreply.github.com> Date: Wed, 19 Jul 2023 15:27:13 +0200 Subject: [PATCH 71/85] Update network.c Adding Base, Sepolia and Polygon zkEVM --- src_common/network.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src_common/network.c b/src_common/network.c index af147d6..8c0d238 100644 --- a/src_common/network.c +++ b/src_common/network.c @@ -73,6 +73,9 @@ static const network_info_t NETWORK_MAPPING[] = { {.chain_id = 40, .name = "Telos EVM Mainnet", .ticker = "TLOS"}, {.chain_id = 196, .name = "OKBChain Mainnet", .ticker = "OKB"}, {.chain_id = 248, .name = "Oasys", .ticker = "OAS"}, + {.chain_id = 1101, .name = "Polygon zkEVM", .ticker = "ETH"}, + {.chain_id = 8453, .name = "Base", .ticker = "ETH"}, + {.chain_id = 58008, .name = "Sepolia", .ticker = "ETH"}, }; static const network_info_t *get_network_from_chain_id(const uint64_t *chain_id) { From da1c79c3924fc60e8956fb2a9bf3ef7bf7be3f6f Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Wed, 26 Jul 2023 15:05:06 +0200 Subject: [PATCH 72/85] Fix get_tx_chain_id() implicit declaration warnings --- src_bagl/ui_flow_signTx.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src_bagl/ui_flow_signTx.c b/src_bagl/ui_flow_signTx.c index c60f46d..5d8e7b3 100644 --- a/src_bagl/ui_flow_signTx.c +++ b/src_bagl/ui_flow_signTx.c @@ -7,6 +7,7 @@ #include "eth_plugin_handler.h" #include "ui_plugin.h" #include "common_ui.h" +#include "ethUtils.h" #include "plugins.h" #include "domain_name.h" #include "ui_domain_name.h" From 77569f76ce87e66ab589ea8850079af184544a07 Mon Sep 17 00:00:00 2001 From: Jorge Martins Date: Fri, 7 Jul 2023 13:28:48 +0200 Subject: [PATCH 73/85] fix stax transfer ui --- src_nbgl/ui_stark_transfer.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src_nbgl/ui_stark_transfer.c b/src_nbgl/ui_stark_transfer.c index 28abe38..6abe161 100644 --- a/src_nbgl/ui_stark_transfer.c +++ b/src_nbgl/ui_stark_transfer.c @@ -52,8 +52,11 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { pairs[count].value = strings.tmp.tmp; count++; } + pairs[count].item = "Token Account"; pairs[count].value = strings.tmp.tmp2; + count++; + content->type = TAG_VALUE_LIST; content->tagValueList.nbPairs = count; content->tagValueList.pairs = (nbgl_layoutTagValue_t *) pairs; @@ -67,7 +70,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { sizeof(condAddressBuffer), &global_sha3, chainConfig->chainId), - pairs[0].item = "Cond. Address"; + pairs[0].item = "Cond. Address"; pairs[0].value = condAddressBuffer; stark_sign_display_condition_fact(); @@ -86,6 +89,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { content->type = INFO_LONG_PRESS, content->infoLongPress.icon = get_app_icon(false); content->infoLongPress.text = "Review transaction"; content->infoLongPress.longPressText = SIGN_BUTTON; + return true; } return false; @@ -106,19 +110,19 @@ void ui_stark_transfer(bool selfTransfer, bool conditional) { char *subTitle; if (conditional) { if (selfTransfer) { - subTitle = (char *) "Conditionnal self transfer"; + subTitle = (char *) "Conditional Self Transfer"; } else { - subTitle = (char *) "Conditionnal transfer"; + subTitle = (char *) "Conditional Transfer"; } } else { if (selfTransfer) { - subTitle = (char *) "self transfer"; + subTitle = (char *) "Self Transfer"; } else { subTitle = (char *) "Transfer"; } } nbgl_useCaseReviewStart(get_app_icon(false), - "Review stark transaction", + "Review stark\ntransaction", subTitle, REJECT_BUTTON, reviewContinue, From aae40ecadad1e02bf460dcdbabbda3d3c376f3cb Mon Sep 17 00:00:00 2001 From: Jorge Martins Date: Fri, 7 Jul 2023 16:40:12 +0200 Subject: [PATCH 74/85] add missing return --- src_nbgl/ui_stark_transfer.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src_nbgl/ui_stark_transfer.c b/src_nbgl/ui_stark_transfer.c index 6abe161..f569fe1 100644 --- a/src_nbgl/ui_stark_transfer.c +++ b/src_nbgl/ui_stark_transfer.c @@ -81,6 +81,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { content->tagValueList.nbPairs = 2; content->tagValueList.pairs = (nbgl_layoutTagValue_t *) pairs; + return true; } else { page++; } From 569f6c27cac8ab741235b5da913020ac3bc345de Mon Sep 17 00:00:00 2001 From: Jorge Martins Date: Tue, 18 Jul 2023 14:58:31 +0200 Subject: [PATCH 75/85] remove code duplication --- src_nbgl/ui_approve_tx.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src_nbgl/ui_approve_tx.c b/src_nbgl/ui_approve_tx.c index 3722d8c..2a9464c 100644 --- a/src_nbgl/ui_approve_tx.c +++ b/src_nbgl/ui_approve_tx.c @@ -201,9 +201,6 @@ static void reviewContinueCommon(void) { if (tx_approval_context.fromPlugin) { // plugin id + max items + fees nbPairs += dataContext.tokenContext.pluginUiMaxItems + 1; - if (tx_approval_context.displayNetwork) { - nbPairs++; - } } else { nbPairs += 3; if (N_storage.displayNonce) { @@ -217,9 +214,10 @@ static void reviewContinueCommon(void) { nbPairs += 1; } #endif // HAVE_DOMAIN_NAME - if (tx_approval_context.displayNetwork) { + } + + if (tx_approval_context.displayNetwork) { nbPairs++; - } } useCaseTagValueList.pairs = NULL; From 493046e555ad2d47949d1171a8fc63be53ab7530 Mon Sep 17 00:00:00 2001 From: Jorge Martins Date: Tue, 18 Jul 2023 15:04:09 +0200 Subject: [PATCH 76/85] Showing Token Account not Token Amount --- src_nbgl/ui_stark_limit_order.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_nbgl/ui_stark_limit_order.c b/src_nbgl/ui_stark_limit_order.c index ac4693e..89cfdbf 100644 --- a/src_nbgl/ui_stark_limit_order.c +++ b/src_nbgl/ui_stark_limit_order.c @@ -31,7 +31,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { pairs[0].value = strings.common.fullAmount; pairs[1].item = "Buy"; pairs[1].value = strings.common.maxFee; - pairs[2].item = "Token amount"; + pairs[2].item = "Token Account"; pairs[2].value = strings.common.fullAddress; content->type = TAG_VALUE_LIST; From 7e2cef182b944eafec286cd241f01da83e253538 Mon Sep 17 00:00:00 2001 From: Jorge Martins Date: Tue, 18 Jul 2023 16:54:20 +0200 Subject: [PATCH 77/85] UX_INIT() works for bagl an nbgl --- src/main.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main.c b/src/main.c index b11b39d..3399b86 100644 --- a/src/main.c +++ b/src/main.c @@ -978,12 +978,7 @@ void coin_main(libargs_t *args) { tmpCtx.transactionContext.currentItemIndex = 0; for (;;) { -#ifdef HAVE_BAGL UX_INIT(); -#endif // HAVE_BAGL -#ifdef HAVE_NBGL - nbgl_objInit(); -#endif // HAVE_NBGL BEGIN_TRY { TRY { From 2c2d933043c38052cec5bd5a88fc22c0ed49b4d2 Mon Sep 17 00:00:00 2001 From: Jorge Martins Date: Wed, 19 Jul 2023 11:59:37 +0200 Subject: [PATCH 78/85] No need to set nbMaxLinesForValue to 0, use NB_MAX_LINES_IN_REVIEW --- src_nbgl/ui_sign_712.c | 3 +-- src_nbgl/ui_sign_712_v0.c | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src_nbgl/ui_sign_712.c b/src_nbgl/ui_sign_712.c index d17a1d3..4d9aae7 100644 --- a/src_nbgl/ui_sign_712.c +++ b/src_nbgl/ui_sign_712.c @@ -29,7 +29,7 @@ static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { nbgl_getTextMaxLenInNbLines(BAGL_FONT_INTER_MEDIUM_32px, strings.tmp.tmp, SCREEN_WIDTH - (2 * BORDER_MARGIN), - 9, + NB_MAX_LINES_IN_REVIEW, &len); strings.tmp.tmp[len] = '\0'; @@ -39,7 +39,6 @@ static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { content->tagValueList.nbPairs = 1; content->tagValueList.pairs = &pair; content->tagValueList.wrapping = false; - content->tagValueList.nbMaxLinesForValue = 0; ret = true; break; diff --git a/src_nbgl/ui_sign_712_v0.c b/src_nbgl/ui_sign_712_v0.c index bc82563..ec38eea 100644 --- a/src_nbgl/ui_sign_712_v0.c +++ b/src_nbgl/ui_sign_712_v0.c @@ -30,7 +30,6 @@ static bool display_review_page(uint8_t page, nbgl_pageContent_t *content) { content->type = TAG_VALUE_LIST; content->tagValueList.nbPairs = 2; - content->tagValueList.nbMaxLinesForValue = 0; content->tagValueList.pairs = (nbgl_layoutTagValue_t *) pairs; } else if (page == 1) { g_position = UI_SIGNING_POSITION_SIGN; From 651dcc9503c9537b47b4451e0712bfe2210c0b5c Mon Sep 17 00:00:00 2001 From: Jorge Martins Date: Wed, 19 Jul 2023 14:48:06 +0200 Subject: [PATCH 79/85] fixed statement/lint --- src_nbgl/ui_approve_tx.c | 2 +- src_nbgl/ui_stark_transfer.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src_nbgl/ui_approve_tx.c b/src_nbgl/ui_approve_tx.c index 2a9464c..a6253c3 100644 --- a/src_nbgl/ui_approve_tx.c +++ b/src_nbgl/ui_approve_tx.c @@ -217,7 +217,7 @@ static void reviewContinueCommon(void) { } if (tx_approval_context.displayNetwork) { - nbPairs++; + nbPairs++; } useCaseTagValueList.pairs = NULL; diff --git a/src_nbgl/ui_stark_transfer.c b/src_nbgl/ui_stark_transfer.c index f569fe1..d7decfb 100644 --- a/src_nbgl/ui_stark_transfer.c +++ b/src_nbgl/ui_stark_transfer.c @@ -69,7 +69,7 @@ static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) { condAddressBuffer, sizeof(condAddressBuffer), &global_sha3, - chainConfig->chainId), + chainConfig->chainId); pairs[0].item = "Cond. Address"; pairs[0].value = condAddressBuffer; From e28dbbf81745c389c6d5b050c0724e7fcf5ed712 Mon Sep 17 00:00:00 2001 From: Jorge Martins Date: Fri, 21 Jul 2023 11:16:38 +0200 Subject: [PATCH 80/85] ui_settings HAVE_EIP712_FULL_SUPPORT inconsistency --- src_nbgl/ui_settings.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src_nbgl/ui_settings.c b/src_nbgl/ui_settings.c index 9a0ca33..d6c42bc 100644 --- a/src_nbgl/ui_settings.c +++ b/src_nbgl/ui_settings.c @@ -56,12 +56,14 @@ static bool navCallback(uint8_t page, nbgl_pageContent_t* content) { break; case 2: +#ifdef HAVE_EIP712_FULL_SUPPORT switches[index++] = (nbgl_layoutSwitch_t){.initState = N_storage.verbose_eip712 ? ON_STATE : OFF_STATE, .text = "Verbose EIP712", .subText = "Ignore filtering and\ndisplay raw content", .token = EIP712_VERBOSE_TOKEN, .tuneId = TUNE_TAP_CASUAL}; +#endif // HAVE_EIP712_FULL_SUPPORT #ifdef HAVE_DOMAIN_NAME switches[index++] = (nbgl_layoutSwitch_t){ .initState = N_storage.verbose_domain_name ? ON_STATE : OFF_STATE, @@ -116,5 +118,9 @@ static void controlsCallback(int token, uint8_t index) { } void ui_menu_settings(void) { - nbgl_useCaseSettings(APPNAME " settings", 0, 3, false, ui_idle, navCallback, controlsCallback); + uint8_t nb_screens = 2; +#ifdef HAVE_EIP712_FULL_SUPPORT || HAVE_DOMAIN_NAME + nb_screens += 1; +#endif + nbgl_useCaseSettings(APPNAME " settings", 0, nb_screens, false, ui_idle, navCallback, controlsCallback); } From beea483d661a0e75db73411d0f05271b0f2dbfcd Mon Sep 17 00:00:00 2001 From: Jorge Martins Date: Fri, 21 Jul 2023 11:19:31 +0200 Subject: [PATCH 81/85] lint + fix or condition --- src_nbgl/ui_settings.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src_nbgl/ui_settings.c b/src_nbgl/ui_settings.c index d6c42bc..9d3656c 100644 --- a/src_nbgl/ui_settings.c +++ b/src_nbgl/ui_settings.c @@ -119,8 +119,14 @@ static void controlsCallback(int token, uint8_t index) { void ui_menu_settings(void) { uint8_t nb_screens = 2; -#ifdef HAVE_EIP712_FULL_SUPPORT || HAVE_DOMAIN_NAME +#if defined(HAVE_EIP712_FULL_SUPPORT) || defined(HAVE_DOMAIN_NAME) nb_screens += 1; #endif - nbgl_useCaseSettings(APPNAME " settings", 0, nb_screens, false, ui_idle, navCallback, controlsCallback); + nbgl_useCaseSettings(APPNAME " settings", + 0, + nb_screens, + false, + ui_idle, + navCallback, + controlsCallback); } From 530cfdab73b30cccbf1d2ea3ea5aa616ece37945 Mon Sep 17 00:00:00 2001 From: Jorge Martins Date: Fri, 21 Jul 2023 15:15:10 +0200 Subject: [PATCH 82/85] use NB_MAX_LINES_IN_REVIEW --- src_nbgl/ui_sign_message.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src_nbgl/ui_sign_message.c b/src_nbgl/ui_sign_message.c index 4577fa6..6d85f80 100644 --- a/src_nbgl/ui_sign_message.c +++ b/src_nbgl/ui_sign_message.c @@ -46,7 +46,7 @@ static bool display_message(nbgl_pageContent_t *content) { reached = nbgl_getTextMaxLenInNbLines(BAGL_FONT_INTER_MEDIUM_32px, (char *) g_stax_shared_buffer, SCREEN_WIDTH - (2 * BORDER_MARGIN), - 9, + NB_MAX_LINES_IN_REVIEW, &len); stringsTmpTmpIdx = len - eip191MessageIdx; @@ -71,7 +71,7 @@ static bool display_message(nbgl_pageContent_t *content) { content->tagValueList.nbPairs = 1; content->tagValueList.pairs = &pair; content->tagValueList.smallCaseForValue = false; - content->tagValueList.nbMaxLinesForValue = 9; + content->tagValueList.nbMaxLinesForValue = NB_MAX_LINES_IN_REVIEW; content->tagValueList.wrapping = false; if ((g_action != UI_191_ACTION_IDLE) && (stringsTmpTmpIdx >= strlen(strings.tmp.tmp))) { From 0bc9ea00ac91b82c6fb1430fbc4b5c84b5ed818f Mon Sep 17 00:00:00 2001 From: Jorge Martins Date: Thu, 27 Jul 2023 10:40:29 +0200 Subject: [PATCH 83/85] TLV: raise error when length = 0 --- src_features/provideDomainName/cmd_provide_domain_name.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_features/provideDomainName/cmd_provide_domain_name.c b/src_features/provideDomainName/cmd_provide_domain_name.c index 8cd974b..e1d14a4 100644 --- a/src_features/provideDomainName/cmd_provide_domain_name.c +++ b/src_features/provideDomainName/cmd_provide_domain_name.c @@ -479,7 +479,7 @@ static bool parse_der_value(const s_tlv_payload *payload, size_t *offset, uint32 if ((*offset + byte_length) > payload->size) { PRINTF("TLV payload too small for DER encoded value\n"); } else { - if (byte_length > sizeof(buf)) { + if (byte_length > sizeof(buf) || byte_length == 0) { PRINTF("Unexpectedly long DER-encoded value (%u bytes)\n", byte_length); } else { memset(buf, 0, (sizeof(buf) - byte_length)); From e7bb9e6107973576a18b5c481c7b3e6db2c5067b Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 27 Jul 2023 11:14:18 +0200 Subject: [PATCH 84/85] Changelog update for 1.10.3 --- CHANGELOG.md | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a8a3deb..6cd9902 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,32 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). -## [1.10.3](https://github.com/ledgerhq/app-ethereum/compare/1.10.2...1.10.3) - 2023-XX-XX +## [1.10.3](https://github.com/ledgerhq/app-ethereum/compare/1.10.2...1.10.3) - 2023-07-27 + +### Added + +- (network) LUKSO mainnet & testnet +- (network) Chiado +- (network) PulseChain +- (network) Neon EVM mainnet & devnet +- (network) Venidium +- (network) Telos EVM mainnet +- (network) OKBChain mainnet +- (network) Polygon zkEVM +- (network) Base +- (network) Sepolia +- ENS on chains that share the Ethereum derivation path +- Ledger Stax support + +### Changed + +- (network) xDai renamed to Gnosis + +### Fixed + +- Missing context cleanup between plugin calls +- Miscellaneous swap issues +- Improper EIP-712 array handling ## [1.10.2](https://github.com/ledgerhq/app-ethereum/compare/1.10.1...1.10.2) - 2023-04-24 From de3e4a2583ebf46a83ede586d6dc45d5aed6d44b Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 27 Jul 2023 11:14:47 +0200 Subject: [PATCH 85/85] Removed -dev version suffix --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 20e4d69..4715da5 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,7 @@ APP_LOAD_PARAMS += --path "1517992542'/1101353413'" APPVERSION_M=1 APPVERSION_N=10 APPVERSION_P=3 -APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)-dev +APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) APP_LOAD_FLAGS= --appFlags 0xa40 --dep Ethereum:$(APPVERSION) ###########################