From 60b434a32a4a171c87bb338a3f104b4637529327 Mon Sep 17 00:00:00 2001 From: Jay Date: Thu, 23 Dec 2021 12:33:00 +0530 Subject: [PATCH 01/48] added naan wallet support --- assets/logos/ios-naan.png | Bin 0 -> 174029 bytes scripts/generate-wallet-list.ts | 9 +++++++++ 2 files changed, 9 insertions(+) create mode 100644 assets/logos/ios-naan.png diff --git a/assets/logos/ios-naan.png b/assets/logos/ios-naan.png new file mode 100644 index 0000000000000000000000000000000000000000..da3e8ce53bee2ebf02452a172849e4528ac99930 GIT binary patch literal 174029 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�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 O0000 Date: Thu, 23 Dec 2021 15:38:37 +0530 Subject: [PATCH 02/48] Update generate-wallet-list.ts --- scripts/generate-wallet-list.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/generate-wallet-list.ts b/scripts/generate-wallet-list.ts index a2928a64e..d401271df 100644 --- a/scripts/generate-wallet-list.ts +++ b/scripts/generate-wallet-list.ts @@ -74,7 +74,7 @@ export const iosList: App[] = [ }, { key: 'naan_ios', - name: 'Naan - A Tasty Tezos Wallet', + name: 'Naan Wallet', shortName: 'Naan', color: 'rgb(129, 100, 100)', logo: 'ios-naan.png', From 068063962657e93e9d20b0f54b3fcf0839717677 Mon Sep 17 00:00:00 2001 From: thuyentruong Date: Fri, 24 Dec 2021 15:53:37 +0700 Subject: [PATCH 03/48] feat(wallet): added autonomy wallet support --- assets/logos/ios-autonomy.png | Bin 0 -> 23079 bytes scripts/generate-wallet-list.ts | 9 +++++++++ 2 files changed, 9 insertions(+) create mode 100644 assets/logos/ios-autonomy.png diff --git a/assets/logos/ios-autonomy.png b/assets/logos/ios-autonomy.png new file mode 100644 index 0000000000000000000000000000000000000000..ae8c1ae2ab84ee343c82cb9954c283a592c6f79e GIT binary patch literal 23079 zcmeFZ^;cBy8#O#bcXxM}NQ=@P($bB9G)Rif&`LK_5+dD5BPmjf(jZ7l2!fO}4DUUD z{65d$@UHc&HB0$n&YW}Cb?s~KeVvy&+A8=sG&m3l1Yb>6Q4az^0e_-EurR=Xe*&g1 z!GBO6Jr#LK%^2M_1i}PSQMfoK%_IY6jCl0^qhXi_4zbYbm zEI0XB@Nc0O7PA=^a|HOaUcQRR)M&`Zwq^L6$&>vc0rT8ab7{(lc~<-T^Uv}x@_Z6b zZtmVD90n#zN$!bmQRN?A#$Dv)OMcw?a(lHUb9?d7h80S}^!KBqv~oKR(Ru5koq?tb zM}Bb7oFJaeNf2!02QH5y0wLqc)93hi0S&|)l}#1}`6)<(;6ozSx6;)9UZ)DjfXx1P z6$G1$O%_$Qa6;1I-)#z@J)-|zC5wWC{S~59_EbCT-wna-@c-ZK{@-N&zpe8Bqk~Ya zxB|O9gE@SRqdr>j=w=sYxg5N8b<;1^PRFMeQ`ORnuhuVEWV0rR(m;&LWBa~ouKXN- z(_lM*lT(`1x@*z?G&x7yL;d;l=WBLe5R$Lja18h-8zbr7>qEpS+^IeDjgAgWoq-OPpGQFu zt6-KzEueYQ8I8unbYOLRVs&(LwruwNfmQEQyEZZvX!rF|Z1C}C@%lf5+TiP9$e3rC zB-@9^q4|pG?DuzGN%dRA&Bpb`F?;P@ivz~nL&mV%`56S_tQ(gOa)VD0+Tp+7>?W0# ziB<(})k9;bt3!*u*zU{wXG1LDz&h|`$Ix1xQouav<40xMQW~|*HlHn=&EIYZ(12US z`>B~3<((YyR0wtiDF}_}awyouvZ_lh%OSjOZf;7fe}0ZDEOkBSRfxjl?p*1_hxO02 z#9JNd3WXr9O)mdzlS*)8i8!Y$c0IqRKHHgzrrIM5qHiV!Hk;zg*FuGcppzZheJr0G zVTYK-ZkW}_L`KH*t7f+a`(HEF*lOv^?kyh60=No8JJnw_zKDKcUVljgle#Bd=m&E z;{&?${a>@Sl$|Trd*CUBUFYiFeHi;J@kTj5WiXMEayZ(r35lgEGbb`%6a~qnSm|-aY<+$|<3G>90h=Z_38` z@b#y>E^Z?1Idw3k>g+d*ZET(!Bjj14E=ICq_E7V#;5OY&urYBhJrO0Mtd?`cIKdEW zV|*GBuFUpQ9X4xPu=AUpe?Ra@@gVG2yqfw@(F&Ju#nDEQ%-TTwxi1yQhM2x`r#k*i@4?Y4-_M^vhb>}* z(V6HiohV)GvVe^)@LcyB9Z3Mx=sR=JnujWQk}b$no8Iw>#&6B9Zxfxf=#n!vrE| z(N4B7MagH(G=%ZfZRkaGT~B*^``pL+LRKpIIr76&6XoZSDeSM!ytd(ETy|YxQHNSW zxGc1>HFLzY+?P5{*y#HZ2P``?)n=}GcB8ar%ZRuDL_=Ra{;T5zu(CAR2qU)-N@JxO zhpJ4v0Irb?jE-5beVv+OOXbkQ(c~|m`*Z)>|D$3#+A>nVIgas?eWN!R|62xI#7h zZcOmaWz&nn^TQt-zrS~Q{cwb_t?+?)AFIe9)d+)g%iM2(fU|w~B{S~xrFLJ9B>b<- zL^NkV5@k5V+%4}dHMwNEE_G&guml zbVS zO@*#owmyXVcqkzxmw5Gh%S|ncB_oAOaZi-T(Lg!`ITu$*d~gk3L9#_Lf&8 zE`TPHnVh`RQXkE&4pju-M_saa1-<1QoJpWv+I%>n%nDIMm5*v;+J8>GjqQAXWuy}#CWueq>8ba@E3yTjLE6~V)O2bZ zTPWRGxvv0xb5qGJEga1oJhZI9lq~a+;>t)mudvHZ6GL#&){-4=l;XuTRM6 zcN|VAtDvCJE8e?MX9vZUn8N)!1p>T0p=i2f=9!*e-WEN zR1z8T%#6O|%TU^*{%HXiY6u)HA6|dGFbj|xSMaty0>2Na#h_lXhbDk1wQ|W6DuWda z;_!;$KH-%D^%AYP`}*ri@a*Vb`%6)^77^%Ap28LOFm7wG{1hHMzbtlt#C8^&iSk$; zjGkjo(un~Zq<4iHiw+|;n&#{J_$9C>rDM$5NSiyKo&C;R=tOr$b#-&&-;Fu%XPXpQ zNjvS7WWY|-0GGEF2joqnY2H}}v*y2V>9X1N{K^mP71-z%v9cb#-&@l95t>b?udlBf z{%D9=4-VL5RXU`RnkkSjBI48NIhaQ{DSdP7@y~O|wQ=1&lz6acn~JZByMtIrFzyHa z;Tm=r=u%@k18co*sYE8^j8YS-e2U(zXBJw*4mBLp`w&1N?~0oG|8APlU*; z9kW&DtC*-Lc8tUYEeVF(w|Cqj=yfV2b>QeiaMKitQ<)ErzsTU~ZC>^xlF$z(-f9fv zW!u)qQVLRl)fM|p;AuCQKrW#Gz{U#ET$9TznP`8ZDib5}?h1ryEa0j8?f`J5r>~zH zs(47ChS_TS8pO0DaJCzRY&%Ee-kWHGlQ%H(=I1nNtM9K2rryL~W_?fLyfby%Lzvj% zJHLKaTIqDAqVa)Byhr}6?z$6N-9}=ajO$GhZORSPcA|#14fwhxuji#=H73lM>6-oZ zgXbes&~XO-B{yoY!85qy)|5Fte|}{)c^~9kz-kY@UX5lfB1~#z_z8Jbl>~D4XpvGZ zifM!B?p?>x_%&li@JLD{MP=jIPWLHGQ5U;swN+l`ix@qOLm1R!nj!Iup-)-|56Wl; zKdC{)vA8{yPRLr;@cB2-)M2PQNT%MKpQvd|h$`bsroNa~a(=|g%rj8{zbaZ$RG^E! z!k*X&s~)g1sxjvV+0?_7e#Q9yogLDFD>qIsN_xCl7_d;Q$Ia*43d!LzJn>&UHKp8OJie)*@zJQ>|{y26l$$~vW_9rGV> z7o|hwa#eCx=u2|$0xSw2?F~dJ!3k8wIR-hZ6og}L(m}@MkgICz+5Uxg-(N;pp}SM% z`sD(-m-i|;rQT|5mmv8Q9<-06d#pY75(83qC41Z!nzfqUzdy+jV^w#pcwOe^&&8s= zZS7U(OQw-~iunb+ZoEh`g0k_AdVR&2;dwS&&rKYvXL zCiwr0xMs=d2R)&v(@(dj?wd8c5~uZ_v;cTD`hu7>H`_%r^^V~~MQ5i>AH}r(sM%IE zun;*x8&!%pf-oxR(#%_p%&^7<@#Ww*uZjCmR*B9*AxK_N1tOtMG}_y6(I!EwF4g^| z_o%)o$_aGbi46BABEozOLHvP}D7oa64AxOk#nY9QA?Sn%;`YG$~^x;axcMh=5ZZ{RV^kYq{=a`tX9+Q_2W>1KNZ*R^(%wC#l z^Kra5KYY`kN233#I5wR{qZ$|S{W(~K#o79H>KdzV%hSCD%2zEjjeB~y1x-zcIs~)J z2kf1o4A5)2cXoDlwm%AR4eId(4aatFm}Fr$GT7RB#=yDX^EN;%-v>>Xw|$hP-W(7t zk+kVUYXjkL9H#h3)yypC>E1U{?LWJ*{|D(xV55|r`$-^dXfye9A#~6yP%>F{hw!&U ztopzW4WsdGQo!cJCQHb^>zI%$1GA(j)SlBqKJ8THh>57U_~@%Ub|^lMFK3T3!np+> zbVUrt(>}7~B(P}m`k{QWU7C+_cTG1%LEY#9ISpil63#mr{ev-gzON5~jQBjuuqG*V zg$Q)poP`BY6B=UWO;J$15K;pnJx>jjkb$r4by>Vh)32DbjZA<#u6LqR3}xYlzj@%( zy>B1Ym?xVwK1Q#B>u-E(a`{31p~zA@{{jEslh@D2uSc)M9}cb(W;#p>CY42@3~q~x zym=pZ%(2|Jr6aXDaND9sL^1dEYmd+{U5$PWSswWEPrP}Bk7zShCah(Pn;sGb);O~x z>8S3Y(8ZSMasC{8dwt}$>nBwDDouC50JmI~Zz`&ahCF0uDFkh2o} zGgQw&^?%iPj|Hee(zx|Y4CZJB#fhyguWg0#Qr8>TNWcRNIO`9a6a9{E-$T4>8bUc= z=|yEHo5*==Y|bv-+)@w|>;CGnV~;h?^au}gGDqAd#N1X5gRMB(b->~e;H1y3_I432bKAaq$m_z)GcatE5BktjwJk6(*zjVqOL z3$?@5DC-0J^Npn|RvxrcPo0NM#p z*RV25Aczx8U%nN(!ia^~ZR99=UXpUA7^tJYmJVcLRY|~$YYseqJYR38qOP~@NJW|m zg7PpZu#Q=|*qK9#zyWOK^F{_@3E1h@l?p`<5?on^%%bJqf7XmF{hdtbLVL$#-Q22O zCix}vohM7Mj~)i(JZ4}IJq%j}r9~30p$-u#bP^ZyZOGN1Z3RzmQdwhbz$u|(%>UV* z+}N3}N@#J7=eEc~D)VL0UOzcchRIs$>G;JIQmnSaN(gB{b%JxucKpWIJ_?t*f zCV%=dnCS4~1+l=x`%m3Lz)sG)=Z}FXNsn$vx89C$M)EiOw*A|9^|#3AObH?(YhIPG zIoePkR;i}J@Uhq~p0(p9pwi5uCf>@3AcM9l!*=7=i)lbZ>D<4!lqCe!p94j`fJp<} z>iGO~ZWKyE%QQ)!O*DafzB_4r=B;&8dt)~@;A9EI5Wz>D+Ks=pUtqvH+M9wNd!C2? zV5Eb*$G3r<_t}qPhVFOYb|r<)FAx!&Z%=ai+JsumGF%vErWHwp86NrZp;C{d?(t_D zxiCf;09iKuQE&P1qwf+sxw(;pR3KjcfQExXmFg)dv;^2lhLBWZn;vE)6dGi>&_qD- zucSVJf{C@T$g@a&DQ9~00?N{%8VSyyfsjv=rL>0`C|TB4P+n@jfAF9sa6(kbVCdk{W~We{~T_R!#q zqqpx#^*Jv7!rlE&e4Eg+SC91d-^4`?&DGm&toBDk89bAAzcp1#G30u7A=#G92UF^e z-W%$YfP}I}NDxp7S;I{QnziTz#i+cw(to+dQt+pwaz6YfmN#@1a(+;#Bi{Q36+0Xh z`J`s-v;&ukm_m-X zDO?3`zhd%U1|&qpV9#S@k-ieL30v&&uT>?GP-|*wsazBrGiN47mz7{@khtteX^QI2 z3SbJ=)6mdR{MMO=RskSiL6BePT?~{K_wOm?`lT2_@)SLWl|}=v#J%Bj|aQ|ix zpoxjOxmS^@SqaV+E@0J2U)Rdx#*Pw)(|T} z?iv)Ye)~&%Q4^B5m0)7()GdBv#d^x*l3vl@f^q;9cE2?ZE;KnFzWzHk=a(vdOz}3J zAnsDEHys@J{0%He(|y~eTAVv{~p(Q3zYe| z|2?j9B79ti*f>j}i^6NO_T4lfC{jpy^LQ+)eC zMXE(4c{hXo^Ls~2!IOd(n^H7_&~G~&2Jc=4cvT_KL`-U4I?Mk^(-q;rq-kLJ!iB#E zwh&&8u@?v}WOU)@wE3tSl&x=VCn0qPUScu$(J~Tv?AE0AyMUQjLUjBdE0>z7IN4SHd7j0YpI9fK-nc6&;(2IP+Cg zxh@I~gr@2BQEt8rOrSrSkT5RB{1B6XPSu2lAX5}Nsr&U`2seq%ygUbJGt>9i4Ejf< zzJjc~jwJ$wm{Z7dhrz;8O#j2RoyOz>(J7`QXLSM$JO`ouQ23qV-V5A8S-kM8vq=ae zWEX|$UQvsUBi=oG)BNO5A$4Ti=M%WN zSI>?&wPw~F#1IV*qiBLsFa;Ee?t8>11|22T zNr+DI?z_@<5a%UAH?SG>=u4lXN#yLVy4tGDw~~{Rae64gk&g zXc)#cLBajx_@@8R0~{`P!-+R4gmQk;_+wUh;k=dvSePH`=Q9PZVh{yQ?()OYk(7!c zdNYwcSfW!dC@)vz(8?w|PkkKCu^Z7dNsFN)sYO}|XxE`Ad|DJ^Ygz3q;kR_=+7@;d zIR*1xGu-G~PQoG(?_#|10imk@c>yRDdt(VCm%)b2?t0Sy$0=wy>uEwQ03p8nOWz|M z##ia;9(UcGnnm^A$i4I>&9ype%VNTZFP8P;%Ms8^v8f*X@W@Whw$7ndO1ef6y%kA# z;@CZ4;_EZ=1T56yuBY}^EEi0Uo zzH9w@EA!xw@^}Agem;EfHa-!DL0q3CMO(Jrh^eWmwAfEszxsAKdgMr?pSZZ>WpQ$* z(1ZLuU+?d3uOECb0rlO7=BxCWHda#GCj4YFPzjPVTDLc2j zFHV(8=F98*sh5|R>f3iYp{LX_iGfHRf3H=CuDopdm{PZl}6Qi z!}v0b0m&DWOpkCC^fwgsZ?LqmQ#yaG1MV;k%@on>vHZZK!_TcrBjzj_4x$9h3&kF? z<)zYxjB;Ht{9)HVNVaghA+DLepES5_7TK8l62O|`$U1dI)WJImEfFw_k2)X)Lv;jGqI z1G$Npk$H`3Aem>$yOIo&Ehq57K~>W1%u_!?lYt>w0|mj2m6TIEuCl}Y%ub!Nnq4l% zN)ky)NkjzE`b7Z+uCTe)sD`o*y>A>+C#x1neuqz++6-|nH$ihcyST`AuJ^D4;1~^{ zOjg>`(oG){QT$w18&6{z?nuxiNXh0=fp6y3S^ScujRN0)5cG(`r!Ot=UEO4w!P4iMTmww%0 zzOAH9^)opMQL`tQIQbWVDvPU}8FdQETO?1q zP-hdqyY$`+HLOT7n~p762r$?hI{}`3)1Xe%p%+j0&stm1{dfY{aGosd2^%Xr=U$0t zr&XVF#09HYh3TWG4`U7|<%B0UetuXHf#mAgNu>g+Aj-VMkH2p3h1(p%{h(r2#WCeO zZ{@T#G_@91N_GNFkF~*h4dGl_bHmD0q|lzhR{h2O&YzA3a=Ig6IINX554I&Ihz44Q z8J&0-Ff2udbN!hT{`?X*PkmqMY89QQNt##AJ}%NU5clo7$@4wfE<;JoVU6w{{j;1E zQ_jBEcL(e_iy{c51~M7qh(PG1pMEWiRq?UbGHvzrp6ZhdrmWNB&4~aJi21~0c^@0! zW+vl^tCQc~%|MRHCOR2upMHn$&eK@cbZHOx{vPJ3Wf9Jeirww;XQD`~Cg`$RqR5AJ z)i3#GrrC8~SZ*m?TJ*oc%_UDzQM6k3qJ%1xwK#(tm2Q3IFaax4T#aWhI?(b%Le`}V zrcbkuH>EGa#zXXE9s_oB>APB)Iemy|LR-PYik79?T`DOLv!D5rAO8cO5nUJV;p@LV zZp~$Ey;Gv7vR*depx+ipjzrD>Csa2#4%8e$$xbU$VF z(T8`ow>wiY;M(sqMP2kIXHHN3%FD~SD+y->gx|`IjY`+w+#LQ;AwQv7i4K*5B5EzG zrw^^m>?jMWtE-(Pk@JSHTp(c!>j+)YQDfc zT*}?~MinBAZI7Wxhy8>ytwIAan>}02Eap3cCD4KpY&7VKQgofnI{BFx+m+k|06DM{ zsz06l%n~qWKG&}Wa)G4$et|2fa0^Jt34*qISWZs^eRz&CtDk-X;%VGAt^Jv7x#px2 zhpztnB0#Hf8O5f!)UJn4Aw@2yq;-!T5!Y9G3@t83Mc<$^oSJ-;gOOA9N6g(sE%{~0`z z;WSMKN$=cl90;fvpDTAaKw)lkjPhed_%>$1+F;hptka*2-yIbDh?9;L z)H?o2Qy?%lZ;9dtIz#N`?w8uJ1mif~BC7iVcR5mTH|Wjddt}SJ+%1Feee~wz-M)Vw ziNmKE$CjFsyzfFzgu@-jC|wCYyn!a6vac(lr5+O5#=Ea@+4Su)%-*0c21EuPC|_ zg~^PD_{)&%^ZGcdJAKOIyeVyOYAqw`fLc{vgfMRn0FIn6EC!FscX!vr2vW0A@!`co zrc<@tkv~7@h&up5km57j16|n7$*eqAIv95_Yw-faJ5Cv+>qLgOT{xGB!FSk!EFaf0nS1)NcFA_&Rf@6m zJoU)7@Mm*A8c0?plNq#cZK3}Di)vV~=o8m}rS&~=Uy0|=+?g(yJJaigs}?;-PSjrW zPig%OSgkfpsVMAm$O~vuwZ*Ho1)$IH1N>a)Ynr_NG2`}Z8Rp?OXH`C2Yg{i+!1%y? zN0<}Q}hGUXo@LP2)V(0mgq$6W0wP0xtL9E9q7@a39ELvAkHS{Efbk*p9- z=0{MuIV^WQ56yD9Pm7LqeZH!+st%^Y;X6<^<;5iMeNjMuq&r7|dR1z^!{3A3VC*Ij zy*pRmd788csv|0O&*S>~qOs?A_O=M{E#RtelI2vzum7vN1*2Z?Zp-Vp0cvLpNYg>I zT|vp4rV82iw-w;5Cjy%dbDgnh=5_PdaQs6(8pvV&yP{HX41>}84r>9!V)TjGo!R4i zJNwYHf@)`;Ok5RNP_xmEEfD<S;_kUP7)xsZqd<;lvhV1AM?o?N z>hIiRJXGcwQ~I4Ga0&EJkX3&mp@=yDhPT#7hOVG`)RH@VLc2e4Pe?pPCYoFxeNK#w zX#-VB;bUTbw}XG$Lb?vu>k@AK1~Dqnq-U3Z%3~;3(s>^t=>vT2dVoHrOM)&ARu!0k za3-L2YE6zMNxgl>0V=J~)9&C4y}8ZP!4^UW=~hs$x|jju6B9$O7LJV#AR6>TZKuj~ z!(LE&gv)#Y#nxM&tuY>|08Zx^oS@U)EIe8IDU*m)rKY z>Sh0_AWF8dto#|09uGbdFny=0{aU)*U5&}k7U(MIj5tdr&W@^i6SuDbQ#&Z?0cL`t z=dRgLL*g0`Fn}_T|ItX8|9YFwm>us+vFO0SkIEJhx5HrXwe+*?_d8cn z;flr~Z;ZiweB8>%fcKk?KMZ(Xhkam%A)Zve)7- zfd0vpAM}zf9l$#i2%~fWQMpHs$7?|3T0hII7J+IFDr!dQcQU-XQ~&39b%Y#Xlks9l z1|U(Ug7Z!J8P5zcbY3#vPtEii2sCBkV@3>6aKCQErAwhKMe6Fci`&XMkuS;$*RGp& z1WpRgU5<>isX2dge8|<)nZgex=coUY4PB1g#bl@q+FTtvHq!-u=jx51Echj`!%ZjH zt{x2x#8Up9C@`H-%Q!TU1n0KGLb;^g(S-xlTj1ns0_j?0D51P-XM4qX9q@ReRWHsb z`b{fpYirv*%-namsI>tq=AV3FsQp+oj@(h;9>`i6O$MB4++8=o$JYSdCp%J2*8*uU zrHs2U8vD^w@|<&6Nw^qT+Bq~|6cG`Qe(o9JyBzJ^JI)Y^BD>s$Ri)_mEhGmo+e;ZY zQzxTOW3MvB5J8Q&Q>OE?!%eC)jyTvwy-*Hb3Xc z2c&+S0d6T(%RUP2mD2o>6h_$foj-{-QK==AOnoSTq+t{)D}9(R0CJIGOR?rXg>Q{9 z?R7*zO|2OKCIY#6ZJ62npe8yA&z_@sL(T_&@;Y-7Hn7!e^&8J)bS_&dy=VXB>!S8Z z=R*smuTIex0gmpF?FqF~Db%{ns2{-n-e2HUKB2$WG|R}SloC4}<@Rd?nQb0un%0{9 zg0hNm+m*83@1z=jc4~~>J#m8%m4!lym22MyvC2Xj{e10aHO&skT>ngRaV$v(^-m$4nQ0PU^DS{{uKL zt4N9VIQdRGoFT;t(wA@!&T1e!4ud08L}=|y2nu=r;&%?XBtoEyvyG%=O2EGc`*b?P zxXwBhsm5TDPq4A_)z#G0kjZZ$LVhnwX34-ptSwCwm0gWMRK#s^#F@MVr8bju>_@*} zGyHN(sLh@zx)X9PFlZkk3WDhT@VH^$$n0Bh6Q{{Pho!~#XuJ~U7OF@Jj;6ydcY z!8b0S&j9HWV$$NCrYjw zTEYov@0$K)M~CYuOoT0D`GG#CSYB!hEo$ zibDW9hn`+3tXuqkx317jQyi{6a)(f`Yw7(n%pLw7#tq;pL!o!XbQlidGaJE@1pvSYD;fW^TkCA7LX1tn!zg8q}^SPkj6j#%T|t{1>)!z9ywu0f(7{ER~8 zAh0)_F#{O=u#j2vDS#(Bc>=$|GFBzy6A*+VSgEz{8FJ*4@#_*JL~VtqbTw>%s{J;D z?DjPan0D?y0e`N}pM7IShesM$m|f;ssa<35nqK{BZT^$*U@!#qHT10|L{x+vh-QuG zHq+i~yR_V1{S8l_yo@>M$Gun4PrwmpfPYWHP_QJ;qZpbbe4y8F(dMo6_;WUSD<1H# z2wGY0_;KF4Uxxa6HyCO@L6#0rzp8<7Me=ffMNw0i_@8erUH<3dvX@9$+)G3r^ORmI zP*;48n|$SwG_WKX?2OET39D)2A{PD3aHVs?3m=jEljl`TWm+hzgVCk0fSQ zKJXfYB6pQeUp~t#hF5^<907cj51VsP(KVnfgaOkYbwi!>zas9nycCt%Gck$DdGQf0 zu$uQMrPTGYb{Cl+pY($Ts^kJ{BWsMzA{u1?!KF**tR2mA6INh9+e5x6o=O(mNCG1$RyCuF@7KoL(-+~NI2y68~JyR z;o*ldi&)ZEh_gwOj5)jq5TS!#J3B{5#^tHu7_uLE#BYqB;4_9v5j~7=eFAHnjx$Wp zSv_VTpU@SP*fn)3Bej;g8f#q5SVs}RKdH)o16G4A`tdS7(h9J81X7I4szz_VESk&# z*H%SSWFD)F1F@I~Ey=DBZLTVCix!f+ZgGBawFD|HCYHYCBchKLCufluvQgOpQnTW& z0Qe-F#@A5@fOTUkmlf**8F|rtTDmV?vHA47cs7oNktv;8&jOG6U^Y$=d&OHIJ%tHA zhn4WzLpz^t>nZCw$haEw1)l0{D4?8&TRUQTO^J!)a9k68nNZulV7vwa zFU0pQow+mCt-jH-$4!{ZOU7E+fe4{D7)vm4rwf#EB0LTDHsk*n`QTEoYcd@ElfEl- zT25`%Lf9K4yiZ48W5~ux2_Z>E>mE3iTRkPe5J~TpoeolH_pm2k03<&O1nC%#7*|i@ z+ndW1pAaBRc8QW}9Pv=Au&SQz$q+<#<0dGGvc-)AjRS^A4b^zvc=uDZ1)emJThw`m zZ-i>d!;4fpUx2$Jq7&HD8gHnJph+aRb$i`NS5S&AkYS41l)9oM{eS1K{EFt!g~x-q z{j}{rs9~`p%>O{Bq|xK^Ae^tze5YLPH$Z49c2|$SfQkg@2qP7Sm3m1`Fyt{xfFVSN zE>cBkUz+n{C?y6E?+v6}KP1!Oay+ID*L8-leOdxo#?^gj2T6{D@icfWcSUS3EZiR( z0bWU`eKaW`INe+c1750!e4*Jb75J&7BpvsQrFb$T%n4~=q?*`ol7yTRdwv^?;9+@p($_{ zGF$7zzgwHuwL+XI1r1TrS&wvbcGj)m13ePTe+epEw2Q6yP9}wD0{mS(XLTyWowk?9 zU|rUVx3_uuy69hjm-w;+7#R6Cn;mAUXFgqTwI8s1QrMZpC_Djg;?uB#xSaF@FS5V(R?di1#Q!2jqbpj=cqtg%YPd?JjImv}DIh z_wwoX65#t(?d;xY=<_@iKK7beK;~Pp7wkzwCAq54*+@*--y#DR%#Nq&6y(auL{~ z09K8HmL@y8;hGwxQ^NoEV!g&svbO{Cn;;nK(cOV5+?+0Wphx%AT6I%kM@Ps3OXcVM z9&FVQX{`e~O`LJ+)-Tc9i=jlU8(?jRfXg~2XliqQZ!i#91t{GERX{fI@K!@X7^F%B z${3$-#|bQ&IHJ+xRy&J>b*T13T_Wan$&=6NL}x6eP$E)Yqb8iN4}{cow@KgQ`Bfn@ z_DIP%R_@~Es~L@2%l9}NHlp_7cd6xuvL)OXC43W!NtM|vy}>jb?3LAsk{COE+QYAk zCZH!-zi*ApSqB31#o-_$X>WM-Q&`4(3Czp<+lzdOj;l(+;JxVS7smCrO0L+&DfXzF z2)j6S*HT*8a&mQ=VY$~XO0;Yaeq8ul}*oZ_&3qDqKt0x0~ z;+6{hK+lxHn0}+<8In9JbaP!rlk(j$ICwmGdvKfj1eTC$aI04Ga{yORZE&7#o~`gv zaZes7h4d=kRaos|zgaV)z=!j^1Qn$2JTLc`-#kiMdtw1XtO?YIpFp0!PWe&66zYWb zN{EL>=JvY?q+;bI<@Y3J1vF>%_gc@g)%Edw$Y11jDm8ljES8rn*TfQfBp*EI3^C}P z_^XG?TpuWq-~R?11;#W1)w#al+tv0dce-!geUjmwMAm&}=OS{b1@aj$JO;&DWagt! z_0oaLkpVcuN2>Z?HnQUt?wf9EPO^9c;Yco?9QH%N%z@@Fw~QU@5&eS@r`;)j9N4|m z0SRfOs`q7s%NKb6^zV~yYN|1zqx`Q!F&=HpU<$hoBwRU^t7ve2C;-wB#@HHxUk?TBP1 z1)LyhJsvzRz=UYf27+nH$f)-LkReP)Qd{apX`=%t(Ko#EdyxEM;T!^}IAZhdzLi&y zid<%VILQhSA-tNeK%ZwHW!*e3F-V;o+-NZPgEai&!7a&#UB)U406!NQ9zM$ zh__}eC<2kv`3ag$9Y7~wD6i3fQiP`~cbYi;xkAA=#(qR!pz{}O-6ftiLpCBA=wv-x zOe*MY=0-s2e#D|5(lLLb7e2s^K~+OEY)uR+N7%|1tmSAZqgM$ z;Holtp_C;4&umZ1xLg8tfe$a$xrxHty`tMh(EQFEFY%#} zenhK?Dw7PFCi+N{(9eU_{tIFeJ2fZBIhi#MyPP~WoB#M6aM}U=poc=+dZJj(`|8wf zjTuTZL>!8aOECnRePh|e2qAqa0GWHUIr|lTg&fp*xVuw)@VugJfc&1TXT8VoAkhG# zU=+*76DQXTyGo$p{xs(f?*n~Sz<|F>^s|-}I9`D7lZBT7di@L^C`_Oq$%nPtvE!c^ z>(J&7(MkpjXr^Az>;W{feSZ`_6dGuMCdjr3J-2fPR{$-J53uZ?_HiES2m?tOE&5%B z3stmdLREQry}CP&28t=xO8-CWr~dEh%1mT)+Ftbcd?6>u3$nFu08uBS6LG_un(OY0 zRP*(1ey)?L!5|ru2`wq%2+dFEX8vpOJdz1TV=sm>u>fV@ynQmLIkv5z%NCcj;60hh zEIRg_A`@Q>_A1;H3u)%m(tl}abb^6&F_=KU0AnVvYmOA{e>T1mj%5AxbjKIvYn#?= zL@#?ly@)fgpd&T6@a}f3QXKLxzjB+B{q1Lb^sM&Df^}&=VOrsj|Y+D{fo8o z+S(Q`^<)PlHwc&r;IrHN)|9;ZZ7vjuC-FXN@{jl47NlB_JWyl8N5R4bdbA@GA7~*e zoS2wMiNb25Rj7tq9}y@uFtXi@1ERm8B)ua&Cs{UIL(VZGw?9SJ6%E;905CVsACS?3 zfD-FQXC|fR0-=+7stR_MNA?##Py@M{d{P^IStk=g;0qYP?ZP=3kk3%iR!|{Zk0ovc z&442m=Sy?56qE-a0_;c)kOu(=OrZ{rDw%&xmdNZ|&;}+E4ZBr-1z0(d{eFN104j-} zL$!CHa;>Pev!H5;|f@p!Hg|* z;cV|2|B4i^Ky!}vr|4Ah>KH5%D$yrt(jnKaKMAog6{!Pe`%w(3AlaFJ+s1Tn2bk0HUcG^lXwyPU`UpXvqvxtTC%NepJ@9e_us%H#{J!}a z-ThpOceuzRZNd9=zAAw9b?)Zs;=-FPay{s2zPpC`rV#@UDumO<@5lz_+y%geuHae& z0_KAP^8GnIH&m7Y;4O zK8@pT^V!=Ary;-Zx*;SlVj)Y6z>!UetJqfn3Y$SuO@T|V2?!Q|FzC_60%ccK^%nnm z6>7Y896p;|jq8{s1rTF%G1rCM1OelVm34EC5~idhL zke3T{H4H7^+&HPeose`U;gXY8Aj{H6#dx5A7)l z9NB6cZteedLCXKP`FX+9LT&h642b1Zq^FSSO==4>E>pAXyJoCLBRxReJOhdnzwfh}+uspTV3_n?K$_mmHmAmSa5Tbme@(w?@SLLtt`^Ne0|FHk zHfz#Q;WaYMIM0U04Q?+ z??+10um%Nhn5r;Lp|8N}$H(*qt=~0`OAw*-ruzX01y!a^JpMhCL_>hqim!L0M*W4V z3;|&QT*v}nHc-U9s6;Q)hCGR0QSJHoxCyxg{%rvYlCiFU`8=9@D3k8PT?=9rn35N= z;C#;1SkM+m@47dAgPdP%<-dj9BA`M4nwacWMEjG0HPKwvZd;~yM2C$)3;9NQzO7y-azjM2xf1PDqJI1e*S%T6dW=V^#iMChRw%lAHuYG zD|34+gQ`SJbae{=v&$EUis$bCdUdK!{g%M|fwxELK%oo%In`p20?x_6md^{q z0!lMHX_rc>Y=6g!1g{76CxCsk$5d7i<)j|&dev8ajT~%}3JNf2WT0Xatn0pu zaq#{K>G_nCosG7DK!`oReA*Ut@?^l%wbka^J7<)K1^|(Pr3>0fl!UDyB8GyNih&qy!JaBe zQ7hVJu}DOAQEC+uM2`_GB2d&KC9z5osv;7XRv}v1+_0!DN<-)74eB50H_yqpyvaNF z&dj|t&&)H#WV5hRC4kHfyBv@CM@$gw(W`;RVoW#apKL+dV9rfQNG^$-Zf#Aku7Ri@ z)c^ic<&cDJYnIxHMxbp?DcOGG?5Vqr4ckWBE3(9TCgjY)-971Sc<64_ zYl4#21FuW6PAIH7DzG>H0l4ttTesHN>?)Xog%SIirIcy%9@wIY&KOtAToE^g$K#b= zU#W11s$n7AcD?bD^f0_q4`#|?OeP>WTApmYVW3_mrFm2W9~TjS}nnOw*K3EM#Xby1Z0>hW!X#mzb=?D z0`($jg}ITfHnY*f)e7YT&FzaJVi-ygrVJrhT8!PDEXu^$)SCOv1te#MBRIn2+s6~n zkNvh(oI}OW*>Azmm60?~I8s^&d6}q{7-r!$YO%bBrcYmrx6Jb-R3Z&T215Vu##kl3 z8?)MT<_%Z)l1HN5!c4QhRbiHo)&Z5xgT*!l{j4Mbj|x@4*31P7`!-z#cmn)xh z3&QDffKxhB>x*W`er(x}`p{W$@Cq87j~^DcU}D>m$darM!(?JOB1^_O@Zst1ydS&V z)}o@eOA-SHbyrgtH{@xi-FJ%c8kj=SZudr-*&q!M*vi*C+1h{d&P5?t!}PeKEU|QS zc$Q6gubBpBC_<39TXbE*_C}7C!+=Ay0(F$q@P~|@0L;7Sr~&=Kv@FfklaN7CiVDyC zTw5E{B`)8bYABDmuw$9=`QtD(s|XT_Vl~4?3%P^s%_XddU&IF!O0pnbG7z4oaMgt_ zzZ!)iAG)$YbP8Xg%;*)77dX*-RaWO$TM{aApw?P~(=)HF-T-+QSa>67FmmY0oxkp~ zAoj0+{y@EJmC&nSaz|%oF65Cp+Z)v)5+$5hF*x8yR&XCrpkQ}090LdjNBZjI37E~t z+H;mJ22t!q3~gEj)R8jWT4TJbz+ncVSlgB*4x4Q}%l!2=R%w>5z3h#`KcKHX355?V z(PL;~o4@W)^N|7RXyz2U-r{|!u}_b9Ct9P!(+ny(1#;-<=eV=oBhU5$nxOrq_x#Q& zl69=N|98s)P~-0|DeA6q?Pg5Il?&|aUdsHxUExFLK%>jQP6O<>|J)DcX!+Ybea}&W z2F{N)5bjh1>q!+jaVKTMl8UZCd&1~Xp+@1=3-}MA{zWGBi_h#94hFBx#ScoN+7+KQLecH&}2~g$@T(eWfYV~YMFv7wr%(bU-tRi8scl|8b_mjYtnFAH(#6e2CZd*o8J$-+5#}a$`ZbM(Di>4i$$p*0(ZeCvK{U!g z*27w$dnGaowui=oci+F;ADwl+vyXTF@qeEWBjf0jPm*(o`5l=2j24AN23H31CI10a CWgwgY literal 0 HcmV?d00001 diff --git a/scripts/generate-wallet-list.ts b/scripts/generate-wallet-list.ts index d401271df..b393e6ea5 100644 --- a/scripts/generate-wallet-list.ts +++ b/scripts/generate-wallet-list.ts @@ -80,6 +80,15 @@ export const iosList: App[] = [ logo: 'ios-naan.png', universalLink: 'https://naanwallet.com', deepLink: 'naan://' + }, + { + key: 'autonomy-app', + name: 'Autonomy', + shortName: 'Autonomy', + color: '', + logo: 'ios-autonomy.png', + universalLink: 'https://au.bitmark.com/apps/tezos', + deepLink: 'autonomy-tezos://' } // { // name: 'Galleon', From 74298eb7781c73316a291a3ddc054faba61e11af Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Tue, 4 Jan 2022 11:39:14 +0100 Subject: [PATCH 04/48] chore(release): v2.3.9 --- package-lock.json | 6 +++--- package.json | 4 ++-- src/constants.ts | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 14ea3e0df..0ca830289 100755 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@airgap/beacon-sdk", - "version": "2.3.8", + "version": "2.3.9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@airgap/beacon-sdk", - "version": "2.3.8", + "version": "2.3.9", "license": "MIT", "dependencies": { "@types/chrome": "0.0.115", @@ -18311,4 +18311,4 @@ "dev": true } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index 39e91e4f0..490100bd0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@airgap/beacon-sdk", - "version": "2.3.8", + "version": "2.3.9", "description": "The beacon-sdk allows you to easily connect DApps with Wallets through P2P communication or a chrome extension.", "main": "dist/cjs/index.js", "module": "dist/esm/index.js", @@ -119,4 +119,4 @@ "pre-commit": "npm run check-version && pretty-quick --staged" } } -} +} \ No newline at end of file diff --git a/src/constants.ts b/src/constants.ts index f1a7fa90a..ba87bdea1 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,2 +1,2 @@ -export const SDK_VERSION: string = '2.3.8' +export const SDK_VERSION: string = '2.3.9' export const BEACON_VERSION: string = '2' From 21c8c10c2ba6847b9b10ff94568c708d9fbcbc5d Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Mon, 14 Mar 2022 16:04:34 +0100 Subject: [PATCH 05/48] feat(): add ithacanet --- scripts/generate-wallet-list.ts | 2 +- src/types/beacon/NetworkType.ts | 2 +- src/ui/alert/Pairing.ts | 2 +- src/utils/tezblock-blockexplorer.ts | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/generate-wallet-list.ts b/scripts/generate-wallet-list.ts index b393e6ea5..b0a719f43 100644 --- a/scripts/generate-wallet-list.ts +++ b/scripts/generate-wallet-list.ts @@ -38,7 +38,7 @@ export const webList: WebApp[] = [ [NetworkType.FLORENCENET]: 'https://florencenet.kukai.app', [NetworkType.GRANADANET]: 'https://granadanet.kukai.app', [NetworkType.HANGZHOUNET]: 'https://hangzhounet.kukai.app', - [NetworkType.IDIAZABALNET]: 'https://idiazabalnet.kukai.app' + [NetworkType.ITHACANET]: 'https://ithacanet.kukai.app' } } ] diff --git a/src/types/beacon/NetworkType.ts b/src/types/beacon/NetworkType.ts index 03eae9ca2..3af1c86da 100644 --- a/src/types/beacon/NetworkType.ts +++ b/src/types/beacon/NetworkType.ts @@ -5,6 +5,6 @@ export enum NetworkType { FLORENCENET = 'florencenet', GRANADANET = 'granadanet', HANGZHOUNET = 'hangzhounet', - IDIAZABALNET = 'idiazabalnet', + ITHACANET = 'ithacanet', CUSTOM = 'custom' } diff --git a/src/ui/alert/Pairing.ts b/src/ui/alert/Pairing.ts index 60c5b693a..974f738db 100644 --- a/src/ui/alert/Pairing.ts +++ b/src/ui/alert/Pairing.ts @@ -54,7 +54,7 @@ export interface WebApp extends AppBase { [NetworkType.FLORENCENET]?: string [NetworkType.GRANADANET]?: string [NetworkType.HANGZHOUNET]?: string - [NetworkType.IDIAZABALNET]?: string + [NetworkType.ITHACANET]?: string [NetworkType.CUSTOM]?: string } } diff --git a/src/utils/tezblock-blockexplorer.ts b/src/utils/tezblock-blockexplorer.ts index 3535a5548..e9ed7050c 100644 --- a/src/utils/tezblock-blockexplorer.ts +++ b/src/utils/tezblock-blockexplorer.ts @@ -10,8 +10,8 @@ export class TezblockBlockExplorer extends BlockExplorer { [NetworkType.FLORENCENET]: 'https://florencenet.tezblock.io', [NetworkType.GRANADANET]: 'https://granadanet.tezblock.io', [NetworkType.HANGZHOUNET]: 'https://hangzhounet.tezblock.io', - [NetworkType.IDIAZABALNET]: 'https://idiazabalnet.tezblock.io', - [NetworkType.CUSTOM]: 'https://granadanet.tezblock.io' + [NetworkType.ITHACANET]: 'https://ithacanet.tezblock.io', + [NetworkType.CUSTOM]: 'https://ithacanet.tezblock.io' } ) { super(rpcUrls) From 457645f902d33154bc3856ee10b2689cdda55258 Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Mon, 14 Mar 2022 16:05:10 +0100 Subject: [PATCH 06/48] chore(release): v2.3.10 --- package-lock.json | 6 +++--- package.json | 4 ++-- src/constants.ts | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0ca830289..014748a72 100755 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@airgap/beacon-sdk", - "version": "2.3.9", + "version": "2.3.10", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@airgap/beacon-sdk", - "version": "2.3.9", + "version": "2.3.10", "license": "MIT", "dependencies": { "@types/chrome": "0.0.115", @@ -18311,4 +18311,4 @@ "dev": true } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 490100bd0..b14899ad9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@airgap/beacon-sdk", - "version": "2.3.9", + "version": "2.3.10", "description": "The beacon-sdk allows you to easily connect DApps with Wallets through P2P communication or a chrome extension.", "main": "dist/cjs/index.js", "module": "dist/esm/index.js", @@ -119,4 +119,4 @@ "pre-commit": "npm run check-version && pretty-quick --staged" } } -} \ No newline at end of file +} diff --git a/src/constants.ts b/src/constants.ts index ba87bdea1..bff09ca55 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,2 +1,2 @@ -export const SDK_VERSION: string = '2.3.9' +export const SDK_VERSION: string = '2.3.10' export const BEACON_VERSION: string = '2' From 696e5861e0622b4ab5f7e13da1c2d7d118ae6615 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ng?= Date: Thu, 24 Mar 2022 14:33:46 +0100 Subject: [PATCH 07/48] chore() replace issue template --- .gitlab/issue_templates/Bug.md | 40 +++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/.gitlab/issue_templates/Bug.md b/.gitlab/issue_templates/Bug.md index 40839c44a..46c86b625 100644 --- a/.gitlab/issue_templates/Bug.md +++ b/.gitlab/issue_templates/Bug.md @@ -1,33 +1,39 @@ -### Summary +## Summary + -(Summarize the bug encountered concisely) -### Steps to reproduce +## Steps to reproduce + -(How one can reproduce the issue - this is very important) +## What is the current _bug_ behavior? + -### What is the current _bug_ behavior? +## What is the expected _correct_ behavior? + -(What actually happens) +## Relevant logs, screenshots and/or links + -### What is the expected _correct_ behavior? +## Possible fixes / approach + -(What you should see instead) +## Additional information + -### Relevant logs and/or screenshots +---- + +/estimate -(Paste any relevant logs - please use code blocks (```) to format console output, -logs, and code as it's tough to read otherwise.) + +/label ~"type::bug" ~"proj::airgap" -### Possible fixes -(If you can, link to the line of code that might be responsible for the problem) From e24d276f5c5eff2bc89abca17898451d9f72c779 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ng?= Date: Thu, 24 Mar 2022 14:34:04 +0100 Subject: [PATCH 08/48] Update Bug.md --- .gitlab/issue_templates/Bug.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab/issue_templates/Bug.md b/.gitlab/issue_templates/Bug.md index 46c86b625..4269a69bf 100644 --- a/.gitlab/issue_templates/Bug.md +++ b/.gitlab/issue_templates/Bug.md @@ -34,6 +34,6 @@ logs, and code as it's tough to read otherwise. ---> /estimate -/label ~"type::bug" ~"proj::airgap" +/label ~"type::bug" ~"proj::airgap" ~"proj::beacon" From b457b7ce5ea1281bcd109a44cfb9d552a138b7c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ng?= Date: Thu, 24 Mar 2022 14:34:41 +0100 Subject: [PATCH 09/48] chore() update template --- .gitlab/issue_templates/Bug.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab/issue_templates/Bug.md b/.gitlab/issue_templates/Bug.md index 4269a69bf..184607c34 100644 --- a/.gitlab/issue_templates/Bug.md +++ b/.gitlab/issue_templates/Bug.md @@ -34,6 +34,6 @@ logs, and code as it's tough to read otherwise. ---> /estimate -/label ~"type::bug" ~"proj::airgap" ~"proj::beacon" +/label ~"type::bug" ~"proj::airgap" ~"proj::beacon" From a35ee1dd01d2fe773ff9beec9fbec46b60b6ce46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ng?= Date: Thu, 24 Mar 2022 14:45:03 +0100 Subject: [PATCH 10/48] chore() replace template --- .gitlab/issue_templates/Feature.md | 43 +++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/.gitlab/issue_templates/Feature.md b/.gitlab/issue_templates/Feature.md index a36500158..99bd9680a 100644 --- a/.gitlab/issue_templates/Feature.md +++ b/.gitlab/issue_templates/Feature.md @@ -1,24 +1,43 @@ -### Summary +## Summary + -(Summarize the feature concisely) -### What is the expected behavior? -(Describe what the user should see) +## What is the expected behavior? + -### Relevant mockups or screenshots -(Paste or link any relevant mockups or screenshot that describe the feature.) -### Possible approach +## Relevant Mockups, Screenshots and/or links + + + + +## Possible fixes / approach + + + + +## Additional information + + + + + + + +/estimate + + + + +/label ~"type::feature" ~"proj::airgap" -(Outline a possible approach for this feature, ex. make an example how the code could look like) From cf220309cd0e396a3f6cbad475588b2c579f0edc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ng?= Date: Thu, 24 Mar 2022 14:45:26 +0100 Subject: [PATCH 11/48] chore() update template --- .gitlab/issue_templates/Feature.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab/issue_templates/Feature.md b/.gitlab/issue_templates/Feature.md index 99bd9680a..3ca9ff60d 100644 --- a/.gitlab/issue_templates/Feature.md +++ b/.gitlab/issue_templates/Feature.md @@ -39,5 +39,5 @@ -/label ~"type::feature" ~"proj::airgap" +/label ~"type::feature" ~"proj::airgap" ~"proj::beacon" From ff307e92fe2c89143db8ced793832c9b5d8cc6b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ng?= Date: Thu, 24 Mar 2022 14:45:45 +0100 Subject: [PATCH 12/48] chore() add template --- .gitlab/issue_templates/Task.md | 39 +++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 .gitlab/issue_templates/Task.md diff --git a/.gitlab/issue_templates/Task.md b/.gitlab/issue_templates/Task.md new file mode 100644 index 000000000..49000237d --- /dev/null +++ b/.gitlab/issue_templates/Task.md @@ -0,0 +1,39 @@ + + +## Summary + + + + +## What steps need to be done? + + + + +## Relevant Mockups, Screenshots and/or links + + + + +## Additional information + + + + + + + +/estimate + + + + +/label ~"type::task" ~"proj::airgap" + + From a22b419425b2142dbbe252e39cf5f20269788fb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ng?= Date: Thu, 24 Mar 2022 14:45:58 +0100 Subject: [PATCH 13/48] Update Task.md --- .gitlab/issue_templates/Task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab/issue_templates/Task.md b/.gitlab/issue_templates/Task.md index 49000237d..fed4e6a6b 100644 --- a/.gitlab/issue_templates/Task.md +++ b/.gitlab/issue_templates/Task.md @@ -34,6 +34,6 @@ -/label ~"type::task" ~"proj::airgap" +/label ~"type::task" ~"proj::airgap" ~"proj::beacon" From 54bacb810c660fe650688b7de67a6bc50a55f185 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ng?= Date: Thu, 24 Mar 2022 14:46:17 +0100 Subject: [PATCH 14/48] chore() add template --- .gitlab/issue_templates/Epic.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .gitlab/issue_templates/Epic.md diff --git a/.gitlab/issue_templates/Epic.md b/.gitlab/issue_templates/Epic.md new file mode 100644 index 000000000..7baea40d8 --- /dev/null +++ b/.gitlab/issue_templates/Epic.md @@ -0,0 +1,30 @@ + + +## Summary + + + + +## Which issues need to be completed + + + + + + + +/label ~2141 ~"proj::airgap" + + + + From 8c40cf8b411b6de76cd093f2c01f9dbbcc7b95f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ng?= Date: Thu, 24 Mar 2022 14:46:31 +0100 Subject: [PATCH 15/48] Update Epic.md --- .gitlab/issue_templates/Epic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab/issue_templates/Epic.md b/.gitlab/issue_templates/Epic.md index 7baea40d8..10069be1a 100644 --- a/.gitlab/issue_templates/Epic.md +++ b/.gitlab/issue_templates/Epic.md @@ -23,7 +23,7 @@ If you use this format, add the + at the end of the path -/label ~2141 ~"proj::airgap" +/label ~2141 ~"proj::airgap" ~"proj::beacon" From 276b965a81b33ed5c07a7409494d8a8215b07ce8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ng?= Date: Thu, 24 Mar 2022 14:46:58 +0100 Subject: [PATCH 16/48] chore() update template --- .gitlab/issue_templates/Task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab/issue_templates/Task.md b/.gitlab/issue_templates/Task.md index fed4e6a6b..9f08f8ddc 100644 --- a/.gitlab/issue_templates/Task.md +++ b/.gitlab/issue_templates/Task.md @@ -34,6 +34,6 @@ -/label ~"type::task" ~"proj::airgap" ~"proj::beacon" +/label ~"type::task" ~"proj::airgap" ~"proj::beacon" From 4cb8fe4c2d2060577ac244e55e0043b36a14e9f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ng?= Date: Thu, 24 Mar 2022 14:47:11 +0100 Subject: [PATCH 17/48] chore() update template From b000c83be7969c181a48af3630050fa43caa4d0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20L=C3=A4ng?= Date: Thu, 24 Mar 2022 14:47:23 +0100 Subject: [PATCH 18/48] chore() update template --- .gitlab/issue_templates/Epic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab/issue_templates/Epic.md b/.gitlab/issue_templates/Epic.md index 10069be1a..8c10a1e45 100644 --- a/.gitlab/issue_templates/Epic.md +++ b/.gitlab/issue_templates/Epic.md @@ -23,7 +23,7 @@ If you use this format, add the + at the end of the path -/label ~2141 ~"proj::airgap" ~"proj::beacon" +/label ~2141 ~"proj::airgap" ~"proj::beacon" From 175fdb008d8ebc648d4388f7b8d8822ac33d09a5 Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Wed, 6 Apr 2022 10:16:47 -0300 Subject: [PATCH 19/48] fix(): only allow postmessage events from same origin --- src/transports/PostMessageTransport.ts | 5 +++++ src/transports/clients/PostMessageClient.ts | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/transports/PostMessageTransport.ts b/src/transports/PostMessageTransport.ts index 0c6b98fe6..aaec6912a 100644 --- a/src/transports/PostMessageTransport.ts +++ b/src/transports/PostMessageTransport.ts @@ -102,6 +102,11 @@ export class PostMessageTransport< // eslint-disable-next-line @typescript-eslint/no-explicit-any const fn = (event: any): void => { + if (event.source !== windowRef) { + console.debug('[Beacon]: Event received from untrusted origin') + return + } + const data = event.data as ExtensionMessage< string, { id: string; name: string; iconURL: string } diff --git a/src/transports/clients/PostMessageClient.ts b/src/transports/clients/PostMessageClient.ts index 2db91f496..fa4b8cdec 100644 --- a/src/transports/clients/PostMessageClient.ts +++ b/src/transports/clients/PostMessageClient.ts @@ -84,6 +84,11 @@ export class PostMessageClient extends MessageBasedClient { ): Promise { // eslint-disable-next-line @typescript-eslint/no-explicit-any const fn = async (event: any): Promise => { + if (event.source !== windowRef) { + console.debug('[Beacon]: Event received from untrusted origin') + return + } + const data = event?.data?.message as ExtensionMessage if ( @@ -133,6 +138,11 @@ export class PostMessageClient extends MessageBasedClient { private async subscribeToMessages(): Promise { windowRef.addEventListener('message', (message) => { + if ((message as any).source !== windowRef) { + console.debug('[Beacon]: Event received from untrusted origin') + return + } + if (typeof message === 'object' && message) { // eslint-disable-next-line @typescript-eslint/no-explicit-any const data: { From 0d1c09b91e660f32fea0e11cbb2694f706367fef Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Wed, 6 Apr 2022 13:47:04 -0300 Subject: [PATCH 20/48] fix(): remove innerHTML from pairing alert --- src/ui/alert/PairingAlert.ts | 80 ++++++++++++++++++++++++------------ src/utils/html-elements.ts | 32 +++++++++++++++ 2 files changed, 85 insertions(+), 27 deletions(-) create mode 100644 src/utils/html-elements.ts diff --git a/src/ui/alert/PairingAlert.ts b/src/ui/alert/PairingAlert.ts index 731c7643c..1c38d6ed3 100644 --- a/src/ui/alert/PairingAlert.ts +++ b/src/ui/alert/PairingAlert.ts @@ -14,6 +14,7 @@ import { PairingAlertWallet, WalletType } from './Pairing' +import { createSanitizedElement, createUnsafeElementFromString } from '../../utils/html-elements' const logger = new Logger('Alert') @@ -56,21 +57,26 @@ export const preparePairingAlert = async ( info.buttons.forEach(async (button) => { const randomId = await generateGUID() - const x = ` -
${button.title}
- - ` + const titleEl = createSanitizedElement('div', ['beacon-list__title'], [], button.title) + const buttonEl = createSanitizedElement( + 'button', + ['beacon-modal__button connect__btn'], + [], + button.text + ) + + const linkEl = document.createElement('a') + linkEl.id = `button_${randomId}` - const el = document.createElement('a') - el.id = `button_${randomId}` - el.innerHTML = x + linkEl.appendChild(titleEl) + linkEl.appendChild(buttonEl) - buttonListWrapper.appendChild(el) + buttonListWrapper.appendChild(linkEl) - const buttonEl = shadowRoot.getElementById(el.id) + const shadowButtonEl = shadowRoot.getElementById(linkEl.id) - if (buttonEl) { - buttonEl.addEventListener('click', async () => { + if (shadowButtonEl) { + shadowButtonEl.addEventListener('click', async () => { button.clickHandler() }) } @@ -79,24 +85,42 @@ export const preparePairingAlert = async ( const showWallet = (listEl: HTMLElement, type: WalletType, wallet: PairingAlertWallet) => { const altTag = `Open in ${wallet.name}` const walletKey = wallet.key - const x = ` - -
${wallet.name} - ${wallet.enabled ? '' : '

Not installed

'} -
- ${ - wallet.logo - ? `
- -
` - : '' - } -
- ` + + const logoEl = wallet.logo + ? createSanitizedElement( + 'div', + [], + [], + [createSanitizedElement('img', ['beacon-selection__img'], [['src', wallet.logo]], '')] + ) + : createUnsafeElementFromString( + '' + ) + + const nameEl = createSanitizedElement( + 'div', + ['beacon-selection__name'], + [], + [ + createSanitizedElement('span', [], [], wallet.name), + wallet.enabled ? undefined : createSanitizedElement('p', [], [], 'Not installed') + ] + ) + + const linkEl = createSanitizedElement( + 'a', + ['beacon-selection__list', wallet.enabled ? '' : ' disabled'], + [ + ['tabindex', '0'], + ['id', `wallet_${walletKey}`], + ['alt', altTag], + ['target', '_blank'] + ], + [nameEl, logoEl] + ) const el = document.createElement('span') - el.innerHTML = x + el.appendChild(linkEl) listEl.appendChild(el) @@ -124,7 +148,9 @@ export const preparePairingAlert = async ( } } + console.log('NOT REGISTRING KLICK') if (walletEl) { + console.log('REGISTRING KLICK') walletEl.addEventListener('click', () => completeHandler()) walletEl.addEventListener('keydown', completeHandler) } diff --git a/src/utils/html-elements.ts b/src/utils/html-elements.ts new file mode 100644 index 000000000..67713a433 --- /dev/null +++ b/src/utils/html-elements.ts @@ -0,0 +1,32 @@ +export const createUnsafeElementFromString = (el: string): HTMLElement => { + const div = document.createElement('div') + div.innerHTML = el.trim() + return div.firstChild as HTMLElement +} + +export const createSanitizedElement = ( + type: string, + classes: string[], + attributes: [string, string][], + element: string | (HTMLElement | undefined)[] +): HTMLElement => { + const el = document.createElement(type) + + el.classList.add(...classes.filter((clazz) => !!clazz)) + + attributes.forEach((attribute) => { + el.setAttribute(attribute[0], attribute[1] /* TODO: We need to sanitize this */) + }) + + if (typeof element === 'object' && Array.isArray(element)) { + element + .filter((childEl): childEl is HTMLElement => !!childEl) + .forEach((childEl) => { + el.appendChild(childEl) + }) + } else { + el.innerText = element + } + + return el +} From 57578ea546c9290e990105c8cc86a7628700a013 Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Wed, 6 Apr 2022 14:02:08 -0300 Subject: [PATCH 21/48] fix(): remove more innerHTML usages --- src/ui/alert/Alert.ts | 13 +++++++----- src/ui/alert/PairingAlert.ts | 40 ++++++++++++++++++++++++------------ src/utils/html-elements.ts | 8 +++++++- 3 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/ui/alert/Alert.ts b/src/ui/alert/Alert.ts index 6004b337b..9fd8ddd27 100644 --- a/src/ui/alert/Alert.ts +++ b/src/ui/alert/Alert.ts @@ -1,5 +1,6 @@ // Taken from https://github.com/WalletConnect/walletconnect-monorepo/blob/master/packages/qrcode-modal/src/browser.ts +import { createSanitizedElement } from '../../utils/html-elements' import { NetworkType, P2PPairingRequest, PostMessagePairingRequest } from '../..' import { getColorMode } from '../../colorMode' import { windowRef } from '../../MockWindow' @@ -56,11 +57,13 @@ const formatAlert = ( html: string } => { const callToAction: string = title - const buttonsHtml = buttons.map( - (button, index: number) => - `` + const buttonsHtml = buttons.map((button, index: number) => + createSanitizedElement( + 'button', + [`beacon-modal__button${button.style === 'outline' ? '--outline' : ''}`], + [['id', `beacon-alert-${id}-${index}`]], + button.text + ) ) let allStyles = alertTemplates.default.css diff --git a/src/ui/alert/PairingAlert.ts b/src/ui/alert/PairingAlert.ts index 1c38d6ed3..2ac776fc4 100644 --- a/src/ui/alert/PairingAlert.ts +++ b/src/ui/alert/PairingAlert.ts @@ -134,23 +134,37 @@ export const preparePairingAlert = async ( wallet.clickHandler() const modalEl: HTMLElement | null = shadowRoot.getElementById('beacon-modal__content') if (modalEl && type !== WalletType.EXTENSION && type !== WalletType.IOS) { - modalEl.innerHTML = `${ - wallet.logo - ? `

Establishing Connection..

-
-
- -
${wallet.name}
-
` - : '' - } - ` + modalEl.innerHTML = '' + modalEl.appendChild( + createSanitizedElement('p', ['beacon-alert__title'], [], 'Establishing Connection..') + ) + modalEl.appendChild( + createSanitizedElement('div', ['progress-line'], [['id', 'beacon-toast-loader']], '') + ) + modalEl.appendChild( + createSanitizedElement( + 'div', + ['beacon--selected__container'], + [], + [ + ...(wallet.logo + ? [ + createSanitizedElement( + 'img', + ['beacon-selection__img'], + [['src', wallet.logo]], + '' + ), + createSanitizedElement('img', ['beacon--selection__name__lg'], [], wallet.name) + ] + : [undefined]) + ] + ) + ) } } - console.log('NOT REGISTRING KLICK') if (walletEl) { - console.log('REGISTRING KLICK') walletEl.addEventListener('click', () => completeHandler()) walletEl.addEventListener('keydown', completeHandler) } diff --git a/src/utils/html-elements.ts b/src/utils/html-elements.ts index 67713a433..d2eac7d6e 100644 --- a/src/utils/html-elements.ts +++ b/src/utils/html-elements.ts @@ -15,7 +15,7 @@ export const createSanitizedElement = ( el.classList.add(...classes.filter((clazz) => !!clazz)) attributes.forEach((attribute) => { - el.setAttribute(attribute[0], attribute[1] /* TODO: We need to sanitize this */) + el.setAttribute(sanitizeText(attribute[0]), sanitizeText(attribute[1])) }) if (typeof element === 'object' && Array.isArray(element)) { @@ -30,3 +30,9 @@ export const createSanitizedElement = ( return el } + +export const sanitizeText = (text: string): string => { + const div = document.createElement('div') + div.innerText = text + return div.innerHTML +} From 2e10f04d48d4277479b616321d0f036d1a0a480e Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Wed, 6 Apr 2022 16:45:28 -0300 Subject: [PATCH 22/48] fix(): remove more usages of innerHTML --- src/ui/alert/Alert.ts | 2 +- src/ui/alert/PairingAlert.ts | 19 +++++++++++-------- src/ui/toast/Toast.ts | 27 +++++++++++++++++++++------ src/utils/html-elements.ts | 10 ++++++++-- 4 files changed, 41 insertions(+), 17 deletions(-) diff --git a/src/ui/alert/Alert.ts b/src/ui/alert/Alert.ts index 9fd8ddd27..0d89ecc3d 100644 --- a/src/ui/alert/Alert.ts +++ b/src/ui/alert/Alert.ts @@ -232,7 +232,7 @@ const openAlert = async (alertConfig: AlertConfig): Promise => { if (disclaimer) { const disclaimerContainer = shadowRoot.getElementById(`beacon--disclaimer`) if (disclaimerContainer) { - disclaimerContainer.innerHTML = disclaimer + disclaimerContainer.innerText = disclaimer } } diff --git a/src/ui/alert/PairingAlert.ts b/src/ui/alert/PairingAlert.ts index 2ac776fc4..31b36bcc1 100644 --- a/src/ui/alert/PairingAlert.ts +++ b/src/ui/alert/PairingAlert.ts @@ -14,7 +14,11 @@ import { PairingAlertWallet, WalletType } from './Pairing' -import { createSanitizedElement, createUnsafeElementFromString } from '../../utils/html-elements' +import { + createSanitizedElement, + createUnsafeElementFromString, + removeAllChildren +} from '../../utils/html-elements' const logger = new Logger('Alert') @@ -134,7 +138,7 @@ export const preparePairingAlert = async ( wallet.clickHandler() const modalEl: HTMLElement | null = shadowRoot.getElementById('beacon-modal__content') if (modalEl && type !== WalletType.EXTENSION && type !== WalletType.IOS) { - modalEl.innerHTML = '' + removeAllChildren(modalEl) modalEl.appendChild( createSanitizedElement('p', ['beacon-alert__title'], [], 'Establishing Connection..') ) @@ -173,17 +177,16 @@ export const preparePairingAlert = async ( const listContainer = document.createElement('span') container.appendChild(listContainer) const showWalletLists = (walletLists: PairingAlertList[]): void => { - listContainer.innerHTML = '' + removeAllChildren(listContainer) walletLists.forEach((list) => { const listWrapperEl = document.createElement('div') listWrapperEl.classList.add('beacon-list__wrapper') listContainer.appendChild(listWrapperEl) - const listTitleEl = document.createElement('div') - listTitleEl.classList.add('beacon-list__title') - listTitleEl.innerHTML = list.title - listWrapperEl.appendChild(listTitleEl) + listWrapperEl.appendChild( + createSanitizedElement('div', ['beacon-list__title'], [], list.title) + ) const listEl = document.createElement('span') listWrapperEl.appendChild(listEl) @@ -251,7 +254,7 @@ export const preparePairingAlert = async ( const showPlatform = async (type: 'ios' | 'android' | 'desktop' | 'none'): Promise => { const platformSwitch: HTMLElement | null = shadowRoot.getElementById(`beacon-switch`) if (platformSwitch) { - platformSwitch.innerHTML = + platformSwitch.innerText = type === 'none' ? 'Pair wallet on same device' : 'Pair wallet on another device' } diff --git a/src/ui/toast/Toast.ts b/src/ui/toast/Toast.ts index 6cb8ca60e..706b46039 100644 --- a/src/ui/toast/Toast.ts +++ b/src/ui/toast/Toast.ts @@ -3,6 +3,7 @@ import { WalletInfo } from '../../events' import { replaceInTemplate } from '../../utils/replace-in-template' import { generateGUID } from '../../utils/generate-uuid' import { toastTemplates } from './toast-templates' +import { createSanitizedElement } from '../../utils/html-elements' export interface ToastAction { text: string @@ -38,15 +39,29 @@ const createActionItem = async (toastAction: ToastAction): Promise const wrapper = document.createElement('div') wrapper.classList.add('beacon-toast__action__item') + removeAllChildNodes(wrapper) + if (actionCallback) { - wrapper.innerHTML = text.length > 0 ? `

${text}

` : `` - wrapper.innerHTML += `

${actionText}

` + if (text.length > 0) { + wrapper.appendChild(createSanitizedElement('p', [], [], text)) + } + wrapper.appendChild( + createSanitizedElement( + 'p', + [], + [], + [createSanitizedElement('a', [], [['id', id]], actionText)] + ) + ) } else if (actionText) { - wrapper.innerHTML = - text.length > 0 ? `

${text}

` : `` - wrapper.innerHTML += `

${actionText}

` + if (text.length > 0) { + wrapper.appendChild( + createSanitizedElement('p', ['beacon-toast__action__item__subtitle'], [], text) + ) + } + wrapper.appendChild(createSanitizedElement('p', [], [], actionText)) } else { - wrapper.innerHTML = `

${text}

` + wrapper.appendChild(createSanitizedElement('p', [], [], text)) } if (actionCallback) { diff --git a/src/utils/html-elements.ts b/src/utils/html-elements.ts index d2eac7d6e..9ec75d55d 100644 --- a/src/utils/html-elements.ts +++ b/src/utils/html-elements.ts @@ -8,7 +8,7 @@ export const createSanitizedElement = ( type: string, classes: string[], attributes: [string, string][], - element: string | (HTMLElement | undefined)[] + element: string | (HTMLElement | undefined)[] | undefined ): HTMLElement => { const el = document.createElement(type) @@ -24,8 +24,10 @@ export const createSanitizedElement = ( .forEach((childEl) => { el.appendChild(childEl) }) - } else { + } else if (typeof element === 'string') { el.innerText = element + } else { + // NOOP } return el @@ -36,3 +38,7 @@ export const sanitizeText = (text: string): string => { div.innerText = text return div.innerHTML } + +export const removeAllChildren = (el: HTMLElement): void => { + el.innerHTML = '' +} From 2f31512ce7e7b85489bb08b86fde428d7fe0c7bf Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Wed, 6 Apr 2022 17:59:00 -0300 Subject: [PATCH 23/48] feat(): add svg constructor --- src/ui/alert/Alert.ts | 16 +++++++++++- src/ui/toast/Toast.ts | 3 ++- src/utils/html-elements.ts | 42 ++++++++++++++++++++++++++++++- src/utils/templates.ts | 51 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 src/utils/templates.ts diff --git a/src/ui/alert/Alert.ts b/src/ui/alert/Alert.ts index 0d89ecc3d..7ef03b796 100644 --- a/src/ui/alert/Alert.ts +++ b/src/ui/alert/Alert.ts @@ -39,8 +39,22 @@ if (typeof window !== 'undefined' && typeof window.document !== 'undefined') { const timeout: Record = {} const addQR = (dataString?: string): string => { + console.log('dataString', dataString) if (typeof dataString === 'string') { - return `
${dataString}` + return createSanitizedElement( + 'div', + [], + [['id', 'beacon--qr__container']], + [ + createSanitizedElement('div', [], [['id', 'beacon--qr__copy__container']], ''), + createSanitizedElement( + 'button', + ['beacon-modal__button--outline'], + [['id', 'beacon--qr__copy']], + 'Copy' + ) + ] + ).outerHTML } return '' diff --git a/src/ui/toast/Toast.ts b/src/ui/toast/Toast.ts index 706b46039..503ef8d72 100644 --- a/src/ui/toast/Toast.ts +++ b/src/ui/toast/Toast.ts @@ -4,6 +4,7 @@ import { replaceInTemplate } from '../../utils/replace-in-template' import { generateGUID } from '../../utils/generate-uuid' import { toastTemplates } from './toast-templates' import { createSanitizedElement } from '../../utils/html-elements' +import { constructPoweredByBeacon } from '../../utils/templates' export interface ToastAction { text: string @@ -250,7 +251,7 @@ const addActionsToToast = async ( const poweredByBeacon = document.createElement('small') poweredByBeacon.classList.add('beacon-toast__powered') - poweredByBeacon.innerHTML = toastTemplates.default.poweredByBeacon + poweredByBeacon.appendChild(constructPoweredByBeacon()) list.appendChild(poweredByBeacon) showExpand(shadowRoot) diff --git a/src/utils/html-elements.ts b/src/utils/html-elements.ts index 9ec75d55d..5067ab513 100644 --- a/src/utils/html-elements.ts +++ b/src/utils/html-elements.ts @@ -12,7 +12,9 @@ export const createSanitizedElement = ( ): HTMLElement => { const el = document.createElement(type) - el.classList.add(...classes.filter((clazz) => !!clazz)) + if (classes.length > 0) { + el.classList.add(...classes.filter((clazz) => !!clazz)) + } attributes.forEach((attribute) => { el.setAttribute(sanitizeText(attribute[0]), sanitizeText(attribute[1])) @@ -33,6 +35,44 @@ export const createSanitizedElement = ( return el } +export const createSVGElement = ( + classes: string[], + attributes: [string, string][], + element: (SVGPathElement | HTMLElement)[] +): SVGSVGElement => { + const el = document.createElementNS('http://www.w3.org/2000/svg', 'svg') + + if (classes.length > 0) { + el.classList.add(...classes.filter((clazz) => !!clazz)) + } + + attributes.forEach((attribute) => { + el.setAttribute(sanitizeText(attribute[0]), sanitizeText(attribute[1])) + }) + + if (typeof element === 'object' && Array.isArray(element)) { + element + .filter((childEl): childEl is SVGPathElement => !!childEl) + .forEach((childEl) => { + el.appendChild(childEl) + }) + } else { + // NOOP + } + + return el +} + +export const createSVGPathElement = (attributes: [string, string][]): SVGPathElement => { + const el = document.createElementNS('http://www.w3.org/2000/svg', 'path') + + attributes.forEach((attribute) => { + el.setAttribute(sanitizeText(attribute[0]), sanitizeText(attribute[1])) + }) + + return el +} + export const sanitizeText = (text: string): string => { const div = document.createElement('div') div.innerText = text diff --git a/src/utils/templates.ts b/src/utils/templates.ts new file mode 100644 index 000000000..af5874df1 --- /dev/null +++ b/src/utils/templates.ts @@ -0,0 +1,51 @@ +import { createSanitizedElement, createSVGElement, createSVGPathElement } from './html-elements' + +export const constructPoweredByBeacon = (): HTMLElement => { + return createSanitizedElement( + 'a', + [], + [ + ['href', 'https://walletbeacon.io'], + ['target', '_blank'] + ], + [ + document.createTextNode('powered by') as any, + createSVGElement( + [], + [ + ['id', 'f63e95a9-fd19-4487-bc1a-09eb2f066704'], + ['data-name', 'Guides'], + ['xmlns', 'http://www.w3.org/2000/svg'], + ['width', '65'], + ['height', '65'], + ['viewBox', '0 0 65 65'] + ], + [ + createSanitizedElement('title', [], [], 'beacon_logo'), + createSVGPathElement([ + ['fill', 'currentColor'], + [ + 'd', + 'M59.66,29.52v1.06c0,.37-.18,9.07-4.11,15.88S44.16,57.75,43.84,57.93l-.91.54-1.61-.93-9.19-5.3a14.68,14.68,0,0,1-1.63-1.06h0a14.09,14.09,0,0,1-1.29-1,17.63,17.63,0,0,1-2.56-2.7,18.58,18.58,0,0,1-2.56-4.51,21.53,21.53,0,0,1-1.5-9,6.21,6.21,0,0,1,2.93-.73c.25,0,.49,0,.74,0a18.29,18.29,0,0,0,1,7.93,15.06,15.06,0,0,0,6.67,8l8.93,5.16c.2-.13.43-.3.68-.48,2.26-1.6,6.42-4.92,8.86-9.13C55.12,39.94,55.8,34,56,31.57l-3.79-2.19a23,23,0,0,0,.6-3.83Z' + ] + ]), + createSVGPathElement([ + ['fill', 'currentColor'], + [ + 'd', + 'M49.22,11.43V23.89c0,.65,0,1.3-.1,1.94v0c-.06.55-.13,1.1-.24,1.63A18,18,0,0,1,47.82,31a19.11,19.11,0,0,1-2.62,4.49,21.37,21.37,0,0,1-7.07,5.8,6.08,6.08,0,0,1-2.42-2.84A18.1,18.1,0,0,0,42,33.7h0a15.12,15.12,0,0,0,3.58-9.81V13.6c-.21-.11-.47-.21-.74-.35-2.52-1.16-7.47-3.1-12.36-3.1-5.42,0-11,2.4-13.08,3.45V18a22.54,22.54,0,0,0-3.63,1.38V11.43l.92-.52c.33-.18,8-4.38,15.79-4.38s15.48,4.2,15.8,4.38Z' + ] + ]), + createSVGPathElement([ + ['fill', 'currentColor'], + [ + 'd', + 'M18,26.4,9,31.55q0,.35.06.78a31.63,31.63,0,0,0,3.49,12.28c2.71,4.71,7.55,8.3,9.53,9.64l3.79-2.19a23.33,23.33,0,0,0,3,2.44l-6.88,4-.92-.54c-.31-.18-7.75-4.69-11.68-11.5S5.36,30.92,5.35,30.56V29.49L7,28.55l9.17-5.29c.57-.32,1.14-.61,1.72-.87a13.46,13.46,0,0,1,1.55-.61A17.52,17.52,0,0,1,23,20.91a19.2,19.2,0,0,1,5.19,0,21.49,21.49,0,0,1,8.55,3.24,6.29,6.29,0,0,1-1.25,3.51,17.9,17.9,0,0,0-7.3-3.06A15.14,15.14,0,0,0,18,26.4Z' + ] + ]) + ] + ), + document.createTextNode('Beacon') as any + ] + ) +} From b5539f7591fbbaa9348180226edc66051c9634a0 Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Thu, 7 Apr 2022 01:37:55 -0300 Subject: [PATCH 24/48] fix(): remove all innerHTML usages in toast --- src/events.ts | 21 ++++--- src/ui/toast/Toast.ts | 64 +++++++++++++++------ src/utils/html-elements.ts | 3 +- src/utils/templates.ts | 110 ++++++++++++++++++++++++++++++++++++- 4 files changed, 169 insertions(+), 29 deletions(-) diff --git a/src/events.ts b/src/events.ts index 7511967b8..3c5ed3564 100644 --- a/src/events.ts +++ b/src/events.ts @@ -207,7 +207,7 @@ const showSentToast = async (data: RequestSentInfo): Promise => { }) openToast({ - body: `Request sent to {{wallet}}`, + body: `Request sent to {{wallet}}`, walletInfo: data.walletInfo, state: 'loading', actions, @@ -221,17 +221,16 @@ const showAcknowledgedToast = async (data: { walletInfo: WalletInfo }): Promise => { openToast({ - body: - 'Awaiting confirmation in {{wallet}}', + body: 'Awaiting confirmation in {{wallet}}', state: 'acknowledge', walletInfo: data.walletInfo }).catch((toastError) => console.error(toastError)) } const showPrepare = async (data: { walletInfo?: WalletInfo }): Promise => { - const text = data.walletInfo ? `Preparing Request for {{wallet}}...` : 'Preparing Request...' + const text = data.walletInfo ? `Preparing Request for {{wallet}}...` : 'Preparing Request...' openToast({ - body: `${text}`, + body: text, state: 'prepare', walletInfo: data.walletInfo }).catch((toastError) => console.error(toastError)) @@ -302,7 +301,7 @@ const showErrorToast = async ( } await openToast({ - body: `{{wallet}} has returned an error`, + body: `{{wallet}} has returned an error`, timer: response.errorResponse.errorType === BeaconErrorType.ABORTED_ERROR ? SUCCESS_TIMER @@ -391,7 +390,7 @@ const showPermissionSuccessAlert = async ( const { output } = data await openToast({ - body: `{{wallet}} has granted permission`, + body: `{{wallet}} has granted permission`, timer: SUCCESS_TIMER, walletInfo: data.walletInfo, state: 'finished', @@ -423,7 +422,7 @@ const showOperationSuccessAlert = async ( const { account, output, blockExplorer } = data await openToast({ - body: `{{wallet}} successfully submitted operation`, + body: `{{wallet}} successfully submitted operation`, timer: SUCCESS_TIMER, state: 'finished', walletInfo: data.walletInfo, @@ -454,7 +453,7 @@ const showSignSuccessAlert = async ( ): Promise => { const output = data.output await openToast({ - body: `{{wallet}} successfully signed payload`, + body: `{{wallet}} successfully signed payload`, timer: SUCCESS_TIMER, state: 'finished', walletInfo: data.walletInfo, @@ -489,7 +488,7 @@ const showSignSuccessAlert = async ( // ): Promise => { // const output = data.output // await openToast({ -// body: `{{wallet}} successfully ${ +// body: `{{wallet}} successfully ${ // data.output.cryptoOperation === EncryptionOperation.ENCRYPT ? 'encrypted' : 'decrypted' // } payload`, // timer: SUCCESS_TIMER, @@ -526,7 +525,7 @@ const showBroadcastSuccessAlert = async ( const { network, output, blockExplorer } = data await openToast({ - body: `{{wallet}} successfully injected operation`, + body: `{{wallet}} successfully injected operation`, timer: SUCCESS_TIMER, state: 'finished', walletInfo: data.walletInfo, diff --git a/src/ui/toast/Toast.ts b/src/ui/toast/Toast.ts index 503ef8d72..afe3c5f3f 100644 --- a/src/ui/toast/Toast.ts +++ b/src/ui/toast/Toast.ts @@ -1,10 +1,9 @@ import { getColorMode } from '../../colorMode' import { WalletInfo } from '../../events' -import { replaceInTemplate } from '../../utils/replace-in-template' import { generateGUID } from '../../utils/generate-uuid' import { toastTemplates } from './toast-templates' import { createSanitizedElement } from '../../utils/html-elements' -import { constructPoweredByBeacon } from '../../utils/templates' +import { constructPoweredByBeacon, constructToastContainer } from '../../utils/templates' export interface ToastAction { text: string @@ -78,37 +77,62 @@ const removeAllChildNodes = (parent: HTMLElement): void => { } } -const formatToastText = (html: string): string => { +const formatToastText = (html: string): HTMLElement[] => { const walletIcon = globalToastConfig?.walletInfo?.icon const walletName = globalToastConfig?.walletInfo?.name - let wallet = '' + let walletEl: HTMLElement | undefined + + const walletNameEl = createSanitizedElement('strong', [], [], walletName ?? 'Wallet') + if (walletIcon) { - wallet += `` - } - if (walletName) { - wallet += `${walletName}` + walletEl = createSanitizedElement( + 'span', + ['beacon-toast__wallet__container'], + [], + [ + createSanitizedElement('img', ['beacon-toast__content__img'], [['src', walletIcon]], ''), + walletNameEl + ] + ) } else { - wallet += `Wallet` + walletEl = walletNameEl } - return replaceInTemplate(html, 'wallet', wallet) + const splits = html.split(`{{wallet}}`) + + if (splits.length === 1) { + return [createSanitizedElement('span', [], [], html)] + } else { + const out = [] + for (let x = 0; x < splits.length; x++) { + out.push(createSanitizedElement('span', [], [], splits[x])) + if (x < splits.length - 1) { + out.push(walletEl) + } + } + + return out + } } const getToastHTML = ( config: ToastConfig ): { style: string - html: string + html: HTMLElement } => { const text = config.body - let html = replaceInTemplate(toastTemplates.default.html, 'text', text) - html = formatToastText(html) + const elements = formatToastText(text) + + const outerEl = createSanitizedElement('span', ['beacon-toast__wallet__outer'], [], elements) + + const toastContainerEl = constructToastContainer([outerEl]) return { style: toastTemplates.default.css, - html + html: toastContainerEl } } @@ -271,7 +295,7 @@ const createNewToast = async (toastConfig: ToastConfig): Promise => { const wrapper = document.createElement('div') const { style, html } = getToastHTML(toastConfig) - wrapper.innerHTML = html + wrapper.appendChild(html) const styleEl = document.createElement('style') @@ -369,7 +393,15 @@ const updateToast = async (toastConfig: ToastConfig): Promise => { const toastTextEl = shadowRoot.getElementById('beacon-text-content') if (toastTextEl) { - toastTextEl.innerHTML = formatToastText(toastConfig.body) + removeAllChildNodes(toastTextEl) + toastTextEl.appendChild( + createSanitizedElement( + 'span', + ['beacon-toast__wallet__outer'], + [], + formatToastText(toastConfig.body) + ) + ) } const openWalletButtonEl = shadowRoot.getElementById('beacon-open-wallet') diff --git a/src/utils/html-elements.ts b/src/utils/html-elements.ts index 5067ab513..64f5085af 100644 --- a/src/utils/html-elements.ts +++ b/src/utils/html-elements.ts @@ -1,3 +1,4 @@ +// TODO: Remove export const createUnsafeElementFromString = (el: string): HTMLElement => { const div = document.createElement('div') div.innerHTML = el.trim() @@ -8,7 +9,7 @@ export const createSanitizedElement = ( type: string, classes: string[], attributes: [string, string][], - element: string | (HTMLElement | undefined)[] | undefined + element: string | (HTMLElement | Text | SVGSVGElement | undefined)[] | undefined ): HTMLElement => { const el = document.createElement(type) diff --git a/src/utils/templates.ts b/src/utils/templates.ts index af5874df1..2e23198aa 100644 --- a/src/utils/templates.ts +++ b/src/utils/templates.ts @@ -1,5 +1,113 @@ import { createSanitizedElement, createSVGElement, createSVGPathElement } from './html-elements' +export const constructToastContainer = (elements: HTMLElement[]): HTMLElement => { + return createSanitizedElement( + 'div', + ['beacon-toast__base', 'animated', 'fadeIn'], + [['id', 'beacon-toast']], + [ + createSanitizedElement( + 'div', + ['beacon-toast__content'], + [], + [ + createSanitizedElement( + 'span', + [], + [['id', 'beacon-text']], + [ + createSanitizedElement('p', [], [['id', 'beacon-text-content']], elements), + createSanitizedElement( + 'a', + ['beacon-toast__wallet__link'], + [['id', 'beacon-open-wallet']], + [ + createSanitizedElement('span', [], [], 'Open'), + createSVGElement( + ['svg-inline--fa', 'fa-external-link-alt', 'fa-w-16'], + [ + ['aria-hidden', 'true'], + ['focusable', 'false'], + ['data-prefix', 'fas'], + ['data-icon', 'external-link-alt'], + + ['role', 'img'], + ['xmlns', 'http://www.w3.org/2000/svg'], + ['viewBox', '0 0 512 512'] + ], + [ + createSVGPathElement([ + ['fill', 'currentColor'], + [ + 'd', + 'M432,320H400a16,16,0,0,0-16,16V448H64V128H208a16,16,0,0,0,16-16V80a16,16,0,0,0-16-16H48A48,48,0,0,0,0,112V464a48,48,0,0,0,48,48H400a48,48,0,0,0,48-48V336A16,16,0,0,0,432,320ZM488,0h-128c-21.37,0-32.05,25.91-17,41l35.73,35.73L135,320.37a24,24,0,0,0,0,34L157.67,377a24,24,0,0,0,34,0L435.28,133.32,471,169c15,15,41,4.5,41-17V24A24,24,0,0,0,488,0Z' + ] + ]) + ] + ) + ] + ) + ] + ), + createSVGElement( + ['beacon-toast__more', 'svg-inline--fa', 'fa-angle-down', 'fa-w-10'], + [ + ['id', 'beacon-toast-button-expand'], + ['aria-hidden', 'true'], + ['focusable', 'false'], + ['data-prefix', 'fas'], + ['data-icon', 'angle-down'], + + ['role', 'img'], + ['xmlns', 'http://www.w3.org/2000/svg'], + ['viewBox', '0 0 320 512'] + ], + [ + createSVGPathElement([ + ['fill', 'currentColor'], + [ + 'd', + 'M143 352.3L7 216.3c-9.4-9.4-9.4-24.6 0-33.9l22.6-22.6c9.4-9.4 24.6-9.4 33.9 0l96.4 96.4 96.4-96.4c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9l-136 136c-9.2 9.4-24.4 9.4-33.8 0z' + ] + ]) + ] + ), + createSVGElement( + ['beacon-toast__more', 'svg-inline--fa', 'fa-times', 'fa-w-10'], + [ + ['id', 'beacon-toast-button-close'], + ['aria-hidden', 'true'], + ['focusable', 'false'], + ['data-prefix', 'fal'], + ['data-icon', 'times'], + ['role', 'img'], + ['xmlns', 'http://www.w3.org/2000/svg'], + ['viewBox', '0 0 320 512'] + ], + [ + createSVGPathElement([ + ['fill', 'currentColor'], + [ + 'd', + 'M193.94 256L296.5 153.44l21.15-21.15c3.12-3.12 3.12-8.19 0-11.31l-22.63-22.63c-3.12-3.12-8.19-3.12-11.31 0L160 222.06 36.29 98.34c-3.12-3.12-8.19-3.12-11.31 0L2.34 120.97c-3.12 3.12-3.12 8.19 0 11.31L126.06 256 2.34 379.71c-3.12 3.12-3.12 8.19 0 11.31l22.63 22.63c3.12 3.12 8.19 3.12 11.31 0L160 289.94 262.56 392.5l21.15 21.15c3.12 3.12 8.19 3.12 11.31 0l22.63-22.63c3.12-3.12 3.12-8.19 0-11.31L193.94 256z' + ] + ]) + ] + ) + ] + ), + createSanitizedElement('div', ['progress-line'], [['id', 'beacon-toast-loader']], ''), + createSanitizedElement('hr', ['hide'], [['id', 'beacon-toast-loader-placeholder']], ''), + createSanitizedElement( + 'div', + ['beacon-toast__more--action'], + [['id', 'beacon-toast-list']], + '' + ) + ] + ) +} + export const constructPoweredByBeacon = (): HTMLElement => { return createSanitizedElement( 'a', @@ -9,7 +117,7 @@ export const constructPoweredByBeacon = (): HTMLElement => { ['target', '_blank'] ], [ - document.createTextNode('powered by') as any, + document.createTextNode('powered by'), createSVGElement( [], [ From fadbeb25f115ce07652e0f19862e50907ce90a4e Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Thu, 7 Apr 2022 01:50:58 -0300 Subject: [PATCH 25/48] fix(): remove unsafe html method --- src/ui/alert/PairingAlert.ts | 28 ++++++++++++++++++++++++---- src/utils/html-elements.ts | 7 ------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/ui/alert/PairingAlert.ts b/src/ui/alert/PairingAlert.ts index 31b36bcc1..547ccb213 100644 --- a/src/ui/alert/PairingAlert.ts +++ b/src/ui/alert/PairingAlert.ts @@ -16,7 +16,8 @@ import { } from './Pairing' import { createSanitizedElement, - createUnsafeElementFromString, + createSVGElement, + createSVGPathElement, removeAllChildren } from '../../utils/html-elements' @@ -97,8 +98,27 @@ export const preparePairingAlert = async ( [], [createSanitizedElement('img', ['beacon-selection__img'], [['src', wallet.logo]], '')] ) - : createUnsafeElementFromString( - '' + : createSVGElement( + ['beacon-selection__img', 'svg-inline--fa', 'fa-wallet', 'fa-w-16'], + [ + ['aria-hidden', 'true'], + ['focusable', 'false'], + ['data-prefix', 'fas'], + ['data-icon', 'wallet'], + ['role', 'img'], + ['xmlns', 'http://www.w3.org/2000/svg'], + ['viewBox', '0 0 512 512'], + ['style', 'enable-background:new 0 0 512 512;'], + ['xml:space', 'preserve'] + ], + [ + createSVGPathElement([ + [ + 'd', + 'M376.2,181H152.9c-5.2,0-9.4-4.2-9.4-9.4s4.2-9.4,9.4-9.4h225c5.2,0,9.4-4.2,9.4-9.4c0-15.5-12.6-28.1-28.1-28.1H143.5c-20.7,0-37.5,16.8-37.5,37.5v187.5c0,20.7,16.8,37.5,37.5,37.5h232.7c16.4,0,29.8-12.6,29.8-28.1v-150C406,193.6,392.7,181,376.2,181z M349.8,302.9c-10.4,0-18.8-8.4-18.8-18.8s8.4-18.8,18.8-18.8s18.8,8.4,18.8,18.8S360.1,302.9,349.8,302.9z' + ] + ]) + ] ) const nameEl = createSanitizedElement( @@ -113,7 +133,7 @@ export const preparePairingAlert = async ( const linkEl = createSanitizedElement( 'a', - ['beacon-selection__list', wallet.enabled ? '' : ' disabled'], + ['beacon-selection__list', wallet.enabled ? '' : 'disabled'], [ ['tabindex', '0'], ['id', `wallet_${walletKey}`], diff --git a/src/utils/html-elements.ts b/src/utils/html-elements.ts index 64f5085af..2088800b7 100644 --- a/src/utils/html-elements.ts +++ b/src/utils/html-elements.ts @@ -1,10 +1,3 @@ -// TODO: Remove -export const createUnsafeElementFromString = (el: string): HTMLElement => { - const div = document.createElement('div') - div.innerHTML = el.trim() - return div.firstChild as HTMLElement -} - export const createSanitizedElement = ( type: string, classes: string[], From 9f4c3b329b37516f6cd2a3d293f083ccd441cede Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Thu, 7 Apr 2022 02:32:50 -0300 Subject: [PATCH 26/48] fix(): remove all innerHTML usages in alert --- src/ui/alert/Alert.ts | 43 +++----- src/utils/html-elements.ts | 14 ++- src/utils/templates.ts | 195 ++++++++++++++++++++++++++++++++++++- 3 files changed, 222 insertions(+), 30 deletions(-) diff --git a/src/ui/alert/Alert.ts b/src/ui/alert/Alert.ts index 7ef03b796..661aa4398 100644 --- a/src/ui/alert/Alert.ts +++ b/src/ui/alert/Alert.ts @@ -5,9 +5,9 @@ import { NetworkType, P2PPairingRequest, PostMessagePairingRequest } from '../.. import { getColorMode } from '../../colorMode' import { windowRef } from '../../MockWindow' import { generateGUID } from '../../utils/generate-uuid' -import { replaceInTemplate } from '../../utils/replace-in-template' import { alertTemplates } from './alert-templates' import { preparePairingAlert } from './PairingAlert' +import { constructDefaultAlert, constructPairAlert } from '../../utils/templates' export interface AlertButton { text: string @@ -38,7 +38,7 @@ if (typeof window !== 'undefined' && typeof window.document !== 'undefined') { const timeout: Record = {} -const addQR = (dataString?: string): string => { +const addQR = (dataString?: string): HTMLElement => { console.log('dataString', dataString) if (typeof dataString === 'string') { return createSanitizedElement( @@ -54,21 +54,21 @@ const addQR = (dataString?: string): string => { 'Copy' ) ] - ).outerHTML + ) } - return '' + return createSanitizedElement('span', [], [], '') } const formatAlert = ( id: string, - body: string, + body: HTMLElement, title: string, buttons: AlertButton[], hasPairingPayload?: boolean ): { style: string - html: string + html: HTMLElement } => { const callToAction: string = title const buttonsHtml = buttons.map((button, index: number) => @@ -86,30 +86,15 @@ const formatAlert = ( allStyles += alertTemplates.pair.css } - let alertContainer = alertTemplates.container - - alertContainer = replaceInTemplate( - alertContainer, - 'main', - hasPairingPayload ? alertTemplates.pair.html : alertTemplates.default.html - ) - - alertContainer = replaceInTemplate(alertContainer, 'callToAction', callToAction) - alertContainer = replaceInTemplate(alertContainer, 'buttons', buttonsHtml.join(' ')) - - alertContainer = replaceInTemplate(alertContainer, 'body', body) - alertContainer = replaceInTemplate(alertContainer, 'id', id) + const callToActionEl = createSanitizedElement('span', [], [], callToAction) - if (alertContainer.indexOf('{{') >= 0) { - const start = alertContainer.indexOf('{{') - const end = alertContainer.indexOf('}}') - console.error('Not all placeholders replaced!', alertContainer.substr(start, end - start)) - throw new Error('Not all placeholders replaced!') - } + const alertEl = hasPairingPayload + ? constructPairAlert(id, [callToActionEl], buttonsHtml, [body]) + : constructDefaultAlert(id, [callToActionEl], buttonsHtml, [body]) return { style: allStyles, - html: alertContainer + html: alertEl } } @@ -210,7 +195,9 @@ const openAlert = async (alertConfig: AlertConfig): Promise => { })) ?? []) ] - const formattedBody = pairingPayload ? addQR(body) : body ?? '' + const formattedBody = pairingPayload + ? addQR(body) + : createSanitizedElement('span', [], [], body ?? '') const { style, html } = formatAlert( id, @@ -219,7 +206,7 @@ const openAlert = async (alertConfig: AlertConfig): Promise => { buttons, !!pairingPayload?.p2pSyncCode ) - wrapper.innerHTML = html + wrapper.appendChild(html) const styleEl = document.createElement('style') diff --git a/src/utils/html-elements.ts b/src/utils/html-elements.ts index 2088800b7..69782e3de 100644 --- a/src/utils/html-elements.ts +++ b/src/utils/html-elements.ts @@ -32,7 +32,7 @@ export const createSanitizedElement = ( export const createSVGElement = ( classes: string[], attributes: [string, string][], - element: (SVGPathElement | HTMLElement)[] + element: (SVGPathElement | SVGGElement | HTMLElement)[] ): SVGSVGElement => { const el = document.createElementNS('http://www.w3.org/2000/svg', 'svg') @@ -67,6 +67,18 @@ export const createSVGPathElement = (attributes: [string, string][]): SVGPathEle return el } +export const createSVGGElement = (element: SVGPathElement[]): SVGGElement => { + const el = document.createElementNS('http://www.w3.org/2000/svg', 'g') + + element + .filter((childEl): childEl is SVGPathElement => !!childEl) + .forEach((childEl) => { + el.appendChild(childEl) + }) + + return el +} + export const sanitizeText = (text: string): string => { const div = document.createElement('div') div.innerText = text diff --git a/src/utils/templates.ts b/src/utils/templates.ts index 2e23198aa..dab8f7d70 100644 --- a/src/utils/templates.ts +++ b/src/utils/templates.ts @@ -1,4 +1,9 @@ -import { createSanitizedElement, createSVGElement, createSVGPathElement } from './html-elements' +import { + createSanitizedElement, + createSVGElement, + createSVGGElement, + createSVGPathElement +} from './html-elements' export const constructToastContainer = (elements: HTMLElement[]): HTMLElement => { return createSanitizedElement( @@ -157,3 +162,191 @@ export const constructPoweredByBeacon = (): HTMLElement => { ] ) } + +export const constructAlertContainer = ( + id: string, + callToAction: HTMLElement[], + buttons: HTMLElement[], + main: HTMLElement[] +): HTMLElement => { + return createSanitizedElement( + 'div', + ['beacon-alert__base', 'animated', 'fadeIn'], + [['id', `beacon-alert-modal-${id}`]], + [ + createSanitizedElement( + 'div', + ['beacon-modal__wrapper'], + [], + [ + createSanitizedElement( + 'div', + ['beacon-modal__header'], + [], + [ + createSVGElement( + [], + [ + ['xmlns', 'http://www.w3.org/2000/svg'], + ['id', 'Guides'], + ['x', '0'], + ['y', '0'], + ['version', '1.1'], + ['viewBox', '0 0 179.2 43'], + ['xml:space', 'preserve'], + ['width', '140'], + ['height', '40'] + ], + [ + // TODO: Style + /** + + + */ + createSVGPathElement([ + [ + 'd', + 'M45 19v.9c0 .3-.2 7.5-3.4 13.2-3.3 5.6-9.4 9.3-9.7 9.5l-.8.4-1.3-.8-7.6-4.4c-.5-.3-.9-.6-1.4-.9-.4-.3-.7-.5-1.1-.8-.8-.7-1.5-1.4-2.1-2.2-.9-1.1-1.6-2.4-2.1-3.7-.9-2.3-1.3-4.8-1.2-7.5.8-.4 1.6-.6 2.4-.6h.6c-.2 2.4.1 4.6.8 6.6 1 2.8 2.9 5.1 5.5 6.6l7.4 4.3c.2-.1.4-.2.6-.4 1.9-1.3 5.3-4.1 7.3-7.6 2.2-3.9 2.8-8.9 3-10.8L38.8 19c.3-1 .4-2.1.5-3.2L45 19z' + ], + ['class', 'st0'] + ]), + createSVGPathElement([ + [ + 'd', + 'M36.3 4.1v10.3c0 .5 0 1.1-.1 1.6s-.1.9-.2 1.3c-.2 1-.5 2-.9 3-.5 1.3-1.3 2.6-2.2 3.7-1.5 1.9-3.5 3.6-5.9 4.8-.9-.6-1.6-1.3-2-2.4 2.1-1 3.9-2.3 5.2-4 1.9-2.3 3-5.1 3-8.1V5.9l-.6-.3c-2-1-6.1-2.6-10.1-2.6-4.5 0-9.1 2-10.9 2.9v3.6c-1 .3-2 .7-3 1.1V4.1l.8-.4C9.7 3.5 16 0 22.5 0s12.8 3.5 13.1 3.6l.7.5z' + ], + ['class', 'st0'] + ]), + createSVGPathElement([ + [ + 'd', + 'M10.5 16.5l-7.4 4.3v.7c.2 2.1.9 6.5 2.9 10 2.2 3.9 6.2 6.9 7.9 8l3.1-1.8c.8.7 1.6 1.4 2.5 2L13.8 43l-.8-.5c-.3-.2-6.4-3.9-9.7-9.5C.1 27.4 0 20.2 0 19.9V19l1.3-.8L9 13.9c.5-.3.9-.5 1.4-.7.4-.2.8-.4 1.3-.5 1-.4 2-.6 3-.7 1.4-.2 2.9-.2 4.3 0 2.4.3 4.8 1.2 7.1 2.7 0 1-.4 2-1 2.9-1.9-1.3-4-2.2-6-2.5-3.1-.6-6-.1-8.6 1.4z' + ], + ['class', 'st0'] + ]), + createSVGGElement([ + createSVGPathElement([ + [ + 'd', + 'M73.9 23c.9 1 1.3 2.3 1.3 3.7 0 1.9-.6 3.4-1.9 4.5-1.3 1.1-3.1 1.7-5.5 1.7h-8.6v-23h8.4c2.3 0 4.1.5 5.3 1.5 1.2 1 1.8 2.4 1.8 4.2 0 1.5-.4 2.7-1.2 3.6-.8.9-1.8 1.5-3.1 1.8 1.5.3 2.6 1 3.5 2zm-11.7-3h5c1.5 0 2.6-.3 3.4-1 .8-.7 1.2-1.6 1.2-2.8 0-1.2-.4-2.1-1.1-2.8-.8-.7-1.9-1-3.5-1h-4.8V20zm8.7 9.4c.9-.7 1.3-1.7 1.3-3s-.4-2.3-1.3-3c-.9-.7-2.1-1.1-3.7-1.1h-5v8.2h5c1.6-.1 2.8-.4 3.7-1.1zM95.3 24.6H81c.1 2.1.6 3.6 1.7 4.6s2.4 1.5 4 1.5c1.4 0 2.6-.4 3.6-1.1 1-.7 1.6-1.7 1.8-2.9h3.2c-.2 1.2-.7 2.4-1.5 3.3-.8 1-1.7 1.7-2.9 2.3-1.2.5-2.6.8-4.1.8-1.7 0-3.2-.4-4.6-1.1-1.3-.7-2.4-1.8-3.1-3.2-.8-1.4-1.1-3-1.1-4.9 0-1.9.4-3.5 1.1-4.9.8-1.4 1.8-2.5 3.1-3.2 1.3-.7 2.9-1.1 4.6-1.1 1.7 0 3.3.4 4.6 1.1 1.3.7 2.3 1.7 3 3 .7 1.2 1 2.6 1 4.1.1.7 0 1.2-.1 1.7zm-3.5-4.8c-.5-.9-1.2-1.6-2.1-2-.9-.4-1.8-.7-2.8-.7-1.6 0-3 .5-4.1 1.5-1.1 1-1.7 2.5-1.8 4.5h11.5c0-1.3-.2-2.4-.7-3.3zM111.2 16c1.2.9 2.1 2 2.5 3.5V15h3v18h-3v-4.6c-.5 1.5-1.3 2.6-2.5 3.5-1.2.9-2.7 1.3-4.4 1.3-1.6 0-3-.4-4.3-1.1-1.2-.7-2.2-1.8-2.9-3.2-.7-1.4-1.1-3-1.1-4.9 0-1.9.4-3.5 1.1-4.9.7-1.4 1.7-2.5 2.9-3.2 1.2-.7 2.7-1.1 4.3-1.1 1.7-.1 3.1.4 4.4 1.2zm-8 3.1c-1.1 1.2-1.7 2.8-1.7 4.8 0 2.1.5 3.7 1.7 4.8 1.1 1.2 2.6 1.8 4.4 1.8 1.2 0 2.2-.3 3.2-.8.9-.5 1.7-1.3 2.2-2.3.5-1 .8-2.1.8-3.5 0-1.3-.3-2.5-.8-3.5s-1.2-1.8-2.2-2.3c-.9-.5-2-.8-3.2-.8-1.9.1-3.3.7-4.4 1.8zM135 16.6c1.5 1.2 2.4 2.9 2.8 4.9h-3.1c-.2-1.3-.8-2.3-1.8-3-1-.7-2.2-1.1-3.6-1.1-1 0-2 .2-2.9.7-.9.5-1.6 1.2-2.1 2.2-.5 1-.8 2.2-.8 3.7s.3 2.7.8 3.7 1.2 1.7 2.1 2.2c.9.5 1.8.7 2.9.7 1.4 0 2.6-.4 3.6-1.1 1-.7 1.6-1.8 1.8-3h3.1c-.3 2.1-1.3 3.7-2.8 4.9-1.5 1.2-3.4 1.8-5.7 1.8-1.7 0-3.2-.4-4.6-1.1-1.3-.7-2.4-1.8-3.1-3.2-.8-1.4-1.1-3-1.1-4.9 0-1.9.4-3.5 1.1-4.9.8-1.4 1.8-2.5 3.1-3.2 1.3-.7 2.9-1.1 4.6-1.1 2.3-.1 4.2.6 5.7 1.8zM154.5 15.9c1.4.7 2.4 1.8 3.2 3.2.8 1.4 1.2 3 1.2 4.9 0 1.9-.4 3.5-1.2 4.9-.8 1.4-1.8 2.4-3.2 3.2-1.4.7-2.9 1.1-4.6 1.1-1.7 0-3.3-.4-4.6-1.1-1.4-.7-2.4-1.8-3.2-3.2-.8-1.4-1.2-3-1.2-4.9 0-1.9.4-3.5 1.2-4.9.8-1.4 1.9-2.5 3.2-3.2 1.4-.7 2.9-1.1 4.6-1.1 1.7-.1 3.2.3 4.6 1.1zm-7.6 2.2c-.9.5-1.6 1.2-2.2 2.2-.6 1-.8 2.2-.8 3.7 0 1.4.3 2.7.8 3.6.6 1 1.3 1.7 2.2 2.2.9.5 1.9.7 3 .7s2.1-.2 3-.7c.9-.5 1.6-1.2 2.2-2.2.6-1 .8-2.2.8-3.6 0-1.5-.3-2.7-.8-3.7-.6-1-1.3-1.7-2.2-2.2-.9-.5-1.9-.7-3-.7s-2.1.2-3 .7zM177.3 16.7c1.3 1.3 1.9 3.3 1.9 5.8v10.4h-3V22.8c0-1.8-.5-3.2-1.4-4.1-.9-1-2.2-1.4-3.7-1.4-1.6 0-2.9.5-3.9 1.6s-1.5 2.6-1.5 4.6V33h-3V15h3v4.3c.5-1.5 1.3-2.6 2.4-3.4 1.2-.8 2.5-1.2 4-1.2 2.2 0 3.9.6 5.2 2z' + ], + ['class', 'st1'] + ]) + ]) + ] + ), + createSanitizedElement( + 'div', + ['beacon-modal__close__wrapper'], + [['id', `beacon-alert-${id}-close`]], + [ + createSanitizedElement( + 'div', + ['beacon-modal__close__icon'], + [], + [ + createSanitizedElement('div', ['beacon-modal__close__line1'], [], []), + createSanitizedElement('div', ['beacon-modal__close__line2'], [], []) + ] + ) + ] + ) + ] + ), + createSanitizedElement( + 'div', + ['beacon-modal__base'], + [], + [ + createSanitizedElement( + 'div', + [], + [['id', 'beacon-modal__content']], + [ + createSanitizedElement( + 'div', + [], + [], + [ + createSanitizedElement('p', ['beacon-alert__title'], [], callToAction), + ...main, + createSanitizedElement('div', ['beacon-action__container'], [], buttons) + ] + ) + ] + ) + ] + ) + ] + ) + ] + ) +} + +export const constructDefaultAlert = ( + id: string, + callToAction: HTMLElement[], + buttons: HTMLElement[], + main: HTMLElement[] +): HTMLElement => { + return constructAlertContainer(id, callToAction, buttons, [ + createSanitizedElement('div', ['beacon-alert__text'], [['id', 'beacon-main-text']], main) + ]) +} + +export const constructPairAlert = ( + id: string, + callToAction: HTMLElement[], + buttons: HTMLElement[], + main: HTMLElement[] +): HTMLElement => { + return constructAlertContainer(id, callToAction, buttons, [ + createSanitizedElement('span', [], [['id', 'pairing-container']], ''), + createSanitizedElement( + 'div', + ['beacon-alert__text'], + [['id', 'beacon-main-text']], + [ + createSanitizedElement( + 'p', + ['beacon-list__title'], + [['id', 'beacon-title']], + [ + document.createTextNode('Scan QR code with a Beacon-compatible wallet.'), + createSanitizedElement( + 'a', + [], + [ + ['href', 'https://docs.walletbeacon.io/supported-wallets'], + ['target', '_blank'] + ], + 'Learn more' + ), + ...main + ] + ) + ] + ), + createSanitizedElement( + 'div', + [], + [['id', 'beacon--switch__container']], + [ + createSanitizedElement( + 'button', + ['beacon-modal__button--outline'], + [['id', 'beacon-switch']], + '' + ) + ] + ), + createSanitizedElement('div', [], [['id', 'beacon--disclaimer']], '') + ]) +} From 10deafbc927d15841dbaf32a1acef5a72600cec7 Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Thu, 7 Apr 2022 10:12:13 -0300 Subject: [PATCH 27/48] fix(): remove logs --- src/transports/PostMessageTransport.ts | 2 +- src/transports/clients/PostMessageClient.ts | 4 ++-- src/utils/html-elements.ts | 6 +++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/transports/PostMessageTransport.ts b/src/transports/PostMessageTransport.ts index aaec6912a..7f9c5feec 100644 --- a/src/transports/PostMessageTransport.ts +++ b/src/transports/PostMessageTransport.ts @@ -103,7 +103,7 @@ export class PostMessageTransport< // eslint-disable-next-line @typescript-eslint/no-explicit-any const fn = (event: any): void => { if (event.source !== windowRef) { - console.debug('[Beacon]: Event received from untrusted origin') + // TODO: Add to error handler: console.debug('[Beacon]: Event received from untrusted origin') return } diff --git a/src/transports/clients/PostMessageClient.ts b/src/transports/clients/PostMessageClient.ts index fa4b8cdec..4da7a76c9 100644 --- a/src/transports/clients/PostMessageClient.ts +++ b/src/transports/clients/PostMessageClient.ts @@ -85,7 +85,7 @@ export class PostMessageClient extends MessageBasedClient { // eslint-disable-next-line @typescript-eslint/no-explicit-any const fn = async (event: any): Promise => { if (event.source !== windowRef) { - console.debug('[Beacon]: Event received from untrusted origin') + // TODO: Add to error handler: console.debug('[Beacon]: Event received from untrusted origin') return } @@ -139,7 +139,7 @@ export class PostMessageClient extends MessageBasedClient { private async subscribeToMessages(): Promise { windowRef.addEventListener('message', (message) => { if ((message as any).source !== windowRef) { - console.debug('[Beacon]: Event received from untrusted origin') + // TODO: Add to error handler: console.debug('[Beacon]: Event received from untrusted origin') return } diff --git a/src/utils/html-elements.ts b/src/utils/html-elements.ts index 69782e3de..7c146df19 100644 --- a/src/utils/html-elements.ts +++ b/src/utils/html-elements.ts @@ -7,20 +7,24 @@ export const createSanitizedElement = ( const el = document.createElement(type) if (classes.length > 0) { - el.classList.add(...classes.filter((clazz) => !!clazz)) + // Filter empty classnames and add all classes to element + el.classList.add(...classes.filter((clazz) => !!clazz).map((clazz) => sanitizeText(clazz))) } + // Add all attributes to element attributes.forEach((attribute) => { el.setAttribute(sanitizeText(attribute[0]), sanitizeText(attribute[1])) }) if (typeof element === 'object' && Array.isArray(element)) { + // If we get a list of elements, add all of them as children element .filter((childEl): childEl is HTMLElement => !!childEl) .forEach((childEl) => { el.appendChild(childEl) }) } else if (typeof element === 'string') { + // Use `innerText` to assign text to prevent malicious code from being rendered el.innerText = element } else { // NOOP From c2c79af08cb61f608e3cc34bd6d4c24c03966ca1 Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Thu, 7 Apr 2022 11:00:06 -0300 Subject: [PATCH 28/48] fix(): support bold text in toast --- src/events.ts | 17 +++++++++++------ src/ui/toast/Toast.ts | 18 ++++++++++++------ 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/events.ts b/src/events.ts index 3c5ed3564..6492ff0a1 100644 --- a/src/events.ts +++ b/src/events.ts @@ -183,7 +183,8 @@ const showSentToast = async (data: RequestSentInfo): Promise => { } } actions.push({ - text: `No answer from your wallet received yet. Please make sure the wallet is open.` + text: `No answer from your wallet received yet. Please make sure the wallet is open.`, + isBold: true }) actions.push({ text: 'Did you make a mistake?', @@ -274,7 +275,8 @@ const showErrorToast = async ( const actions: ToastAction[] = [ { - text: `${error.title}` + text: error.title, + isBold: true }, { text: error.description @@ -397,7 +399,8 @@ const showPermissionSuccessAlert = async ( actions: [ { text: 'Address', - actionText: `${shortenString(output.address)}` + actionText: shortenString(output.address), + isBold: true }, { text: 'Network', @@ -428,7 +431,8 @@ const showOperationSuccessAlert = async ( walletInfo: data.walletInfo, actions: [ { - text: `${shortenString(output.transactionHash)}`, + text: shortenString(output.transactionHash), + isBold: true, actionText: `Open Blockexplorer ${SVG_EXTERNAL}`, actionCallback: async (): Promise => { const link: string = await blockExplorer.getTransactionLink( @@ -459,7 +463,7 @@ const showSignSuccessAlert = async ( walletInfo: data.walletInfo, actions: [ { - text: `Signature: ${shortenString(output.signature)}`, + text: `Signature: ${shortenString(output.signature)}`, actionText: 'Copy to clipboard', actionCallback: async (): Promise => { navigator.clipboard.writeText(output.signature).then( @@ -531,7 +535,8 @@ const showBroadcastSuccessAlert = async ( walletInfo: data.walletInfo, actions: [ { - text: `${shortenString(output.transactionHash)}`, + text: shortenString(output.transactionHash), + isBold: true, actionText: `Open Blockexplorer ${SVG_EXTERNAL}`, actionCallback: async (): Promise => { const link: string = await blockExplorer.getTransactionLink( diff --git a/src/ui/toast/Toast.ts b/src/ui/toast/Toast.ts index afe3c5f3f..b5bd6aef1 100644 --- a/src/ui/toast/Toast.ts +++ b/src/ui/toast/Toast.ts @@ -7,6 +7,7 @@ import { constructPoweredByBeacon, constructToastContainer } from '../../utils/t export interface ToastAction { text: string + isBold?: boolean actionText?: string actionCallback?(): Promise } @@ -33,7 +34,7 @@ let expandTimeout: number | undefined let globalToastConfig: ToastConfig | undefined const createActionItem = async (toastAction: ToastAction): Promise => { - const { text, actionText, actionCallback } = toastAction + const { text, isBold, actionText, actionCallback } = toastAction const id = await generateGUID() const wrapper = document.createElement('div') @@ -41,9 +42,14 @@ const createActionItem = async (toastAction: ToastAction): Promise removeAllChildNodes(wrapper) + const wrapBold = (element: HTMLElement) => { + return createSanitizedElement('strong', [], [], [element]) + } + if (actionCallback) { if (text.length > 0) { - wrapper.appendChild(createSanitizedElement('p', [], [], text)) + const textEl = createSanitizedElement('p', [], [], text) + wrapper.appendChild(isBold ? wrapBold(textEl) : textEl) } wrapper.appendChild( createSanitizedElement( @@ -55,13 +61,13 @@ const createActionItem = async (toastAction: ToastAction): Promise ) } else if (actionText) { if (text.length > 0) { - wrapper.appendChild( - createSanitizedElement('p', ['beacon-toast__action__item__subtitle'], [], text) - ) + const textEl = createSanitizedElement('p', ['beacon-toast__action__item__subtitle'], [], text) + wrapper.appendChild(isBold ? wrapBold(textEl) : textEl) } wrapper.appendChild(createSanitizedElement('p', [], [], actionText)) } else { - wrapper.appendChild(createSanitizedElement('p', [], [], text)) + const textEl = createSanitizedElement('p', [], [], text) + wrapper.appendChild(isBold ? wrapBold(textEl) : textEl) } if (actionCallback) { From 135a219895d9d292e54327da27cff1f6234958ee Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Thu, 7 Apr 2022 11:02:42 -0300 Subject: [PATCH 29/48] fix(): remove unused html files --- assets/alert/alert-container.html | 65 ----------------------------- assets/alert/alert-default.html | 3 -- assets/alert/alert-pair.html | 15 ------- assets/toast/powered-by-beacon.html | 26 ------------ assets/toast/toast.html | 63 ---------------------------- scripts/generate-wallet-list.ts | 19 +-------- src/utils/replace-in-template.ts | 2 - 7 files changed, 1 insertion(+), 192 deletions(-) delete mode 100644 assets/alert/alert-container.html delete mode 100644 assets/alert/alert-default.html delete mode 100644 assets/alert/alert-pair.html delete mode 100644 assets/toast/powered-by-beacon.html delete mode 100644 assets/toast/toast.html delete mode 100644 src/utils/replace-in-template.ts diff --git a/assets/alert/alert-container.html b/assets/alert/alert-container.html deleted file mode 100644 index 60edc235a..000000000 --- a/assets/alert/alert-container.html +++ /dev/null @@ -1,65 +0,0 @@ -
-
-
- - - - - - - - - -
-
-
-
-
-
-
-
-
-
-

- {{callToAction}} -

- - {{main}} - -
- {{buttons}} -
-
-
-
-
-
diff --git a/assets/alert/alert-default.html b/assets/alert/alert-default.html deleted file mode 100644 index 9443580ff..000000000 --- a/assets/alert/alert-default.html +++ /dev/null @@ -1,3 +0,0 @@ -
- {{body}} -
diff --git a/assets/alert/alert-pair.html b/assets/alert/alert-pair.html deleted file mode 100644 index ec1cf126c..000000000 --- a/assets/alert/alert-pair.html +++ /dev/null @@ -1,15 +0,0 @@ - - -
-

- Scan QR code with a Beacon-compatible wallet. - Learn more -

- {{body}} -
- -
- -
- -
diff --git a/assets/toast/powered-by-beacon.html b/assets/toast/powered-by-beacon.html deleted file mode 100644 index 066cd39c2..000000000 --- a/assets/toast/powered-by-beacon.html +++ /dev/null @@ -1,26 +0,0 @@ - - powered by - - beacon_logo - - - - - Beacon - diff --git a/assets/toast/toast.html b/assets/toast/toast.html deleted file mode 100644 index e38c0c2ff..000000000 --- a/assets/toast/toast.html +++ /dev/null @@ -1,63 +0,0 @@ -
-
- -

{{text}}

- - Open - - -
- - - -
-
-
-
-
diff --git a/scripts/generate-wallet-list.ts b/scripts/generate-wallet-list.ts index b0a719f43..bec65b6e9 100644 --- a/scripts/generate-wallet-list.ts +++ b/scripts/generate-wallet-list.ts @@ -191,22 +191,12 @@ const createAlert = async () => { const css = (await readFile(path.join(ALERT_SRC_DIR, 'alert.css'))).toString('utf-8') const pairCss = (await readFile(path.join(ALERT_SRC_DIR, 'alert-pair.css'))).toString('utf-8') - let containerHtml = (await readFile(path.join(ALERT_SRC_DIR, 'alert-container.html'))).toString( - 'utf-8' - ) - let pairHtml = (await readFile(path.join(ALERT_SRC_DIR, 'alert-pair.html'))).toString('utf-8') - let defaultHtml = (await readFile(path.join(ALERT_SRC_DIR, 'alert-default.html'))).toString( - 'utf-8' - ) const x = { - container: containerHtml, default: { - html: defaultHtml, css: css }, pair: { - html: pairHtml, css: pairCss } } @@ -223,16 +213,9 @@ const createToast = async () => { const css = (await readFile(path.join(TOAST_SRC_DIR, 'toast.css'))).toString('utf-8') - let html = (await readFile(path.join(TOAST_SRC_DIR, 'toast.html'))).toString('utf-8') - let poweredByBeacon = ( - await readFile(path.join(TOAST_SRC_DIR, 'powered-by-beacon.html')) - ).toString('utf-8') - const x = { default: { - html: html, - css: css, - poweredByBeacon + css: css } } diff --git a/src/utils/replace-in-template.ts b/src/utils/replace-in-template.ts deleted file mode 100644 index eae565e7d..000000000 --- a/src/utils/replace-in-template.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const replaceInTemplate = (text: string, placeholder: string, value: string): string => - text.split(`{{${placeholder}}}`).join(value) From 25566286c44e7deaa7c8579b0ffb4d57c83d5df6 Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Thu, 7 Apr 2022 11:06:17 -0300 Subject: [PATCH 30/48] fix(): svg styling --- src/utils/templates.ts | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/utils/templates.ts b/src/utils/templates.ts index dab8f7d70..d3a723a46 100644 --- a/src/utils/templates.ts +++ b/src/utils/templates.ts @@ -198,18 +198,17 @@ export const constructAlertContainer = ( ['height', '40'] ], [ - // TODO: Style - /** - - - */ + createSanitizedElement( + 'style', + [], + [], + `.st0 { + fill: #3880ff; + } + .st1 { + fill: #fff; + }` + ), createSVGPathElement([ [ 'd', From bd297ff81dd32f5bd2e16e29f288d4f2eaa18ce2 Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Thu, 7 Apr 2022 11:35:16 -0300 Subject: [PATCH 31/48] fix(): bold text in toast --- src/ui/toast/Toast.ts | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/ui/toast/Toast.ts b/src/ui/toast/Toast.ts index b5bd6aef1..d38bee8d5 100644 --- a/src/ui/toast/Toast.ts +++ b/src/ui/toast/Toast.ts @@ -42,32 +42,34 @@ const createActionItem = async (toastAction: ToastAction): Promise removeAllChildNodes(wrapper) - const wrapBold = (element: HTMLElement) => { - return createSanitizedElement('strong', [], [], [element]) + const wrapBold = (element: string | HTMLElement[]) => { + return createSanitizedElement('strong', [], [], element) } if (actionCallback) { if (text.length > 0) { - const textEl = createSanitizedElement('p', [], [], text) - wrapper.appendChild(isBold ? wrapBold(textEl) : textEl) + wrapper.appendChild(createSanitizedElement('p', [], [], text)) } + const textEl = createSanitizedElement('span', [], [], actionText) wrapper.appendChild( createSanitizedElement( 'p', [], [], - [createSanitizedElement('a', [], [['id', id]], actionText)] + [createSanitizedElement('a', [], [['id', id]], [isBold ? wrapBold([textEl]) : textEl])] ) ) } else if (actionText) { if (text.length > 0) { - const textEl = createSanitizedElement('p', ['beacon-toast__action__item__subtitle'], [], text) - wrapper.appendChild(isBold ? wrapBold(textEl) : textEl) + wrapper.appendChild( + createSanitizedElement('p', ['beacon-toast__action__item__subtitle'], [], text) + ) } - wrapper.appendChild(createSanitizedElement('p', [], [], actionText)) + const textEl = createSanitizedElement('span', [], [], actionText) + wrapper.appendChild(createSanitizedElement('p', [], [], [isBold ? wrapBold([textEl]) : textEl])) } else { const textEl = createSanitizedElement('p', [], [], text) - wrapper.appendChild(isBold ? wrapBold(textEl) : textEl) + wrapper.appendChild(isBold ? wrapBold([textEl]) : textEl) } if (actionCallback) { From 5b85b2ac7e9a081a47e9b0308bb7a40f6fcfba92 Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Thu, 7 Apr 2022 12:22:41 -0300 Subject: [PATCH 32/48] fix(): correctly display beacon error with data --- examples/dapp.html | 56 +++++++++++++++------ src/errors/BeaconError.ts | 4 +- src/errors/TransactionInvalidBeaconError.ts | 8 +-- src/events.ts | 3 +- src/ui/alert/Alert.ts | 13 ++++- 5 files changed, 60 insertions(+), 24 deletions(-) diff --git a/examples/dapp.html b/examples/dapp.html index ffc195746..73def5f2a 100644 --- a/examples/dapp.html +++ b/examples/dapp.html @@ -48,6 +48,8 @@



+ +



@@ -169,6 +171,44 @@ }) } + // send contract call + const sendContractCall = () => { + return client.getActiveAccount().then(async (activeAccount) => { + const TZ_BUTTON_COLORS_CONTRACT = 'KT1RPW5kTX6WFxg8JK34rGEU24gqEEudyfvz' + const tokenId = '925' + + // Setting the color of TzButton is only possible if you are currently the leader and own a color + // So this call will likely fail + try { + const result = await client.requestOperation({ + operationDetails: [ + { + kind: beacon.TezosOperationType.TRANSACTION, + amount: '0', + destination: TZ_BUTTON_COLORS_CONTRACT, + parameters: { + entrypoint: 'set_color', + value: { + int: tokenId + } + } + } + ] + }) + + console.log(result) + } catch (error) { + console.log(`The contract call failed and the following error was returned:`, error) + } + }) + } + + document.getElementById('reset').addEventListener('click', () => { + client.destroy().then(() => { + window.location.reload() + }) + }) + // Initiate a permission request const requestPermission = (callback) => { client @@ -186,20 +226,8 @@ } // Add event listener to the button - document.getElementById('connect').addEventListener('click', () => { - // Check if we have an active account - client.getActiveAccount().then((activeAccount) => { - if (activeAccount) { - // If we have an active account, send the delegate operation directly - delegate() - } else { - // If we don't have an active account, we need to request permissions first and then send the delegate operation - requestPermission((permissions) => { - delegate() - updateActiveAccount() - }) - } - }) + document.getElementById('sendContractCall').addEventListener('click', () => { + sendContractCall() }) // Add event listener to the button diff --git a/src/errors/BeaconError.ts b/src/errors/BeaconError.ts index 389a49be4..699012943 100644 --- a/src/errors/BeaconError.ts +++ b/src/errors/BeaconError.ts @@ -25,8 +25,8 @@ export abstract class BeaconError implements Error { public title: string = 'Error' // Visible in the UI public description: string // Visible in the UI - public get fullDescription(): string { - return this.description + public get fullDescription(): { description: string; data?: string } { + return { description: this.description } } constructor(errorType: BeaconErrorType, message: string) { diff --git a/src/errors/TransactionInvalidBeaconError.ts b/src/errors/TransactionInvalidBeaconError.ts index 8c6d9bfc4..e52d2222e 100644 --- a/src/errors/TransactionInvalidBeaconError.ts +++ b/src/errors/TransactionInvalidBeaconError.ts @@ -7,12 +7,8 @@ export class TransactionInvalidBeaconError extends BeaconError { public name: string = 'TransactionInvalidBeaconError' public title: string = 'Transaction Invalid' - public get fullDescription(): string { - return `${this.description}
${JSON.stringify(
-      this.data,
-      undefined,
-      2
-    )}
` + public get fullDescription(): { description: string; data?: string } { + return { description: this.description, data: JSON.stringify(this.data, undefined, 2) } } constructor(public readonly data: unknown) { diff --git a/src/events.ts b/src/events.ts index 6492ff0a1..aea2cfc7c 100644 --- a/src/events.ts +++ b/src/events.ts @@ -295,7 +295,8 @@ const showErrorToast = async ( await openAlert({ title: error.title, // eslint-disable-next-line @typescript-eslint/unbound-method - body: error.fullDescription, + body: error.fullDescription.description, + data: error.fullDescription.data, buttons }) } diff --git a/src/ui/alert/Alert.ts b/src/ui/alert/Alert.ts index 661aa4398..61466af8b 100644 --- a/src/ui/alert/Alert.ts +++ b/src/ui/alert/Alert.ts @@ -18,6 +18,7 @@ export interface AlertButton { export interface AlertConfig { title: string body?: string + data?: string timer?: number buttons?: AlertButton[] pairingPayload?: { @@ -166,6 +167,7 @@ const closeAlerts = async (): Promise => // eslint-disable-next-line complexity const openAlert = async (alertConfig: AlertConfig): Promise => { const body = alertConfig.body + const data = alertConfig.data const title = alertConfig.title const timer = alertConfig.timer const pairingPayload = alertConfig.pairingPayload @@ -195,10 +197,19 @@ const openAlert = async (alertConfig: AlertConfig): Promise => { })) ?? []) ] - const formattedBody = pairingPayload + let formattedBody = pairingPayload ? addQR(body) : createSanitizedElement('span', [], [], body ?? '') + if (data) { + formattedBody = createSanitizedElement( + 'span', + [], + [], + [formattedBody, createSanitizedElement('pre', [], [['style', 'text-align: left']], data)] + ) + } + const { style, html } = formatAlert( id, formattedBody, From 1d5b98058c87b2d4862cb28084711c8d6074c44e Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Thu, 7 Apr 2022 15:12:34 -0300 Subject: [PATCH 33/48] feat(): replace old beacon node --- src/transports/clients/P2PCommunicationClient.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/transports/clients/P2PCommunicationClient.ts b/src/transports/clients/P2PCommunicationClient.ts index 9677da7b8..d285044eb 100644 --- a/src/transports/clients/P2PCommunicationClient.ts +++ b/src/transports/clients/P2PCommunicationClient.ts @@ -37,7 +37,7 @@ export const KNOWN_RELAY_SERVERS = [ 'beacon-node-1.hope-2.papers.tech', 'beacon-node-1.hope-3.papers.tech', 'beacon-node-1.hope-4.papers.tech', - 'beacon-node-0.papers.tech:8448' + 'beacon-node-1.hope-5.papers.tech' ] /** From 86abff4c96149c1e853d2db84c436d0796eaf43c Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Thu, 7 Apr 2022 15:50:07 -0300 Subject: [PATCH 34/48] fix(): re-add removed snippet --- examples/dapp.html | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/examples/dapp.html b/examples/dapp.html index 73def5f2a..914f713cd 100644 --- a/examples/dapp.html +++ b/examples/dapp.html @@ -203,12 +203,6 @@ }) } - document.getElementById('reset').addEventListener('click', () => { - client.destroy().then(() => { - window.location.reload() - }) - }) - // Initiate a permission request const requestPermission = (callback) => { client @@ -225,6 +219,22 @@ }) } + document.getElementById('connect').addEventListener('click', () => { + // Check if we have an active account + client.getActiveAccount().then((activeAccount) => { + if (activeAccount) { + // If we have an active account, send the delegate operation directly + delegate() + } else { + // If we don't have an active account, we need to request permissions first and then send the delegate operation + requestPermission((permissions) => { + delegate() + updateActiveAccount() + }) + } + }) + }) + // Add event listener to the button document.getElementById('sendContractCall').addEventListener('click', () => { sendContractCall() From 10716a1145f7162b27967b04102711df2de5f229 Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Thu, 7 Apr 2022 15:56:31 -0300 Subject: [PATCH 35/48] chore(release): v2.3.11-beta.0 --- package-lock.json | 4 ++-- package.json | 2 +- src/constants.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 014748a72..d9444f929 100755 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@airgap/beacon-sdk", - "version": "2.3.10", + "version": "2.3.11-beta.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@airgap/beacon-sdk", - "version": "2.3.10", + "version": "2.3.11-beta.0", "license": "MIT", "dependencies": { "@types/chrome": "0.0.115", diff --git a/package.json b/package.json index b14899ad9..8fdc3f628 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@airgap/beacon-sdk", - "version": "2.3.10", + "version": "2.3.11-beta.0", "description": "The beacon-sdk allows you to easily connect DApps with Wallets through P2P communication or a chrome extension.", "main": "dist/cjs/index.js", "module": "dist/esm/index.js", diff --git a/src/constants.ts b/src/constants.ts index bff09ca55..58d10049f 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,2 +1,2 @@ -export const SDK_VERSION: string = '2.3.10' +export const SDK_VERSION: string = '2.3.11-beta.0' export const BEACON_VERSION: string = '2' From 3aa59ad9c7e47bdc4055d0cd8c011e485a584fdd Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Thu, 7 Apr 2022 16:04:00 -0300 Subject: [PATCH 36/48] fix(): improve types --- src/ui/toast/Toast.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/toast/Toast.ts b/src/ui/toast/Toast.ts index d38bee8d5..80ef7f8cd 100644 --- a/src/ui/toast/Toast.ts +++ b/src/ui/toast/Toast.ts @@ -112,7 +112,7 @@ const formatToastText = (html: string): HTMLElement[] => { if (splits.length === 1) { return [createSanitizedElement('span', [], [], html)] } else { - const out = [] + const out: HTMLElement[] = [] for (let x = 0; x < splits.length; x++) { out.push(createSanitizedElement('span', [], [], splits[x])) if (x < splits.length - 1) { From d54a02c4f665b81a6e6f1e91e3807dc1ad3b1736 Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Thu, 7 Apr 2022 16:08:37 -0300 Subject: [PATCH 37/48] fix(): remove innerHTML in examples --- examples/dapp.html | 14 +++++++------- examples/wallet.html | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/dapp.html b/examples/dapp.html index 914f713cd..f797fac69 100644 --- a/examples/dapp.html +++ b/examples/dapp.html @@ -124,13 +124,13 @@ const updateActiveAccount = () => { client.getActiveAccount().then((activeAccount) => { if (activeAccount) { - document.getElementById('activeAccount').innerHTML = activeAccount.address - document.getElementById('activeAccountNetwork').innerHTML = activeAccount.network.type - document.getElementById('activeAccountTransport').innerHTML = activeAccount.origin.type + document.getElementById('activeAccount').innerText = activeAccount.address + document.getElementById('activeAccountNetwork').innerText = activeAccount.network.type + document.getElementById('activeAccountTransport').innerText = activeAccount.origin.type } else { - document.getElementById('activeAccount').innerHTML = '' - document.getElementById('activeAccountNetwork').innerHTML = '' - document.getElementById('activeAccountTransport').innerHTML = '' + document.getElementById('activeAccount').innerText = '' + document.getElementById('activeAccountNetwork').innerText = '' + document.getElementById('activeAccountTransport').innerText = '' } }) } @@ -139,7 +139,7 @@ // Display the active account in the UI const updateColorMode = () => { client.getColorMode().then((colorMode) => { - document.getElementById('activeColorMode').innerHTML = colorMode + document.getElementById('activeColorMode').innerText = colorMode }) } updateColorMode() diff --git a/examples/wallet.html b/examples/wallet.html index c5c83794f..953705f4c 100644 --- a/examples/wallet.html +++ b/examples/wallet.html @@ -45,7 +45,7 @@ }) const setStatus = (status) => { - document.getElementById('status').innerHTML = status ? 'Status: ' + status : status + document.getElementById('status').innerText = status ? 'Status: ' + status : status } // Add event listener to the button From 02d9a32ffa4807f3638c03d80508991b83fd8b27 Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Thu, 7 Apr 2022 17:25:17 -0300 Subject: [PATCH 38/48] fix(): add additional origin check --- src/transports/PostMessageTransport.ts | 2 +- src/transports/clients/PostMessageClient.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/transports/PostMessageTransport.ts b/src/transports/PostMessageTransport.ts index 7f9c5feec..606fcf4dd 100644 --- a/src/transports/PostMessageTransport.ts +++ b/src/transports/PostMessageTransport.ts @@ -102,7 +102,7 @@ export class PostMessageTransport< // eslint-disable-next-line @typescript-eslint/no-explicit-any const fn = (event: any): void => { - if (event.source !== windowRef) { + if (event.source !== window || event.origin !== location.origin) { // TODO: Add to error handler: console.debug('[Beacon]: Event received from untrusted origin') return } diff --git a/src/transports/clients/PostMessageClient.ts b/src/transports/clients/PostMessageClient.ts index 4da7a76c9..d04c8e2f8 100644 --- a/src/transports/clients/PostMessageClient.ts +++ b/src/transports/clients/PostMessageClient.ts @@ -84,7 +84,7 @@ export class PostMessageClient extends MessageBasedClient { ): Promise { // eslint-disable-next-line @typescript-eslint/no-explicit-any const fn = async (event: any): Promise => { - if (event.source !== windowRef) { + if (event.source !== window || event.origin !== location.origin) { // TODO: Add to error handler: console.debug('[Beacon]: Event received from untrusted origin') return } @@ -138,7 +138,7 @@ export class PostMessageClient extends MessageBasedClient { private async subscribeToMessages(): Promise { windowRef.addEventListener('message', (message) => { - if ((message as any).source !== windowRef) { + if ((message as any).source !== window || (message as any).origin !== location.origin) { // TODO: Add to error handler: console.debug('[Beacon]: Event received from untrusted origin') return } From 2b5723c530f4d72c5cf7bb1cfc2aaa699f73186e Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Thu, 7 Apr 2022 17:48:58 -0300 Subject: [PATCH 39/48] chore(): code cleanup --- src/ui/alert/Alert.ts | 1 - src/ui/alert/PairingAlert.ts | 2 +- src/utils/templates.ts | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/ui/alert/Alert.ts b/src/ui/alert/Alert.ts index 61466af8b..464b17ad6 100644 --- a/src/ui/alert/Alert.ts +++ b/src/ui/alert/Alert.ts @@ -40,7 +40,6 @@ if (typeof window !== 'undefined' && typeof window.document !== 'undefined') { const timeout: Record = {} const addQR = (dataString?: string): HTMLElement => { - console.log('dataString', dataString) if (typeof dataString === 'string') { return createSanitizedElement( 'div', diff --git a/src/ui/alert/PairingAlert.ts b/src/ui/alert/PairingAlert.ts index 547ccb213..44e01b6d2 100644 --- a/src/ui/alert/PairingAlert.ts +++ b/src/ui/alert/PairingAlert.ts @@ -181,7 +181,7 @@ export const preparePairingAlert = async ( ), createSanitizedElement('img', ['beacon--selection__name__lg'], [], wallet.name) ] - : [undefined]) + : []) ] ) ) diff --git a/src/utils/templates.ts b/src/utils/templates.ts index d3a723a46..6ed7c3bac 100644 --- a/src/utils/templates.ts +++ b/src/utils/templates.ts @@ -158,7 +158,7 @@ export const constructPoweredByBeacon = (): HTMLElement => { ]) ] ), - document.createTextNode('Beacon') as any + document.createTextNode('Beacon') ] ) } From ac06894727f87524a2741dcd5fbb41f896702d54 Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Fri, 8 Apr 2022 00:01:53 -0300 Subject: [PATCH 40/48] fix(): space between wallet name and text --- src/events.ts | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/events.ts b/src/events.ts index aea2cfc7c..5da5c1aba 100644 --- a/src/events.ts +++ b/src/events.ts @@ -208,7 +208,7 @@ const showSentToast = async (data: RequestSentInfo): Promise => { }) openToast({ - body: `Request sent to {{wallet}}`, + body: `Request sent to\u00A0 {{wallet}}`, walletInfo: data.walletInfo, state: 'loading', actions, @@ -222,14 +222,16 @@ const showAcknowledgedToast = async (data: { walletInfo: WalletInfo }): Promise => { openToast({ - body: 'Awaiting confirmation in {{wallet}}', + body: 'Awaiting confirmation in\u00A0 {{wallet}}', state: 'acknowledge', walletInfo: data.walletInfo }).catch((toastError) => console.error(toastError)) } const showPrepare = async (data: { walletInfo?: WalletInfo }): Promise => { - const text = data.walletInfo ? `Preparing Request for {{wallet}}...` : 'Preparing Request...' + const text = data.walletInfo + ? `Preparing Request for\u00A0 {{wallet}}...` + : 'Preparing Request...' openToast({ body: text, state: 'prepare', @@ -304,7 +306,7 @@ const showErrorToast = async ( } await openToast({ - body: `{{wallet}} has returned an error`, + body: `{{wallet}}\u00A0 has returned an error`, timer: response.errorResponse.errorType === BeaconErrorType.ABORTED_ERROR ? SUCCESS_TIMER @@ -393,7 +395,7 @@ const showPermissionSuccessAlert = async ( const { output } = data await openToast({ - body: `{{wallet}} has granted permission`, + body: `{{wallet}}\u00A0 has granted permission`, timer: SUCCESS_TIMER, walletInfo: data.walletInfo, state: 'finished', @@ -426,7 +428,7 @@ const showOperationSuccessAlert = async ( const { account, output, blockExplorer } = data await openToast({ - body: `{{wallet}} successfully submitted operation`, + body: `{{wallet}}\u00A0 successfully submitted operation`, timer: SUCCESS_TIMER, state: 'finished', walletInfo: data.walletInfo, @@ -458,7 +460,7 @@ const showSignSuccessAlert = async ( ): Promise => { const output = data.output await openToast({ - body: `{{wallet}} successfully signed payload`, + body: `{{wallet}}\u00A0 successfully signed payload`, timer: SUCCESS_TIMER, state: 'finished', walletInfo: data.walletInfo, @@ -493,7 +495,7 @@ const showSignSuccessAlert = async ( // ): Promise => { // const output = data.output // await openToast({ -// body: `{{wallet}} successfully ${ +// body: `{{wallet}}\u00A0 successfully ${ // data.output.cryptoOperation === EncryptionOperation.ENCRYPT ? 'encrypted' : 'decrypted' // } payload`, // timer: SUCCESS_TIMER, @@ -530,7 +532,7 @@ const showBroadcastSuccessAlert = async ( const { network, output, blockExplorer } = data await openToast({ - body: `{{wallet}} successfully injected operation`, + body: `{{wallet}}\u00A0 successfully injected operation`, timer: SUCCESS_TIMER, state: 'finished', walletInfo: data.walletInfo, From e4a6ff137570cf3a322287101cd78652a7cb459d Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Fri, 8 Apr 2022 00:02:19 -0300 Subject: [PATCH 41/48] fix(): add space between text and link --- src/utils/templates.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/templates.ts b/src/utils/templates.ts index 6ed7c3bac..e4fc6603a 100644 --- a/src/utils/templates.ts +++ b/src/utils/templates.ts @@ -318,7 +318,7 @@ export const constructPairAlert = ( ['beacon-list__title'], [['id', 'beacon-title']], [ - document.createTextNode('Scan QR code with a Beacon-compatible wallet.'), + document.createTextNode('Scan QR code with a Beacon-compatible wallet.\u00A0'), createSanitizedElement( 'a', [], From 12d9add3ccafb8de8e7acc7a713334dee38d7cf7 Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Fri, 8 Apr 2022 00:02:30 -0300 Subject: [PATCH 42/48] fix(): qr hover flicker issue --- src/ui/alert/Alert.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/ui/alert/Alert.ts b/src/ui/alert/Alert.ts index 464b17ad6..ffb11e78c 100644 --- a/src/ui/alert/Alert.ts +++ b/src/ui/alert/Alert.ts @@ -46,12 +46,18 @@ const addQR = (dataString?: string): HTMLElement => { [], [['id', 'beacon--qr__container']], [ - createSanitizedElement('div', [], [['id', 'beacon--qr__copy__container']], ''), createSanitizedElement( - 'button', - ['beacon-modal__button--outline'], - [['id', 'beacon--qr__copy']], - 'Copy' + 'div', + [], + [['id', 'beacon--qr__copy__container']], + [ + createSanitizedElement( + 'button', + ['beacon-modal__button--outline'], + [['id', 'beacon--qr__copy']], + 'Copy' + ) + ] ) ] ) From 6d4d59a9bcfbd721fbb85d80a38a17a5eae45a66 Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Fri, 8 Apr 2022 00:14:43 -0300 Subject: [PATCH 43/48] chore(release): v2.3.11 --- .gitlab-ci.yml | 5 +++-- package-lock.json | 4 ++-- package.json | 2 +- src/constants.ts | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f2482bdae..827783c43 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -75,8 +75,9 @@ publish_beta: publish: stage: publish - only: - - master + # TODO: Enable again + # only: + # - master when: manual script: - docker run --env NPM_AUTH_TOKEN --name unit-$CI_COMMIT_SHA $GOOGLE_TAG ./npm-ci-publish.sh diff --git a/package-lock.json b/package-lock.json index d9444f929..e25bd32bf 100755 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@airgap/beacon-sdk", - "version": "2.3.11-beta.0", + "version": "2.3.11", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@airgap/beacon-sdk", - "version": "2.3.11-beta.0", + "version": "2.3.11", "license": "MIT", "dependencies": { "@types/chrome": "0.0.115", diff --git a/package.json b/package.json index 8fdc3f628..c841aa748 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@airgap/beacon-sdk", - "version": "2.3.11-beta.0", + "version": "2.3.11", "description": "The beacon-sdk allows you to easily connect DApps with Wallets through P2P communication or a chrome extension.", "main": "dist/cjs/index.js", "module": "dist/esm/index.js", diff --git a/src/constants.ts b/src/constants.ts index 58d10049f..f2708d1da 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,2 +1,2 @@ -export const SDK_VERSION: string = '2.3.11-beta.0' +export const SDK_VERSION: string = '2.3.11' export const BEACON_VERSION: string = '2' From 49e45fd5c6a82881e1dc9fdadc0270d6ca0eb1bd Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Fri, 8 Apr 2022 00:54:06 -0300 Subject: [PATCH 44/48] fix(): render svg icon external --- src/events.ts | 8 ++++---- src/ui/toast/Toast.ts | 15 ++++++++++++--- src/utils/html-elements.ts | 24 ++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/events.ts b/src/events.ts index 5da5c1aba..798160917 100644 --- a/src/events.ts +++ b/src/events.ts @@ -31,8 +31,6 @@ const logger = new Logger('BeaconEvents') const SUCCESS_TIMER: number = 5 * 1000 -const SVG_EXTERNAL: string = `` - /** * The different events that can be emitted by the beacon-sdk */ @@ -436,7 +434,8 @@ const showOperationSuccessAlert = async ( { text: shortenString(output.transactionHash), isBold: true, - actionText: `Open Blockexplorer ${SVG_EXTERNAL}`, + actionText: `Open Blockexplorer`, + actionLogo: 'external', actionCallback: async (): Promise => { const link: string = await blockExplorer.getTransactionLink( output.transactionHash, @@ -540,7 +539,8 @@ const showBroadcastSuccessAlert = async ( { text: shortenString(output.transactionHash), isBold: true, - actionText: `Open Blockexplorer ${SVG_EXTERNAL}`, + actionText: `Open Blockexplorer`, + actionLogo: 'external', actionCallback: async (): Promise => { const link: string = await blockExplorer.getTransactionLink( output.transactionHash, diff --git a/src/ui/toast/Toast.ts b/src/ui/toast/Toast.ts index 80ef7f8cd..fdc1846a0 100644 --- a/src/ui/toast/Toast.ts +++ b/src/ui/toast/Toast.ts @@ -2,13 +2,14 @@ import { getColorMode } from '../../colorMode' import { WalletInfo } from '../../events' import { generateGUID } from '../../utils/generate-uuid' import { toastTemplates } from './toast-templates' -import { createSanitizedElement } from '../../utils/html-elements' +import { createIconSVGExternal, createSanitizedElement } from '../../utils/html-elements' import { constructPoweredByBeacon, constructToastContainer } from '../../utils/templates' export interface ToastAction { text: string isBold?: boolean actionText?: string + actionLogo?: 'external' actionCallback?(): Promise } @@ -34,7 +35,7 @@ let expandTimeout: number | undefined let globalToastConfig: ToastConfig | undefined const createActionItem = async (toastAction: ToastAction): Promise => { - const { text, isBold, actionText, actionCallback } = toastAction + const { text, isBold, actionText, actionLogo, actionCallback } = toastAction const id = await generateGUID() const wrapper = document.createElement('div') @@ -50,7 +51,15 @@ const createActionItem = async (toastAction: ToastAction): Promise if (text.length > 0) { wrapper.appendChild(createSanitizedElement('p', [], [], text)) } - const textEl = createSanitizedElement('span', [], [], actionText) + const textEl = createSanitizedElement( + 'span', + [], + [], + [ + createSanitizedElement('span', [], [], actionText), + actionLogo && actionLogo === 'external' ? createIconSVGExternal() : undefined + ] + ) wrapper.appendChild( createSanitizedElement( 'p', diff --git a/src/utils/html-elements.ts b/src/utils/html-elements.ts index 7c146df19..a4cb0bbe7 100644 --- a/src/utils/html-elements.ts +++ b/src/utils/html-elements.ts @@ -83,6 +83,30 @@ export const createSVGGElement = (element: SVGPathElement[]): SVGGElement => { return el } +export const createIconSVGExternal = () => { + return createSVGElement( + ['svg-inline--fa', 'fa-external-link-alt', 'fa-w-16'], + [ + ['aria-hidden', 'true'], + ['focusable', 'false'], + ['data-prefix', 'fas'], + ['data-icon', 'external-link-alt'], + ['role', 'img'], + ['xmlns', 'http://www.w3.org/2000/svg'], + ['viewBox', '0 0 512 512'] + ], + [ + createSVGPathElement([ + ['fill', 'currentColor'], + [ + 'd', + 'M432,320H400a16,16,0,0,0-16,16V448H64V128H208a16,16,0,0,0,16-16V80a16,16,0,0,0-16-16H48A48,48,0,0,0,0,112V464a48,48,0,0,0,48,48H400a48,48,0,0,0,48-48V336A16,16,0,0,0,432,320ZM488,0h-128c-21.37,0-32.05,25.91-17,41l35.73,35.73L135,320.37a24,24,0,0,0,0,34L157.67,377a24,24,0,0,0,34,0L435.28,133.32,471,169c15,15,41,4.5,41-17V24A24,24,0,0,0,488,0Z' + ] + ]) + ] + ) +} + export const sanitizeText = (text: string): string => { const div = document.createElement('div') div.innerText = text From a0017600b9d407225ad7a159b34dc5eef2e5fa0b Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Fri, 8 Apr 2022 14:18:15 -0300 Subject: [PATCH 45/48] fix(): ssr issue --- src/transports/PostMessageTransport.ts | 2 +- src/transports/clients/PostMessageClient.ts | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/transports/PostMessageTransport.ts b/src/transports/PostMessageTransport.ts index 606fcf4dd..ced23bdd5 100644 --- a/src/transports/PostMessageTransport.ts +++ b/src/transports/PostMessageTransport.ts @@ -102,7 +102,7 @@ export class PostMessageTransport< // eslint-disable-next-line @typescript-eslint/no-explicit-any const fn = (event: any): void => { - if (event.source !== window || event.origin !== location.origin) { + if (event.source !== windowRef || event.origin !== windowRef.location.origin) { // TODO: Add to error handler: console.debug('[Beacon]: Event received from untrusted origin') return } diff --git a/src/transports/clients/PostMessageClient.ts b/src/transports/clients/PostMessageClient.ts index d04c8e2f8..7a2db2e0e 100644 --- a/src/transports/clients/PostMessageClient.ts +++ b/src/transports/clients/PostMessageClient.ts @@ -84,7 +84,7 @@ export class PostMessageClient extends MessageBasedClient { ): Promise { // eslint-disable-next-line @typescript-eslint/no-explicit-any const fn = async (event: any): Promise => { - if (event.source !== window || event.origin !== location.origin) { + if (event.source !== windowRef || event.origin !== windowRef.location.origin) { // TODO: Add to error handler: console.debug('[Beacon]: Event received from untrusted origin') return } @@ -138,7 +138,10 @@ export class PostMessageClient extends MessageBasedClient { private async subscribeToMessages(): Promise { windowRef.addEventListener('message', (message) => { - if ((message as any).source !== window || (message as any).origin !== location.origin) { + if ( + (message as any).source !== windowRef || + (message as any).origin !== windowRef.location.origin + ) { // TODO: Add to error handler: console.debug('[Beacon]: Event received from untrusted origin') return } From 4d37641cb0b2fb4d630f0a14cc469017cc54f856 Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Fri, 8 Apr 2022 14:52:31 -0300 Subject: [PATCH 46/48] chore(release): v2.3.12 --- package-lock.json | 4 ++-- package.json | 2 +- src/constants.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index e25bd32bf..8f268d690 100755 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@airgap/beacon-sdk", - "version": "2.3.11", + "version": "2.3.12", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@airgap/beacon-sdk", - "version": "2.3.11", + "version": "2.3.12", "license": "MIT", "dependencies": { "@types/chrome": "0.0.115", diff --git a/package.json b/package.json index c841aa748..01135a1e1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@airgap/beacon-sdk", - "version": "2.3.11", + "version": "2.3.12", "description": "The beacon-sdk allows you to easily connect DApps with Wallets through P2P communication or a chrome extension.", "main": "dist/cjs/index.js", "module": "dist/esm/index.js", diff --git a/src/constants.ts b/src/constants.ts index f2708d1da..4ffc42805 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,2 +1,2 @@ -export const SDK_VERSION: string = '2.3.11' +export const SDK_VERSION: string = '2.3.12' export const BEACON_VERSION: string = '2' From 43f14a17f57f4f1101a43f0c490dd47b9897055b Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Wed, 13 Apr 2022 08:45:00 -0300 Subject: [PATCH 47/48] fix(): connect button not shown on android --- src/ui/alert/PairingAlert.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/alert/PairingAlert.ts b/src/ui/alert/PairingAlert.ts index 44e01b6d2..43dd4c991 100644 --- a/src/ui/alert/PairingAlert.ts +++ b/src/ui/alert/PairingAlert.ts @@ -65,7 +65,7 @@ export const preparePairingAlert = async ( const titleEl = createSanitizedElement('div', ['beacon-list__title'], [], button.title) const buttonEl = createSanitizedElement( 'button', - ['beacon-modal__button connect__btn'], + ['beacon-modal__button', 'connect__btn'], [], button.text ) From 9bf8978516998f48986fd0d8c9468f1054c6254e Mon Sep 17 00:00:00 2001 From: Andreas Gassmann Date: Wed, 13 Apr 2022 08:45:54 -0300 Subject: [PATCH 48/48] chore(release): v2.3.13 --- package-lock.json | 4 ++-- package.json | 2 +- src/constants.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8f268d690..b82345743 100755 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@airgap/beacon-sdk", - "version": "2.3.12", + "version": "2.3.13", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@airgap/beacon-sdk", - "version": "2.3.12", + "version": "2.3.13", "license": "MIT", "dependencies": { "@types/chrome": "0.0.115", diff --git a/package.json b/package.json index 01135a1e1..94002420f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@airgap/beacon-sdk", - "version": "2.3.12", + "version": "2.3.13", "description": "The beacon-sdk allows you to easily connect DApps with Wallets through P2P communication or a chrome extension.", "main": "dist/cjs/index.js", "module": "dist/esm/index.js", diff --git a/src/constants.ts b/src/constants.ts index 4ffc42805..a1920f58a 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,2 +1,2 @@ -export const SDK_VERSION: string = '2.3.12' +export const SDK_VERSION: string = '2.3.13' export const BEACON_VERSION: string = '2'