From bcf146864577d4a12479fca22f17c655a1f5e63a Mon Sep 17 00:00:00 2001 From: Bruno Skvorc Date: Tue, 30 Jul 2019 18:10:46 +0200 Subject: [PATCH] Fixed contract generation and deposits. Improved faucet. Fixed deterministic re-run. --- .../faucet/public/assets/images/homepage.png | Bin 0 -> 42779 bytes .../assets/javascripts/application/index.js | 12 +- deploy/faucet/public/views/index.pug | 8 +- package.json | 2 +- start.js | 103 +++++++++++++----- 5 files changed, 84 insertions(+), 41 deletions(-) create mode 100644 deploy/faucet/public/assets/images/homepage.png diff --git a/deploy/faucet/public/assets/images/homepage.png b/deploy/faucet/public/assets/images/homepage.png new file mode 100644 index 0000000000000000000000000000000000000000..494db488688c57b14ec179ed6b3a17ab4dbb2d16 GIT binary patch literal 42779 zcmd432UJsW^d=ZYP(iSPD4^Jtu5_g;3M$fs&_hH7LP_YM7ezotiiIv+I)t7;0z^fM z^j;D|M@kYR0-=P2efXc5ot@pCv$K14&b)Jg2PeGz%Dvyc-*@jXZw>UcdAJ0*Kp+s$ zqlfpOfe7XWkvW^zs7dAmgVK2mBRqayc$`XEpgPx6 zm1UK2lr_@inu=q1Lx8am@b(~(#z&pay#xPlugKry{daTx$ZO$$Hy2JG2BrgC8dr{c z{JRN#cwz3}4d{bL8{5CTOE2Tt|J~d_aPiQ;n>PplmwV9b>K_xTMa%(Ue9>a6T@sfY z2$r25vc;0hIfVX=Q&F4Lob2|J5}B^Y;{7F+kE3vBK%lA26TqZHwek%vUoIuw!IV^c z9!eN>)Q&f6ef7Ab2ZiojcPd89i5K4_f)fxO3J!#?&2{wUY%B3q_E@pTG~j>3{wRe;1)`mol6)o@*I`J#9gWCf>LphL&Rf)_5)==)u{sO}IZYK{Z)Oyx2 zXMU6-jU%~CD?TLr4jTJ|DyBEW3oP4LD&P|W5h z4kEw8t>a0^?+VHe&nmb@#Tr~sJEI*4KgYJ|yY(uTjq(Fv*Bk4{IW7nm=QyNtrB*2r zaZ;8n(dWKT?@&`?3=Tt*;csiRV2Otl@+mEyh*I6-^z#IM}(%QYH2!}mgricA2Uux zrJ^sjl3eG}PXdA*Q9N9>tI?cb8ZhaVh<(VOCX87lir7lCOEtRV!puG_^Q^ z{lP*u+Y9yAbfzV82vxd_vDxd7K@t#?0ePien~3~Y>R@GmqffVj^M|H3!22^1`xuaU z7w{44^##`|DM@h%CVq%0LlrTy#JbDRi1sQKY1WY#zjPHcZT)n=W%WMaX?GEqoZM7n z1ADoM>tS3~$GXw}A^fPL%f^VDfW$2fFw%nPeUnsrCnU#uz<4F5T;Wp)QSpjRJxR~e zq>rwuc9dw|%`MLE)yT}>kaW*#LRHEswk;-*&dP^Haq_{AQj8J!?L`yvF!l#Ytzf;^ zxUx+0mpAyrq3mJ-cxQF1`VBY8bC1d*s->-uS>vWDnHvN;-ojT20)15qKe0UqMtUub z@}U-vN>m)6)pKqe-^}`xUEgjg*6*^KC*l0T$S$m&xcpaOVPULGzq;yU?YpC@_B1p< zvehmXu95FiT%=buk~lZ|X2nkGesbL%B8mys7WjB28xkC^yG!BROyYWo@XZWsfP9`+ zMTP7m&uZ!sRQ^q8BuS5@_;hIh`Y+NljzLb!#)Y5f4 zoHyl~3HTyYxdmILa{KyZ@Oq$7$1k}6N|n&~#@evm*w7voMr>Gce)9v#Pv6=QDgh(n zxgYCoX__kXNCGh{^f3_5o*Llk^Yl;LXmfJC+2)66Wm$^RrguSdB^Y98ET6^2#T@Ds zReszLC;Sy=Y*wG9r{xm~%hVcnUJjvSLH;=#M&G6(^uIq;7{9pTe`fmiT(>4qWABHwM?JsEA0$Fmg?g$x|xn3 z+v|=&Yuzt!Dea)8eMr`v-eNv?f698UQHBKwgq2FK%_LO|)6pXh9afn#wqSIs;e-5R zT3f+_p?o0Fh4+A?hVo_KRhB-BZDkIDa*p-1W5%4Tc*VR7zGb<~tl*KKcoxraE6GK* zZ)U)qaXPl~=doSoh(Qh&v>06CW-TWgDq(_4- z7{EE6zHTXlWkBccpBna-=c|y?nKviBRUL1HpA-z6rJ1^*k;~aL5PD~%A9CO)9c>ve zSdm(HeD;0L<8is_$D&&6H)>pCNr*{h2io7R3gvOzAptKK(^Do)TR~iOlA!`@#yucU z(RgRj>o#@^CwX1`G*5k%3NZox%PU{#Qo&TM?f7Xj@uEUoLF$9~It3Fe6Xn8Q&uA$L z@BE>LxyxZu)RYf6%BNNu1SM3{fw<%CAOYk=4+Ie@mKmIySLgRV?JS&7jU7_w0f9ay zwT#|qLsi-ad>+f!rlNb&syk435SX-K%%B!s%$uZzI#bbVvCv{~ygjA^cNzO#!a0AC zOKebno}~}3MwHs}3x5)rAM?pTI0v-%lLIBdj*DnJ{t9!8_3@%BeLG?|3rikXIsBd{ z;>109m89Mrh#~8b&%<+kF4KZ-8S%B|7Q-uTUhLT>-~fRGpwQ0=CZo7kwnjZ58TqYe z^HNM)F6>uF2z!+i(al-UY^X6u8C$C7;6v!2;G1deaaZ+kGh-IK~)qXIca-K_{7TF zJwh@6&MTl!YTDYtK!!YOf`ENKz5A0sK{wwG)73bjULo!3g=MhN*76kQ4#FCiI z@;vE9z@rFD0ad7;y-R28upby{%;3UJEk1XSw}eM2*qOWg?Xa<*0?dF@n_Wql$$)^J9d!i?n;6}N24lOOhhTg5?HDgE;^W3=q zmC7K%Y47YO><{k=CeCOtz^ghUXvkU18(v8jGOet?S~{tXm#$Z|zd2awG`stW}DPt;^PV#ZQl;zKDr$AT~QpEr^;l0kcQ!2V$@V zA8lbH9*n^@h}3$o=dW>ZbGn@?#KfiRD;Y?0L|?Cn0egBjTyQpmRw12MIUpn3DOS|U z!8sX#E|nZlnlBO;Of9-Zm^U3up(dlfJQFPCV2*vmPsl@g{iOrgv}8I%wA2Y~|035E z_gz24YXaHPfkMV##ix!F&i@(4T;vyKj4RjKzyVF|0rC#+CA(0OZ)4$`HF@Oo}D;9qM6U| zxq&&P-q6Rv-P6-kwU;{D9nEp6sIoSAU5e4}s64)5fhStK*q(Bj$5m(udUn2l#*`9# z>VmIzE4CwVw-1bG798u6$V}OXOheoNkW|8kjc>U#7t>Hh_t;wNH^xvhGj5#1*&6rw zFZriG>-${Zx+&pVg<9P8T>ESFE$fYDR!emLO0{%){Xp6A5tMI3v4Mq{FB_6b9E1NfHn$kfR@u){8C9oMoNm z0K(2`^g7MVCWrv8B?Hj8zR!Z5RvdfIFC3YQ3_p-)Dlm`zZYIy()v8U2fdCV@ z6uTc{u6R7oFyoKJ7Ij*s*;;POb*ax6P1O1>o>%lP#TLP^gp#9GuF)if;`@pDJkKE) z@yWpKQdLz&y#1G$%Xja#hRJeU6=ZLm8Ngpb0@=qKmHpuRu`M)aJ|X>dD)>c9k;`8H zW$6wEr@KeS(~+w$#(qDs#HltlB3pQI$T=y2P?w2M2t~E=iEEO>O6MvV!jGa9?dswl z@Lz|o6-i{c?|algMttSNt1qKRuP^IvqzKufiTPSo z4>Fo$Syra!;_AvjU;FM;UM4e#>r<$`HNa*1wD*J2$uUFW)a3g%_W&LV3{8hU%4wVj z{Fx%5>q9b;Qo@eP^cTUkA7S^2$3BPgHgqh4T_iCgayIywQ1)~H*B37XY5#?{fwgKx zo`S-Pn_3%Uo_Cu*4CCP88{{*^GcX{Ly)KY|eSCyxYkNDAKm@o+N#$EHr30GS&vkbV z-}IA({#M*`yv|X8&o$3YLO5l_g!~(MJVb)?r3A7)W`S^PuTDIzoJz z)1&*_$&Ozo$k|u0<0;p5m` z*n2UGXd4Q>@9v1(o{>Ta!A2u$t9Kh4l+=4l75AO{zsf2?i>{f#d%RvY{Xy8FDzh!g zkCp56-}=B);N$Vrd9Lwt%!M?U5y^Nbs#|)j02K|LwHxf-Cxur8|VFb0>M(S zYbSK)i&{d=?NX>W9#x3~kUPBWLae-=5*^4BO2FHOM^mBCNtULync9r6^W$=^#@HWI97M*PBt45H0SPAjT;Y9^p`6x3Kf4r?Y-u=? zNllQN%1i~~NMYnYHXL3wFmMzRsc4lFu51O;SN-HnP3Ut4N@qD>ZG_9R+~acSzzR0d z1@C>3I?g6od`VNszh=Y5$T5dohf+Z2M`(245G#|jthzj4U(${o7)dZmN;OGb5e3MR z!ah=5YT@ZjHlcDZy!W^pd4PvQXgT3W;#t5S{)-02JL|FoqC--kzH2SkY?h{=Q=znDi@PBN9;*cY+SBF@RAkhM6%suj06`r53dR-d8aM&H3 z53M?0TwshK|A2KB6sL5L_d>Yn)R{Z$2c5?%bLZ#gwh{r^M=q_u|0%J~GrucYHae4C zBdia?@et5rU?i+O+rG}Hu-;xbDHNBz zkH4LVioojT)1xnG~CECy|}Cppc%mE458p@6SwUu)8UVzWAczm>t3kI;nZ}5NIlnpPzqhJ`sw@Pxp8F5rrsY zERA?@2y?MjFIG!MrBqf{roaa)?K(~u7Zv?2gHH^$K^p`8o}zG+v8w#xM$>YWj6`dH z$Ba<+ilFUY&0}M)kDMC+JGsXiQGgTXfECaf*pEG+!(%nhi4A{#aMv7&NszQ8WZn(? znCCz5CMqqBNrVQEv4EAs&A+{#?#AE-=+!^5^}_x5BjTp0^`2z%@Ma=@x0$t37BbeS zEkcC?sFsrRK1y1RX0j(2$~TbT^US#~J3NF}$#*B7aam;h4J2q|2vNc=xzlV4VLt$6 z5Jo7#+Szn%BwBgA^1-xDe5B1&3~7%PRY5%R&AuI1!zY-l*6*vc<(MAmv4}^-A3!kKk^pzk<#uNs%*;GbRdh`k8o0aptD~dp)vE(KIy#=4QTYf3EJ>MGKf6*D#6UWe zur;`hodk6TrHUol6?13##t8hntSpd+UGqH($DFri?QWx--wZ2?i+A9Mtd}RMo_&9n z;yr?OR9{l_*DH-$DTZ?yC4L&Kav*+v^vPwo#C*lOz$r^^th+w{c z{YllKhHWv2&y+zlh{aO!u8rGy4I9IjD9iBkIvC4p*oTJI79n5|5ywOjIa<+wd#L;> ziS&GW>M*3bA&5cu?l~tc#C9(6PWOg|qos_DObG;sL89W&nJ9?wbU3T7f$w18TIyuU zk^Ad9+daW_*#JsK>-e(|(^BkCwam#qW(LHo?*ZzTsH{VGbt(e;D=opZ`*v$1lj=I+ zbhF5P3wSCaTr_)@<%4IW@t;18U0Wp=eZT5Mo1m`bXa$UJFJ!nvx7$svd{5*N$%(dU&<2Q$)mS35kT8cq~yZ!D_AmRR%Fk&l%cZLDNFBwvij8p zh&|WSeY2UXu_0bOv@JL|{uP=wWC|rY)E_A&x2n-^;aEFlXLyF-?BrI9q803tcPS1v zFk4h%H8Ly4*GJ}KbvnKu(W}<|PLC-3PMQ>ES|i+m%MfN(!4@Q_St(XEw)|vvU~NDqWZNH|G1d8~{ZPl|h;2 zhO;_6(mb#;lV&D0FYUK|sWl_JI=r!%$zURfsZ<_-QeApl+I5&?o-=GbijMj#Jf3eI!M zHLj)6Y9q`vW?u|$aQoXX0jLd_e~71%o!FmV|HaDCmH>mxM(f4Cfp)L4;)^V!yeIB2 z-(a7-4twV-7;<^sK%G{0Jio${yosr>w`kvL{)j|oD}FjcXnbwS&wFn+R(%4G zUM+n0ur)rWDRe@X>yZ4lNOZ_(xeZIcVnxLwB>Wy1Os?^8ojl!G`Tn0hzsiEqY|X#mxT z3guBKTC*4o9m-}xp*~St-U87=9xZ1bYT+Z<16YYCn@4;$Z<`6em#wGq-!JUYFSBkK zM>>W+4L`;eE%=GkgeTI%KQLU>Urn{Fg?oD#(+Czn zG&Mv@>+VazWt)_x8Mm`aZc}RP^7N&FR(1ZIh&;|}#6N>r`-15#^{;)}m5kCi=p4Dy508A#P z=8qqcImqsl72cPe2YD0)mA#jZ9Y*-TW05*hitX$Nw) zUP8(Kfu-8Elvykc*K}7WRRMl-<>M)l-o@H?>cd{U;hUvDK5W@?0m%-Kv4W0^rkKd4 zzk1UoKMd_oWWSoAUO7t*|ictgQX}kk}o^ zFR%aHc{eQk1mcRM66SxzJu57Wy0<^P>a^7v3}o|&Y05#t9YV9Ibb+`QM7Brn_j@S| zSMOs-ipi@r=XuU5=Aqc`Z<>~VHMp!||E5Ln?c~aZQLfW~jLj4ZZkSuk*b7W+HTCW5 zyenx@{f7of9BWzt1%2qWdNHg;?2Rj*G_-L%LBf0{!`aHoEuxrD&N{+=?Ql6g!>&dx+h zqvXS$KxRfDa-Q0?-%AHpjcS+Gu(Yg3WKrhfNvLefPt*DvR*s#bFNT=cf=hT*gMBZU zHP8hywjl#$!~CCNouB`>C~%3+v??E2OyZt|&VGE|I@Y_UzWVc&d|B>k4t}opGwdh5 zO^@KMEh2F%*y7)21KAajWv(8T6z$pdBa4}xEGwt^OF#JUDa%^7tdLT3d@z%K_R!Vz zVF-J61g-$~&NBRF3R9C)96@fBes>DlVT2uARcuw!bAuTre0IPSO7hkdzMK73{bEOrx^3ne^_O^yYZ?KiH$JVNPZY4`e z1_C#D3dFczGsQk~jM#Lest!3V#VdeQas0>H^$Dv(@&z4I(BPrNPA*QpUD%c;*ipga zDInyP4lROnj0U`x>*Q7QhZi*D7~#S2V~g~ZesE&Y-%lA{JPV=d&3ED`H}-Ia*PNaW zl**1>&s$t~%aow1~aWDC;2l`v9;)j!t~-zj4yI_?9#A+|6g9A#dxLU!UD?jpjT#6nq#alHvC|d8N9AtIz#-J=)(o zx+$weZKp35TYhDn^thFNt5tY5Bg#AI>9do0qAvj{%m_mC0oKX)zy6gm8UZ(}`EHQ$*05a_aC^?~D^DE9Ga8!knH@t^HWNx0z51?^@qZf=?Jk4awb0<^V5*M z#BAtl8E)l{qFR{X;xs3ko*GOY@yao^_OsJH{^2m#IB;GZ>K=b|HMV$wOEh?oF^MDo zG|d!VcFx~0Zp#WPSqfnHwZ4BEw1`O(6ACJ$M!cLy^8K3?UxApDb_Y^t?+x;`PHGAQ_ywhhUKt+98!M@A~ zK+MqOxVS8MN}q@t(TWwZ_5si#Y@g6ORNuJpAo{HGN_pV+p_GrD_Xa~#oNl)69SHgg zGx-P*N5$ap-%(*L3cX3ZPCvy#w@07NY7EwBgk`^L**@F?Q8J!xg}1HeM6VJYGaM%! z-+#j9eNq*EwUH1;ioIh$*gR)o9r=tXWzb;lPl}lfW?#;6_rIo}vY5dh`V;6O z6Wy;WgXBzsE#c)Pf&Ym{|8ttlE>clPW{ZIiu&13#6|*JP)r0DQ2-6!lH#avr_vjRJ zpS%4Na^`MGNUZk&LXVutg9i_QfeOCgFKGeS|BCH!{VORq8wu(>7ngJCQR$WsLU>FmD0V!b9Pt*Htk%h10*uR~q`3kFxk56PQbP_PG z4ysrm=fPZ`vUG(Pe>AYg`%@B)SP=u3@ZE}-zRFrXlL_^~4Ull&HPAgu>o5u~C`cFRpn7Pdd(J}`aXseFMB{c%s)Rb;2HGp=bpjaLbAA(MN)@87yaO1!8mc1`5A z!}~O!;j>44*sjijdI!&ZV%K=#m_oozB>&D(4$P~+J+xA{_aP`jJKeX1P7$TM#w*G1 z;{TS4)Zs_f!+F$qntcVn0Bv`z^mEG8hGdc2a?K8$tOF563fOgK%iIP;xZ{qvW0zhi zoeAO&7;|-HG%~jpF+&oVAR2i%&s%&CXd;jcxji;ET={@|?~8dPk}9Eiod`H~7qq2W zAj79PL{Q`1(ttyGjicvcSTKrM+l)mz(K3|FIigMz17z)Y7I^U=TBFPFvhQp!@Wv*K zbk=b!DH57Lx$+xZqExMa>)!UJgg9<@an{Lf0kXqO0Fq{KY230qG}|@)J8$Q7JUo zd6=L=^TT>A*G{fH;xX4hLR(0@hF`HhrP^4p8Wgc@D^!tFI+4U}=YYo7W=LK`1 z(58~g%62uY^0w0w7SA_T|GsWeT9O|bg^y)_vksbtGn$|*$5gb7HwJ=3gmIsKo<9;0 z-EW8X*bpp!>O5NIO++%9()KD3U00j0A#???LF)WVnX9fobrq6g;^HJK9}p(CUv{P8 z+ep?IJ9c=4N{foxAtEqCgDF7|sT>7vw4I6=db(Z6h zbiGV7Vvl?#*3ld>Vrzz8-yH!=@RntTM-2mP zWYbjUiXWhs`T8@1$)#0070#2e`VYU#@bgjw+vV&H3U3kkz(rEX?zz2k9wEiCqyarN zg(AVAg~eiRFDvn$tm6Uw94K)}wDxMWw7@uh`E~#l!zTuSl-5=4*@CirSPLM z%JxZi_AhF+3h#XcBxqunqP43-y8p+3dL!-FO8P{QF+6TT9>pE7;WY~`@PFpm=b=pf zdWyoGQP63f;2&&ov~SC*|>XKnK^f=bSSv-z2Xa1 z@Y2oI!Ug#77eD0p+qM+$5r}P$_IYPpJ>_3KF+02BWrXfD9LW*vQ7|)$Kc=!wpOzQF z52`ImUiZg{1nm4u$jER7Or`^zdQ?PaG~Du#Kl~&q7#ygw`L{SBJ>3SnOOZ$6KF4r` z-|}w^p71aH@UaaJ`WkUxT!J+ll+GlpAFFkekxWiLi!{!dVAX8od}P-!0=|I+zrO=J zQx<0TD4aizo(4OeifsH%uRdVo~cG={jmj%9DRRJgG$;Qs@I^cSU-aqSQSQ4MaZu=n(H&r6K3RNL<_E zYBybwRg~20a+PN&Zo@dYIXkz5viOoot*^)*u{g%T&ZQz(^IRiduqe-PRBm~6TE47| zwH%073-?}$#9F6DAn@3G;o>q8$IiVlg$BPZ?mcqFLkM*Er>Wmni?;ye12iu5YvQc@ zNooALExjw%weltNnCnmrs~SE)Q1j?E8}Yeq#<@-=11;O%iGTlkFgDIVjo0gw(Wv-4+`KweQ&mAB33v zmbQ8hQTFj5mqg%xB*&a144HS2=jn=*#~oeI7-clXj!by>yq(lqQ_#fUKoQHo)gORi~DP!{nhH9QoeKUUK%T(YlVqZsYJaOM9bmP5w;?ToB95&j@@) z9jzPihWpW*AEEuJcLb6Ob}o;m1JDVwS@`0YQhbIz^u>cVwhK!^>#sbivLn`ZwtDJA zh;6)3X%Gz5b@{=pbHTLIUtmFXFj8quXIr^9mO(EygVwoITYmOVC9Fmr_#HKFm zLM}?nza9xEnB~V%Nf+{$i?UZPJGB*yhl$;;?k>8}_bsJ(1chm|wzVc%EaylmtdeX` zX1PCFCa6W{W=V-K8T3`xF(qJU_1}~dsOy5b|u{=Mo0ho))ZSOYWgWzutHEh8>nmH zuV}FcIdK_96OZqS?-DkIs4D>?$f~ceTRk2Qehb#F)7lBBQgdU^EqbNN=k;C%nMAIX zX~OAMd3r647yiBzZJDLDw|-U@!v9bsKVL871lj(>1=aM&U*!)MW=7-Z3wsN^xvg*qzlK#6#Y_q7t|#BRh6X(V5-imHs< zNo;`~<|Yx{mc8s?K$?a&8}wc;6=7)WBJr9`a-FeD%m=`tO!A zeMcqs0v2zj?yNA7zYB9paZs(&_CsBKm2Q1c6}^kGp05ubR;3lQkWX?|JNXQB%x5ISM?~Y2G zWawhRLPN4bKzAhTwr9S)CO_y3_dXjsW7MX=D=#R2A^*Sud6%#U1F6_0sH`lBuX6cx zw!897vwm^W%CQtJWOqG>g6*)dz|6te9Cx+Bn)}~dfT3d^l{MH^Ep+=BC0qM!@XODB zxUp-{9EnYX5&CytI5^-6U&!mUjoIo|rIT>mBR|EiC6rlFQ3J;Lcdtg?fSp0EYnXCm zuN)hwmu|Ii;7RwR#?Ovd=TF0nUAfFv)9v5&9hEMt--&2Yndb=rl0d1O*qNEwTF2*M zkNKHH?`14#$s&QUwbK&Fs-f37&wbA-I^GwW6_p_2$=IPf((2Bdb}QLcr#^TvBtp<8 z(6Yaq;k>EOJr|_CFd-c{W|2IZQW+)fRyMMJw#wN$3dm`A##k{ExB77oJ^^cKOZ2%a z>9Mu4C+>`y%L_5?45N$ML71`S(x|-NA#xewA(zLDzW9ZHHMY3%lWByF++Ss5ubOq3 zo+hV8M>c4tkfeL3HH>ujJ6amNaiFK|`}#on&Ebd2e6$|Oi&oyHeZp`(-EV@$D#HQ% zdQt#U+bz}jCveZIdePJ``g)eZ71)--)u1C2MphL2^NuAOeY3gwxgvw0JjMXvX}*Gj z9hX&d+Fu?VXjW*sa~;dH&<0z1uh8zUDPs#$$rl1tDhh)+V!{@Xk?9D4t8(Vdr{h2OEQRvP+EbLo_f?*ADP5KrVni2lJn_qm!8|bc9&qvjb^~ZapMsgk z(V!lS@7}$0`TO-P>o(}&(Tj)TehA9$ix{vc|MLZ`|8mUo9szQy#gviH_BH92ZL7JB zO;*TCuge6Mq~J1Pe>K;Rb@f-SZt-arAR+V`n42dLW9?qnNVIKA-}V9oEd{^+`+LHm zD-ruDLNvd}jVZG_WX^^-1@S*1`xL$k18gXCFh2DY9C8N@gbN?W{u1vCLv8D19yVZa z3U%*l`}qOwEufVD;Wnl?{!0~rX7Qs!Ey>a#8W=2b=2o2(Afhl#y^L##334rYkg;y7ASOJ5J;dc16ma# zYu}9qWP*7BM~t*Go>2+tnn~6)FA)pJ?JGT?&;r0QdcR)N^&>TIGc!i(x4D@*^xReX zi6B~#xVSX1cQ?K5{2cp>ksGb8=8<&jKY{MjI&B3-!ol_3o3QZ*G(7)}z?q1Su5lXb zS9dU}4h#=kV_*nnt$V+QOCSq?p5f@2OrH5z&=|x;%~#(+ZLACp;OG8WSODi^gF@(P z9hADYQ@r-QfnB>(nvCJtU>iUQ+6K1POY}dKp8yQArO}gIM%hk;mdckag5-PvSBR;V zO1op8G0_0jJOqtw+l5@~#-28=l0=AeBNOFamgw_?0>yyFV!5DqZXZBDE9MhaH`Ob9 z{sOs)oUa?$FlR@6a_0jh;L7LEp9vx>yNQ-w*xNdJ-W;JXs)Jhf0$hI|TA74O(z?IE zaY))~8As@EpnLq=iNuTy2h)%l8K4hpReDUvrZsX+pmtRb)xgq0PS+MwJQYbUBHfl# zli7aDmZKfP0mMye55BI{zK$9I#VC|oZUd(hGq*c_b)yp`Ew&aq?^HWG)ZHEf%nQbn zk!swkx7^o^pJb?omFlJ{u|As z9Rr|#R7pUSgqKSHuqex~U+C;^ucT86*p5Mn!w#d0G~d&(UQ}vT(_&G5!);pM!XgEy zo7qTQafJ}kj`O9oMw^dVZr$KnIJv(thkN*kNr?qqUv1N)E9h7?Ue33a-c&FfbFunB zT=jqGJ~XNrRvkbog;9p0oT_Tq&iaa@2yW_2kecSPD}4)(exl*T64;o^Kg9@V<}#AqoA(Q9Dy)dxCGVcmo0mM+IbHeM=dv-?6BA zrOf`BvlH8OYXWtsb6nVB3$y=`1I6fJp~*s|GxlxU5Q2rJtth*lS=i zc6W#h-aAJHT3(9=_L^NWpCF5K9a)7>ek}pkLS<~%Ml1} zSt`f60hvZT_nL2mM>go@&Ys0LVnQ?Sx(YvLISt&^iM1GprtDtGwkdc|PsML`h# z^{iHHxd!xw>-OJ;acZ^5gS#344K3B)M6K*%f#f(ElW(3MbI$6f=lGv2`K*>=Kusjx zp;vz*Nr!TI0lSY-ob+u-^ILv|AnKn}Z6^RO+&?!W*<+aq$k&k24{h+sfW&h!2++J| zF?a6+R_x}mUu!yj)xGto_sfBo^hAWt)kC2#5@F%ZA?JMuSsNLLD1ZivyDBT&6tg@) z#G`|OBVI5k;G5EnG2MSVSEShUNsK0V6qi`zEJPM_zfx*e(-N%4>Y?XA-j8Zy9P{N5`uLbt{djZ0A` zaTzpdzmnehpdV^OT-x`D3Z>M`3-7&y62t5?@QtjRTY~kvY#K?!@_oyp0Q)e*p-V|+ zPDLt*rH8;^l*k5lqo&xlns?O}dgZZ=G3`7FzFjngIC?ZXIcr6jJ!X0Kbi8cO>Y>-* z#M507vgMP8E4vZVsU)g$wJW{{yIdj1`4(I7IpMRyB07?oMUe)*dF9!y(xr7&Xa*<) z&H<+ZG9MLO^xG-CJ|+^f$<1imeF3nBK(w(O)Y4x}stWzITUnThU{7#m>CL%!T+%gMrsr;3o#iRmri$$TOb?p2D}Ey$t9r&E_IA@9ibG(;4S+ti;A^)oFJRqOe{|Hw zrn_n$I#x17%DLr5BQ(p%$Xa3eyup1gVt0LWRyAKqi3?uWguatM|AudFq3+u=K*-oM zA1Ri`k4C%p<(DT4jaOg9z$I4aM}bt}4d;H1N6RSR$t9)*Fa{Cjg%a7zeM1^HTGj|u z{O8YGi9ZWoJ=b@y=z`Y%#J`a4^780m#*QXP1~}Y%WZY|~1<{&uIMp{#y5m!Md+jt9 zB~~3AdUt%LO1+r=S%(j+c*^udmFF|_^eg$DiHQZjd~g=_KJOf z=RBpyjC%0TTVv1swzs~0hDt#82} zR0Ddsl}jCa*)Es^g+%~%ow&wsh6@S4UjJ#>x?ig*sjnY@{7$E&2ur{>zg%J|T5Ud3 zUaK}rDS4-9)K-L@sliNC0D?TY>Sx}KbHDTA!M0Xep)J%m0_q&4SXY>!InVNKfVV52 zk2rr_S-B&E_xu#vyeGF1oL_%yXt>1Ebs^?9N$Sp?OUK{*a`3~<_BS?~oOPm4$pgjO zKEztTs?_HDWD=&_r;FL&-w&C}EVSskGs~y=%~7K#pFF7hd;ODMiF`N;TXQ3+Z$sLj zd}pZ!<3b%+7K>$qvkm@GP-2^@M_dSU|@{OfE1{5DitP$tzAQ?c39qtLRqHb=9 zz918z)1oi<)f|VvJf&^)J8#pgH|e)k{RiDwYB)oGU+F7^KvQ;8B+cpv)djeH`2Sme z{nO$k=#oR{sJn@o*K;Wqgt`*la{JPVFSFUdA_+FCR0NUvx zwhL*h=wD*MA^V4?qtB`d9|k1myp|qwP)q^Pg+KQ5dO8}>Cw_Gc95?KIhPTA=jWA^;H&M5oL!?ol-e^C{>7 zknZLGW7kD_d9S(;Ou?0e5K?gUgnE25Of`|*H3Bm5EaUH4p*jCIoe7=$O(U7NfHPi7 zXMh^|zghfun+X1EZDaq{|KB?|9DQ`pK&cs=anD=cpK}Ng4+jXsuNU+d8OAJ*2ybtH zE?zj5@wa@uQ%*U@A)PtdHmp!@iw+SDePQ%pi8nyy@_*y)O~cvx{C$knoVh#yX^+QY5oS0&)F_M^)s7O3p`}<$_ zbzIN=ym*fLIPU#YB-vSe?X}lB*Li-v95UYl+yi4sBiwmdYEQC;d$#+8yR?TBV9*!< zS`z>=neXSGGGJAwRHFb1d1==)A@jW`f#*m|(;mQ1u?u2KeNZ%gQ-TTjFb8(&2D``q z&`%EI<>$Zb3*x1*RAbBT)?_BxsY?22~vVR;0 zbkdx^;k!qJKY46k=H}>khDNNhynYx2kE(5^3aF(Gr%Vh1vjw2LNdfCij_X6zLLY`{ zE2i*vT~0p9E)Octyc}#<4@WplZQ9P;L97Ec*bPwGE%CsBP)5Jj@*A^H-_`E8yL2`U zbwUbp8YmJ@6H`|6%?Mq>h2G6+a|}EOdR5c`=J#T6(sGc0&XXI#Z^+@y>kU}sfW|M^ zI_N1oJJ&*j2C5&EwCBa)%qsGZUS7*uQb-5b&YQKe^|B8p|J1Mt<@02& zyZ9G{zi=0{FySj%w8yoekZ&L)sI}^}eJ$7bt=&tqb*Cd53 zTOT!CrF!MAI(AbLSZ>HA8u81hpR)UY`1}El=!%OL`_m+J{edv$m*$+^4-v}sl^xsz z=(MSJyQvT0_#a+5neV^cKL0K>lcod2o#NQt4t+Af0N8L6TKey!1>5I=m%PxCoQQ%5 zpam_sckkj`ZXxZDK7@FPYNAZFoed?cO{;zWGv@qnlv1E^{`lekOFrC%>j209Wmeq( ziep2sRiTOGZrQOY8c(zkKIL*!WgG8b7y{Ap;fy!h-)X_{pmSPpGq# zo8ji_oWN#rUiZ0(pvB9FIHIFo#BjcpH)amXCr9fW}6 z|Hp$w=3pj4uHWsW`8`s%kMsGgH$KFG{%x=K;~C5cqkUEOLmECrw%={!t^gRnn}Gp_ zezCDj#7K>^?JP)B;RxI3&hs)Q4{gg*w(H$@tYC2cY(e2LSgUebKz~=?HvA*2>c09N zxg#MyB2UDpTa60LXN)vtg4rrv?J144ut1ag;-+6miI>SQpzkUafNXx^AH(49f7rkj z=0EB&zj+2@6pV3o zd!IQW*K)@*!`V34W>n#Wyr;^~==K9TwUhws_CuZBHv>{?3M)tA&>a`3j}*O(5X*xm z74!84UY|3EwfnK~G?O)@{`HbKI}fO#RecP_MTS(L8?~skMhU}G+nOC(s2$%5A>bM+ z`q$20|};h zM!0PV6P*qo4G@>#_M#KpF!F+dI{_MQBNgKpSDVm2jw80_0oav`ha=gOn+I#XqJlLZ z-wqR{u4}}TsmI2b8k-a^EvGtlDvf)Y6J|)-N8pgnimyT<+kUplnl*ZhPDaLPSAfyB z7wB|@bW8P4M+4aNbq$sN!m*og{Kz<=`J&L{JNr-x^k#k8^-?E2j3!r`i9!%s)3#N# zX2bNj@PF^dyHmTv{srm!eCh)XC%*IxDo?Wlxzt22< zo3u7E$HT+p3}7-QVt5k8|Tdc%p4 z^JS#$^mKAnQdnk7Tlgql&PUw-DV-QZeY;8R@Mq4A_1U#Q#gk+$8Fi!k+D*$Fvlr59 zx-S;fz-LzzVk>BTycB6Ftt(A654Lq2mtGj!ZURX`F>gXh8ia6@CQ4%#DwHI+IeM|4 zUYvCo`9k)}>1m?vTW=fsw++V_WvZ50qv_2vQ>!*Qag?1pSi^J_V*HMGn(rIMtOV&BTrQ6p43|CKVdu7Ni>ty!DGQ z*KmQ{-Bp36X1^o~ukI(?FQ{z#rw^Vcq#rE*Zgat(00rT$sY+0}BMoUabjhtq|FM zfwkv>yelIpXeP}DH8m`GnM`q6FNHUcqxQqd6S}^{OVmp!)+4R;KCaVaZzz<1y4a!ktQ1@!u;?-q{*EqB&JVg#PaD^T#%LrO&#)B|&{@;jQ?^ z-;kgVaV%uUkS`#u4qj^9vPH@WN%}l-PN^g`>w{ZH2;ZXZj1QW?(HQPpAK~Lz%%tsn zhY8c^cq7f3E-gy!2-jV*%CA87F9KsoXPf7cc?)G~aCY3)mHy#|t7@0MDK28U=pt(V zT}5Mu(pyZsir@{t)hMHNfsMzAD0PXEu=C$Cc&ZqqZ-v1%3o6Ghd1Q>Lji|=zXY+%P z4Aj8)Hp2`}N4!(YlDy-y7)Oa!4x&dJKL<3#ZPoiwE0V|8AJ4Z~h`x|J(C1B`e_AU> zfBCb5a-o@3lO-MgFh%(HlfhZyCGV)MWaTK#u)`{}q6QAlD8V1Z&yKL3O02f8JZx}j zyy(=q*}n7p>!qFdjRZ;Bnv#v;afpAP=bp2$;@+n8RzK$$#{k%%#V2z;2T`F+&01KT ziN>i3ibNI(vp2S}p(4*MLTMv;(KLiw;Cqcnq3DnhN{?0+IgD4(!RNehDE^wY z1{%zBYNJBH&e%q-H<2|uP@PY!%-1B9>5ZYVEcBgDbT{LtKMqmSjO1F*YzbIicXV-r zoNKyJQZN^KH22=Gt#_wXyRg)RGxJ!dw%IPlG}T_O0ckZ?G>IM1L^xn`rN5aPZTU-O zjz3Obu3FO0>bYOk5&nr^I~VUOV3pYj;OX> zx~;ol(rQlRDo*m%49HobQN;F&u9^OlJL>qSOQB%y>Q&GuJ^k}d=AV79yRIxDHJWf{mU>y_#)*Nq=T>SBNhk_G z;`9N_7&dS0FuvJ77?{#ObsFq3165m$=6*sER*)`_JD(O+8a#=@GY}L||5w~J$M`yE zyZH*Am`8Ya9g-#96J)vq8c67dIv0jAZG&y1J|QLaIQ7Pi$@2Efbb}C%z7QTPJ$Oee ztwQPO@c7Tg$Ik{imLgAtAxbr*_~wxWXbzK-VIh{@f<(es9%Y!9s0XCJMCDm_DrV~&8%zj*-D98DO{JW>T=sK z7?DHS4WlMb#TR8C1Y!@V{WQ=oHjiu`xE~&966-Yt?+Z`N!N!7eQZiHLuSu8TFxauG zO1f_Pa|_tBTKxp6Ggtr7cZF?BJ%=R>I|=$TUR+WW0ia$zKcr~A%OEn#pcdh|2N;^8 z8*m3c1Y=-$PYMn+@*UvTHXFk`F zLAoDGCWmoeHZysGPS13{!<+43}NliN*WJ@L)8PR8O?X&fsX{R2dSMVx$lN*<<_F2|=jy(@= z9CaTZoZK!Z8~_*jmj{KU99Gs=WAcrCnI=|vimGhIMC2)5vJ)+{6#TVMHH?uxsS-43 zi$8XNJFopWbVowee}Ue7OwfYB=5tTvO0vmYmEGuMg+>M^FlucuIoIyCw5wD-XKW#i zJ2#K32U%u6!Xgau+WiG_9u5bRV7aNkj`$D*rF(PUfxNDv?!83oK%Fe+v`imG2&sDH zfcc_Iil5&At02st7mj*z33q|=$o+NFFq2*o{18EE0mF5fxO;}U9WYiei@wlX}O^mUSJFCX}5QEx%9 zQOtbk1FI|(2B`F%hX>NR>>{`FQNt%78^;gcw;Yc7%2WkeVVHoie7fi{bGCPUCPX23 zDej%4K3jA=RORiB<4K??yZE~gMF!N{T5?0~L+U?x=y$KDH4Q_v-Iq*530~iH91TU^ zO@uO;U5XVl2qnD?+1P6>_N}%0=$-K1Ckz13n|e#!C27iX^kLma%?*(DFO?D6`=y#e zuTmvN(4-{^MK;^3Ef|^XI$!PEU+uZgA1j2oZk}1A1tXn~f=SAiC^CyvkZ-#Eb{?T;#tlY}CA^O!q6D(I?so-IM#ahhx(BMMM=R zM-Hd5YJqZ!r7Bod_28 zZST8;-D(_30Tb9sj6&B6j%SBfa7>#bV@LC#_OPeaXF3NRz4go}n|K zy*HX$f_2Wp+OL)S&}{leCN33LpMJYJ{MCXhXZo;t(LBg(VKb+g@|o6J`8X zRfT;FdYh)zgjsgiwFSchznfH{=w*^8$8m@;*l@3lL*J6{GeZ2asjt&)AJw>a5_xI8J!|mpn1xp_)4PE16F?6-#yWwb91dt`GsT{(`mm+^_@0>zxOl{UdcciDJZm8!Mz1H+^CGd?1KoA2yPnoy zs5N9!5zLO|D2M;mg5DR(>-;K0to*#-v?pq7SB(XHfmse;%th?wS-2W`%>&vT1H0G( z;2T3N_Qzl2gV`6KQ!N=f3V>~Jk{p|VB|T+R1pYuYzi80Y67_~o;x#aLRO8=QPIAT` z16P=}z?{rshPRecyqbZTU->zT|3qj3q=5}Y(%xz~_XWSGe-Y`0)37;sk$ARfAqTPd zCiw3uzDm88BCoSyHko@-)9Ai&*IP-w1z;m+cMAbfAhnT|`g#Vjtr%1h$*4SJ9wy1j zo$CMZccXH|6U1N39?(+0Sv-;1%4dz};BO;wSaANis8P>WN;IbxG@~gB$jX={ewmKH zZ@aEvhmgHWD;57})f~?b%fP-6kk^bl`-f4_A!x4W8V`IKB7ewUS=P9&aubZ;q3HSQvodsdqdM zp{A@F&#SI{w)h%$eIPyvD;r(i4?vX6Mzimb;FmXZ5=nQm$|he)ar zZMG5oYI_sfmdw8C^>CgP-|g1Grdydv!Ujk0^NXr zH+s195J~sugbA=uS48}+fPKX-zQ4EG$rB5Cc}skvA#XMl_6WdS%ojLw{{6YSd1JPc zJiBeQhacX+uO=gRoV#b>?>Xn>3I*2rX>3E!@o31?2=;;MMBAv-FL&v84a_JZm0hQ- zq9W~Y9$H;pUG?`OZgc*9MYS>&zBumWbE|uW?G^^Fa!EkGU)GLuaQnNT7o|VjwzQHi4|DESu4=8| zyrp7oc;TL0R7>*i)*p}&)$h6@`98EY+s%5OIQvxM%YU~2lH?93d%E3Q6#+&~gvQ$^ z`>%Zb_lH%~BNZaQ_G!^V@K4iYgEd_mlmm}#$Y0Cr;rR)o-x zd3hv|BkA9FBn#~aK@<7;j1bK?g+n&0kb*%R@qceyj^rz`AfPM4buH9dORw=q^H1LU z+bO@i6bXd*2}`o03XpmEeF7RB5{LfwNcT&*??^ zYeYj8Fu;eqpZ)j0J)3PMpk@~EkNh^hQ`}NkFph(_0CRiDxT5Y0(B+_yu*JSs9YUSR zdB^2!zrqxgQGRX=56TyB7wiHt*nO3lRcK*;&d!~ zZ;|M~e|yNIDc{-n>4(78=<>a~e~7)n;Q4dx7|^2IsVy*jz|gexZ;$`3+Z@+6*KsD3J485xVNPj-Xp!12B?(ZR>O=cPxwLI0;XVC;o%60P4liWD`U0k%iJL|TEt!xX^R zk#}u&^0|VXT#Z(1t7CW!7q{x>(Hvk}h9^=gJo?=}sKIj; zZR>`DmWLLdVp{Z2&F~#YP6SIFFe?+8IcXW;e9!isbEy8OiNP9O{xGqft9ZBa2Ttfq z^XhvA9@R_!+o#k-LKgg^laHx2mSW1>54J7J{L)=A`g6rO|2J3sJz7}7dPHA9hay>J z%rgFQN6WQ3VtXdTE-0v$P_77&4d31G)@EKakwt?`(t}#~vTHe6DgL+(-1<)-l{#Ze zc*+m>HR%8X=IfoS&IOt{*G}v3h1~W>bEN`fp<ip$ z5E=C&lsVygr9xKB(U~@o(07db{$a@Y*kVoHI%=mfO~GbVh46Un4oIuR%W`m{D2$ba zCXa_p`?t5#2=ER&G<4Q!?{!lEQL}BC3{_J0UBs}l~^LX}fLzK5EVn{vH*KM&n z$hA{NVc%DjP9C_n^u2C#dL2sJ1z<*O9jX=Cbq0e700VN{Qg^+^jjX|($5H%}hLj*0 zq15<2Ha9AqXACsA7W9yQTVw0zM=edY9@f{_<7>P`MfWYJiiwG-hOFp*P-STma>`0e z%PB-Grd?4}Q)Uo>hEI7s0zT$qG_qvp(Z8fz0`=tcZS?9nnkfer>AW>tES;e(ILYnKSL9$ur9z1KR2c z@-L(G!{`f8m-Z~@!jG3m*46=r#1nT<0x}bhSS63tbpAMW z<*aSU);rNs8i#jIVIv)?}7mCU38IS4e6G zV`P2-6shVDxS)KjNq3gkGP$^)I4f%?`7nly9-LAeCCJMZ!8 zR;e)eyvEfztIidAEMfqFx4H=Etks2Q+92(`fvRA4@7y_e&pb-mwL_f#CFUqug-ZMW z^XD40sx8(8Lylsz9*sBrrcdl>O>2P2!4<(Kt2O0q=9dAU!tmygeSEF z$i=a6)@l1Q)DW);_KM2sCo!;J*Z5PkHHDx>*N!V%if$%^WcxsaURr&Q$f3MpKWr2) z8k~5j%QN+io1@^Qiosy2kV?;B&p9QfAmX)wBw2;a{VK1}-V;y=HZX{2H1_tGxEhxE zVE$JKnm7mTuZ4&MUiU_<1KI{K*GeNA&W|DP3$idMr4ybGJ~YZ1Op+8;H{~UTTQHBA zk&%Ywc@vu;f|Z$k^V)PnX#)KM5DP}Ue1@N5*}$;7Zn#(XRc0P%4+|$gmaJnldelM_s zAd|VhM52h&pQmUoDv|It37{Ea9pL5iqxjP6KHL9q>a*^|?+|>KdpX zWTT(^TwVmxKm%^$Uvt0e1m}LeHVx#Pk!CN<2aS5;f{u43sg2)@*xCq6k^bzbCKbAI z5KCppL-OzDet%LF?b4nssdV+FhvQym$qvJtIh_Hm)nPCCK)(z`fyg9+k1z3&5PM%O zl;|d|=Iu{nF()RbC?&IAYVh{`$3`5z4Q+j;&24j(&OglZL-1ZyWx6@LaxrTq)S0HrPN1FTg#ae(hS zh>1RMb9d1e^`@ZWh%zPa?17NYm+hrD^qy!=RM`lqX&X9ck0YNHw^3bEw7l2n&sW~b z)WF0AQom;5hc(N%szHT3XFi+4QJ;;Q%_Ep~7bUs)q!vKcTQoMCDP7@@I_@y3m4cBg zdI_0u0YXAUjSOvf6po!PN!G&e7yURB%?B(V0PDELQB%GdaEUc@eyI>Cg0MOue^FWK zrnB>TwELmd1_#vYq!Xzy|NUh?t=YScc!kJ-4Se~iG3A-D9Wu17{Tg-5g{F^fi#$&#b? z!MN#yOte!lWyHI`kzhX>Itb3dGD%IcKu!#O@T)is-m5*}HBe@s@qXRg4qeOpQ)e{x z9#B9iDCKY^5q(Dtk6n1JU3 zo&kX5a8!8(tM9oTNeMdi!{}#R+ofK1{n62nv5TGA=m{46A@p|=+8bfJ`E?#umA$hZ zuad!?&?ak6dnzw0Wbk+~0YFr%SAV3cEVQ_|3n@A+-ia3<$6PJiBX)Ui<2}<8=fPpo zTMM}AvHeGyQV_?Z-`QGuR0MU|1#4VZ=uB5q@Sh2NG+sG)M~5W@FaoQ_w0S9`B{rs_ zr@sS90f@{ej$6)eil%SOJbfmA$%->C>SjuBufVhjSyLPanAXgk`$4BIZBa3xqccB-(JqM z_%O%<{~mL1Yw)7!`I2H+;lQ)MWEOO*cUOECujDT`13 zk8AhN;9*Wl-Y0m}*Zf_WH*(wK_{6>BFR6Mb!cxp=Tb%nTYeg?o2jU5`$Z(&|XoiG1pHfIE$2XLDYQa*@)= zI8JDtPP}}_k8g`#QnN0u4%4!|W-~*c$8BaR-nIMXCfkdm)3o9+u4kVLmKAbMTP>_@ z^P=i#HZa30SBesl)c(Q@UNhynSWLh_yf)yc?K3?`_Q_jJgh(Lv927{c_a0SMYy1AB zZRQy+rA_AG=ibJ79R~0?XKVUk;qz@hJ%Q*LZh@lpCLZ?}+qy+Q+2blP6>%k}tzPCL zPw<2VGBqii@x;wp6t-DcIP7M`jNigzv*9CGYw2ZN3PdNGp|9iDL1};@ESpek9Qg4u zd5$`QZeq!P&C1l<9eS+4tK>?7ozA(sB zro^jxWlEonAtC)B$FIA{7a1ph6gPGmfimTCFVYX)A!=}y#7e2=gs7V<<7QWdN@k@8c@1F_7 z(Z}QU59^^o40jNk)0?iyyWF3R=|E!EE}^L;4E1NGCWMx>=g@w!BThhFze6n6!VS?n z!gXc-HsK7X={p29sdl#fC4i&Z5N8cPJ85w&;OFo|O!MsNAQ4b)H%yCatHtDxKflB&#gThQ(7Hw>_B_3!`bc`ofZ zkm2ZjGFRk;vy}`G=FJc@yashpt=xXaNdXf+O3wyH=hv^W6xz+>IZHQX7vwjLv?2zae zJ%1O!B4^Y^jRDvxHT)OCY%#tr7-A#OQreZrdS;L-J9~B$|3GB?I`G_`Y`bMH`q7EC zBtTDaN=6IJJzn@c(YVo<;OS=1>3eotNgjI7LTAO7Xe;!%U?`^mP@E9Hy@?8-LfIlu z&J%wsA>=%FcgsFM5fURFa~)7{rZ)!)k(D2CbXPS%*K0enPg1M`3VQEmtr!0ji%1rl z2868C{F5U7`=+=BITODFGGZHWk8{N54X1oJKZE-{1Nsem*3TrhEw6~!%%<{m<(t70 zFe?K*k1Yxi`(NJpqfY?^3k@Ed4dy}>A_>BortjunMoaA1Kr9rkv@afz*NFP{SB;gS zogMI<3D~Sk+^1)VNbEfvXzy3m^`@PT8FoLQkvjHQLM*s|y7lX8vIP9Qs&Ri*fn1-r ztVE#Ieql)-&8T13|7cAzuwwrfu>U4!JR5^lkUOzZIW4kZ@~OnlKjl*a%0b+cnP~bC z+o4=eb%UEVZJsag78V{zlxo2%*(K@d}T0fQ&>{(+sh*^foBKIP8phY zUVZOsKnzm8a|^nBiIC0h z&fd)@0DB>J(VqNCy}6$JV1M^EVa3C!g`(m)vy8NRiGV)8*PZ>hdG5i--b(0!W7-zY z()9mP5RaA@v1ztgQslY1O^R~+SGZmJ6)&bDEIB-W7YsYQ`ONp*aUKmJs1@QvGK0W( z&8Y9mZj5{POP6LP>hHrQ^JTYZfA;xCC&5X0kKEQl5`7NNa0D+kb z^04KylmCOR?R!YAwSTI{afIIA?V+?0nsxR4G&m9pER$7(+1EyEBjVw=)`l7%rZjG~ zS%rsod{8PtBwSO7wE^nB_)WCZ3yV{5aXnrzYD>x}z}(t4206L9ep0lpR+dZQ1Gm&qV%MNpoO&obB4icO8K{bp6Gg0)UI|#sbA6Wm-2DFAv#OyH90n242?L z>^Z$n)eC2lJ(%Zyht}5?)(vGnrk~mk+je%*nuH{rEemlzz&f%D2+(aCzxn`T3FxpB z!J&#w0NwFBgW}clxr-7M!?jUmttd{VX^&Z#-F*npTyX;M0aX-;CUqSnSN#Xxh!ZfW zE~YjC9J28K@ejYBU?C;eiY$9_O~_sI*HUo43ePUP4=TY~e3DmJ${XECYS2pV)7q|k zfrSMg2BbONJ+VRL%0Klkx}KFR91z)2b0NgaeocyW)r5-Ibb&&^qh#vdoOgf`UN>J1 zz))fr1F~zoBbJO5zICJfO|_dd3I0EN^1Xj|4E}**5?@-In|owx)S{am^>yT}X3IS~ zt#@&Y@LNP6_2;FoK0My!Lw4%h23uR#_gq5}_yEe)nQY$%xJe=sK0Pez-HG?6H`+rh zN1MVESey1vRU(Q!%e3Ntmi-|9O}mpmjb!h>!-(y!^PTqvrfRQU3kuH+`f+k}#e*12 zm^{zq(xGXtlS%G3;z_l6pZe}!M(*qH*wY2n?gg-(%SOpRe%$Wt`d%T44XSq2IP{xNws83<&Pgj8GBgFdN-m*_|oqT@-F-^9+(k1 zy&J9Zn29_$w5+n^^lmM^#)H`5_T#-vH||m^_~NhGISkhh?`y}ZGuh$8;~!{GyoQ1) zL%mq1_n*R(>UY!sk&anF1{5=@Mc?411YvxZgP_8my<6v;>N~v5a1Xj0w-IIbxaP1R z>Kp~_w+@gB>R-b<8>i9E_>Tf*IXPc6YJHs6C6=yTa-lnf|N8#WdyV9SZ71VDRoQ3g zMxf=^@Lp4SpLX#`5ZAA4JS~EHv05Mn;QkSPn8}&+wGy8pm+l64Y6G*0Hwpt=d;o}> zN`mj`>_@@4#6(+u?QqKDU5*jH#89oXW3A~&sL-+7>q?|)?;S56lK`;rC?IuHNg%53 z=x16u{nPha-_=VDOqnD0C!~;Y8NkySgp<31cZomc{JY!%K$mzl_38vQq_Z}kn;x98 z--`C?+v*vT+M^9e^mhvF!^QABWiv%}b^k~PDDtd%fo)4^_?)*A@@0UQLC04!9MC5lwU1_pjZ0d3HAM7vYG$=CPYN~|Ry&EDbMzF@ zVke@>R9jcqSYDHjD{H&NDMkwrDi0v#Fk&5zwb}!z$9lFFwaN&E#)Zk0`XlPKHAElN zZ08gmW?uL>d0cy8R?;-=9EbZeH~a60d*-v4E9)X^s_}QirQbkBUY+e%4IA4$xuw>+ z!_DD-`VSX&=(yp%@0GL2F?RK9Q(r#Q;l&7Z^O(XPUSpo;IKZI*t|>f89<>SvyRuT2 zX46tCc+fTz=li_m!2&?NAO_>d1juZ|tmBn_nRJP&;#D3wmUXC`Xc_n)t$o3sOKz&!jz#>Vi&`OsEraNTt(*gxp z=+nJNN4~kl+dDcUN3%79DE`E|078QNHUDr+N>Gx8){cIP7Fp#H0h@YKN2lA!$e8HL zY9M>fkgM9WLwon%W`;v%2GQPmJ@?8OAM*_*NuW7M14~5t=MBAQm;m=oyRG)}uc_$5 z#)tEnur_U!>xuSk(8_Bkc&8K%^qU3fLCkW1x*1L$-vDi@Q?B%}&ENV(qsK=?IaTPe zN68w{I^JtQSf(4m|2+a!#mf9JMrF8k#EIOQJ0wJo=gOBzd|u8M$(<2td$dn*vvWH? z+2L7vb2ucPU+Tf)Vhzs0Q%fkZ6oTtbvb+SKb)hULS}i;yc$)-MqB-h&GrzDSh(U5= zTcboqSo`hgnZL*ZVD80>c<&*11#4swwLLNMM_39u>4WO1&dz!iT4a#^GN8?Nrzv(9 zL0Vt#I@G(@t1*tlEZa@m{~wEF+q%Pn6GemGr#8h;jhu#K9llHjAM)iC=(!5)zRNB9 z#!76(+761h^Gn;U`(z>bfqLBZx0Von6TW_J#}?Bh^s85w2z6jt8{9`YyWi$+wxd?* z7q9Dd#bq*=(^y47Art19(%9lP=@?9#rT7ipbf^zY(qe5Z(BF9>%a6x!)iH~g?qv|Z zDA-l>g)cWd&dAeKR;EAQK=uYL#?IFx`7#>}=H;pEOifteaibyZ_!c61D$WZPICEve zW{cC1MgyV5$6ONCStorodA9A_-Nnb(@T&piszsbg=Ak9{8%6u34sU&2QzJ3zm0{>8 z?YZ&!N-0Md3-Hm1Fotj1VLNJc^mdp}KL)HIdPj&(SybuaJ!)qY%afwD9t~kv@HQB* zpHoylpSpzrjya&eCX1;K@m(vHPnt;gNa8!BAH4OH^zfOGSJ#tq z?*isVNIoW2-9QBe6{c@_@DE^{ix|tHk!&@Xm-=uQE0HV*%QUaixAD=6KeXhu?l7OI zMO12BcpN;2w8JV*%_uqKRs}Gi;WOl5;+8`Q){5*8AVn$K z&m~5~J{|>jfqrU|Zrd#8QS_Ehe|8DT0W=T>FNegkV|2{DOgrn!I)fzG`A2dE?=EV1qbzdj2hhygmSj(y&d1TAgE@?vT^Bwe* zp@4q|DI-jA3v7>TC~-b^mA+u!9?I~bO6l|6W}P6md!_D&NJf8Z$Qy&r98lW>9?o?t z%#NHA7Ug&lO4v=UBP&Ec(|S>}g&(i z<+iA8q896<&0WEgkG9hjh}!GPI3Spc8u(du*Hw|@-4VQrR9>kDu`rWDsSB!p< zJ6RtmtyMm!mAc?}1_Qqk^sKGx+d7?fusx-S7HRPqv&jeMrig`^cX5nmz(Z-MxJquSJEFc=TkE#zA0!m9ktvLj>#<{Dt z3&6uU73!CiXI`)~&1Q5qrX)`xY1cnru z3zW#(0 z{-4_G19lVV2aYw(wuw8)u01i#t{#nK7HWvM*-5Lk&4|D7yyr8~)B=`vzZz4{BA$5! zAb1>Q>+?%a9vH0-O(1OE4j_shsZRp^&?u`oa^x;y3E^oIk;|#r!qk6Z9l{4p!3T=) zr2IIf<7JqM*(qIP`0_y&>l&1mT)v>fOM;5yiBS=0&_DL&?$1ea>%*pzV=6zui@6b0TyG>9bvB%LIR0D;4kPRDS3*oL01R(%NJ>8C*a-c?ey%iOVI_&-iGWjKWBVC4 z!m-gpFjijxU>}G+4g1i`lwsElgkOhLE@_B3g!Fw*B4P5{!8HbYk}7jX6Qa{-6!a6Oo7V{<|7<{1FBoTXv?9b9`~ z9tp}>1Qs~%R-P*!lfWaxB}UJvZb{}g@yvjcuX-$_C52|oVZVHyo&hs z8bVmVZpzXT!KQ4ZUxP)2w_KdCdb1Xb7z59Sln;#tg>8-@J2CZaMS9=XLdA^7y>5Xy zMPD4Wy+7hQE;8O@IT6QVIubUm^3}5tqK@!z42i$534(nJJ<6`pc?lb&HE+dwO#EDh z=11ug&sS&DY%=7Q%^193-Xc$3$lcG~Z)Yb|Wpn>FIzQjiC1CwTP$_8CnJjW&52lRG zA`V$S5lmlLwIOIb)IN^oeIr!u!R&0L@xI!o2p9Rv$J-(j*!j<-WL*?Qo(&szM_ z7ChoYbh(BXg%O4G3571s<6m2m;;-6f4(L$Wjz__@4<5F2-8R`6!fV7%#Dk;_x<8el zTo~WW0oZ43ZZX)39S341%sa1a2;3`6Z2{~nJ7GBoSCfD)-go|=OpUhPYS^!e&#MOpLI!g_0o1C6TJx&#G3LrqBxe~{`A8~_ zXb|HZ2Pd08fUK|k6Ndzr{BsPdrEF$iZ!?<=$LR4TN3F!x+eZ7zKP*lCo#XIwUCd}Y zy;=-OifgO%MH^4Tk}|&0OUxyna>05hb4P1^f+1(Gqw3rI&1D^l8q=pLv)-2(GL4vK zdNK4|w@;z>rY%)w?9Sfq4=Ay_PD0L@pb3X`^$73(>*~zDlG40Qgj6e$M{9ObYt+NB zM|kpqEQ{&>bGra`-a=(1gY6l4C**EGmqyMSRE#p0+d~d#hFyTMA zpWvweGb#4C=Q*#BdrV#;yay*!3~7t5*>xNFDoI;g(0r)KRvPP{m$DANFTY_BoX99= z`p4f$&Jwu?2@M9zyM&UT|giAp7ll5U+dx$H7!dy)C30P{?~!UL9{J>f0O@D)_pF)&X|tjPF*=8C<=tIV+iosDqrmD!;Sv{E z!z#Uvy;ONKRx+|^ipv2knt7YruqVZKNI=3vA{3|-l>cHM?4=pu5T8c)NqsKZVIH@L z-Y{hVw7LYU;^OG}XT#^I_-lQlb!EdT&FCa}tm?Q$zxSsx>^X$6!cDIKg!(n4BG%N^ z9NWMdPGgUvMP-&pb+(>sZ4b>LM@91tUG72r7EjShqmh6jwQ$1x`(fXhz^$s(x)=QW zIU}zK3M>8iexdUKAI2y{SeX+Dt#jP;U%HmB=bR#@`Zj8B*Q-6r@Exk-p5z1lUL^!u zl*&?$z(YdppY4%0)UzY8s))IsJl!)LE~z={e*hHUi+Q_-AAY>A&&9WLp7XsZ*jGkn z#g3XH?O!)+9i6J5CUDs3b4-Onw1;a=kN18P0ILaTa`D2#62&nDj1*wulL*`w6KEi} zT(qX3-r-XC&O*cxaO>d88ee2jZmO)O$)#9{S+>QZlR?iD+1)DMz>$0m z9I$U!H$7q9HN|B~Yo9;BW$*fkUqbJ%BhUA`+^+-Rz&gE~ji2wniRM=;dlY-u_3pV9 zfYf0KKzIIpjR%kN0IU@p=)M}0{H^FktoUFgIxXkx-YY-;>XDPrEC=JH0}JLujBA5c zjRqy`jUMyquT{b>GduK1^Lp zi=x9%CB+a6W`wi@=E1_iianZNUfnn3-`8KSV#}T?Xygg`1Lq4YtKM3qr|yln+4Y(S zyy2Ad1f2i)PsXCVtekkm!lu33mVAV~8@!sN#D2x|=LsT8j`sl`sDFk4sAnRMPwc*! z*rG~Cybm^rsPSQ~&7M*VK!@-nwH_|5t*7W6ZwQZoIvtcXjFhbJ*fW<$y10D6j3ic= z^$5}k*Mx<7cof%o^p8NKd`Pw4^sk+-#}+3m_N;cpE_@|P)p|370JNnaGe;?m0ubu4 zti$7mL~Kya>pRC>Jr)<~&13bd@Tn8Qznh2319Ra^J*De-pFeuB)nqWW=a>liQ~1ME z&##FJ5Lj)R)|dSoS~XRP)%6-d`8|r{Ufma%4M$TGv2ncq>*`^P)~&UT;s+~?fa zxvuN``PPlM)5Sjz3^WxP7zFR1#nb_37Hp6Fq)wLdW=2$!|3ak zo;)OO1G$B(z3C8C1SA2+;^>D1?ORmImd~h&r6|qqVT%VTqYP8;{GN-eJSfF#z1EF6 z{#EO99*=|q9|75NIBhpov;7t9C6X=D7_g`mzE)PU?sJ^B4j0{~`b13v+&sh2U;BP5 zKgm{gLk0o;C+nD&rRJOJv{2#n)`RZcz1mdxFD2aX-+p@(_~Dng0sd>eArl@j`g$lZ zc~bN0f>C($Bb~qrF0Io;AEgz)3jz813TuuS9<-mIB~VzAT5g3r`uB)Fo3}ApS3=Qr z-IM}Ae*q;zQO86t{=ilzHaz&*>2N885J9pr6i2+`);w^hzapJ%3mX&4a-2ntD@aRs zVGr+O4`);Nv(_4dsbRS)KCdf~fWJ~rdAYoub^U}xqkFFa-TFS@M{?B3fyujr(AyP; z(eft`e~CJTUJTrHvT@k@Y=>|q9a1qgMbDw_mHpjUcdRSz9|GXa;1ZiE+c|Fw`&)Mb zV0U0vm1Es^hlGVbOsKC#-~ArIj^PF9bWnyor}xP?!Nflt5r%YROX_*Ymf<|>tY^<} zYIPtbAb2mXZg4CsE9<45r8f_q=rllSz)kfPej3n&tOW{nwm{QLMW*{?c}Cu&F*#a8 zgWNy+hi;gFN#{=5?^MKCuUnoQjxvO*s;~bbFR!qk-y;!{-PU`isKHgc_&-NiyGVWIaQLKRa@oYf zF`&tOG~0)|X|(Ycj-V5jR?hs-e;)esGt*c7U!7`;_1&Ns?8(?>_ zQ+vv)0Liw&Ct_D&@4JHX53d23i(16N9eU0I_wHWmMu|acevht7zEhV~06AGS2_iot z2FMW%M#R1}#u)x7ZbcVDwqrFK-EP+YnqT-)+jFex2;b`YWSNK~wjj^dn1u+jo)iVL zZi|j#KPQO*nz0cuoCs=qw3_DuP)h@ak)=6z*F;LNoInvo1;W*ZY&&NI#iVuT|Qff$rD0K|J1G*Q%qf5O z5)%^_|H|79V|fx6-P4LnO0a%v!&KMp%qqZ}%1iBYQs>i;rg!H;+_jRA8>Iv`_4oJs zS&8SA8PwGzb?@TQh0f&*WD*^;+sel^)byWq&vYCAB!W>j_FvE`Zg~y% z%XsxayLMXr{m6fMg0AzY3;=_g@7m|`Wa7B4S|R85t5W4g(+N(V;I$gWA!Q?HB?&%7 zJ8OrFiWSY8{qU>@JKhbrJZ;pEc=6H&E5ncmrkP`T^p?+1QU<13$AV;}gKYU(s%v2S zPrTCU;`>tHq?XKrj4mdM>!9;%fWqQT4YNArsA_uC74-kAreYF#2Rxeqa^=D87CbD- z9q@g3dwzCZ93j&ncMOm6uj>==kxPze?v*%puF{XW!gGQj_TkBg^B3K({uPsH*A*)% z=rjq%GXh~){oCH^G0EI6%)FERNyrgp9C#UXdenL*23o-YdC!Pmx(#$V(1rsfCA;)K z|8KE3+Lg~T;N4XoT#j^h&w_7;X!*3+s3?w-f_;i+X8SLcNsrOxQFK)K8ZQn`f^h02 zHUaS?;;L;+)imEE2`=e zVAlIM;V4RFc<(#{q|RaSrE?A5Ofz!#Vr9#)RhA#i)d78!E>F1z{+~bpuU=XGZbyJF zSb!XDkz+Xp9Jj~4=dHj6ssW%@FIT0-qM4uk_j|iQjQs$$Kd*Y&C+Qsaa2LGVV0gSt zBv<;SpKNx8Mtvwfz?qFXt-$#Ri}d>TF=KO=Ze*R3LkoEk7*9@W(CYWU@F?S_qxD0O zN}=#C@}`H$>GjQv<+uF5TzuPRT>;N$l8OF{!%8|9x2|%@Cq3A@EhXUxa9R8#owG_??e!`{s z_U>b&TOoEFojg`SeEw+fKP?S|z_+R=Ijh_TXx3)1rHS5 zmrG`4?ft}EP;T%zrKwbxH3A64zA^uRf1m zo5&=q&?OWSrxekiptMZ~WwHGNxZD->q43}GrfoQaaJ%cmUMeVayM686e3&T`!J3{( z%6{YWO+1(8S2m=IvN5S#Xj_qdb0DNaKF&5-6*I$EiV$!oG)+sneQF2`_9I&zWiJKPE@;{bLZ$uGHy^TV>$7mPDjp;b_)LIsg4QcOcrzY4HyGQJ zx*?j8U?9Nd$lOH6lvK2`x4qs_-G%E3N3dYr+{+&I>ybE=FGJI>;QdoB5K+IUvlMla zGRL9aLH2-8@8UDM?TarHwPmuU)A+5j?u-z}PE>P0lHSe*lqU1++4o5`f*5DMnqjXN^ zl(E@O>|8})Eu zygaCC|D$M<04yTVR3JfY!$l8;qTwjd4kq+nW}b^`r+?EJ7fq7nQiI%oSq?j7e+|t`$vZ0*KDXso9 zxw<@vh1eV=$*9;5tb_gUbY{oGJ<0J38qw?=oyH`BW!fSIxIQ&m?_!$f4MP{%)WCo|TL5UNwK2a;ayWhk5K598dpC($B&H1=9Yn$k*{b z>{o-U2Mg!S06S*&&KW~r-<54!=Nl@7g`9PKXD+9C(VTrxh;L;$am4k30BDLomKd#V zEFdw+a4VM9aqB8kl|}IWJ8!x0yOXy7*{fkp`+1`!VKX#zrn`_!y?*JlJonp$>+tSf zBP(~>Vit6K;+Hx3@S9)RbU&~9MgO~tT|M`zKqdiI^X!d!t6yzg^|O(?)1f5h-a@Xu zm;u4a*O1WxL5L8vgAsE4py%r2coMJm^^62C(+rL-n0wLnNrbQh>yd;2ji9xyTJAn2+26nQ~kl?v4)aF#X<(*m3`t=B%#TqGcuC}rA*^> ziax3h9Up{Un^DG<&9fK{v-k!e8TpsH4c-Rc&Lk?zoyPwxb zde^qt<-)MGf6p7*_pRibMpg1FpS?-0h7C^jP@hvmWP0(tt-Qc5;ik6|!VjLBzt5Nb z39}o#9jMRzo__(c%&nW^1inqJ+5s~^J19Et&Z5eF6~n*W&4qsicJ9xj7ip3sxH`EV zBv?K9M!>ER_Q{o5V)6ok!H;;s$7HmTH3cd)JAsqFywE0lGWpC;+Cx7{1x~ZwNpn

|lE?h9vW*K8~nqEpTnlaNAu5Xb5ooa=7pAm`|i^|fB zEH*gxF333=tRMAhrlm|wYTkFeD!PkepW0xUgF>5^JoF_htL}v&P6;hhD?h?ENF=ED z_ZZ@fel6pV{25P;E=Ie~(-?mP_N>ZOPSu^&;*gg6V1vm7#H;AYIMIyW%i8vRo6xQu z1MGcJDZ7>LFeEO96Zz`LR9F{-s&@TN!C-ed#Hgcjxy@>7kAZ)l2}-4;KV?KgU3T^h z(xgwLn$%q*ESP**Sm+Fo;N;lf51aJYgm0j0o8d1<7>0z+h@ahn80-Eg`mv$KSHP-X z%mtoker+qVk552q%cqT{0*4yexYHKK$m|3-I5jqnSl;rLa;E~It@ObdSEarnl(@+-S{=r9KcYi<zn>I)0!fG&2%*}c6N~}~!i3;=n`c5(8Rd$LZztUX z3sM zpVh=|9cK{}(Wu?t6;JNKF{`E^@3+EY_|86CXDayA#wO@Xrhk>O!_PqNc0}e7q(C9@ z{+(@*Q5@2h!Ch=4xl$g|if{t%56YAdxI-~qjjD`g;5kobouqb(#fiB)?i5`nf8m0X zT5;8WsCiUC$Ck};UmzJ79fvgVp-gH=>$tqh-bmdHZo!#+f5!|q*o1CQae1CTGa0Uf zy3j!~qoz3gJ3KGm!QfkZs9bZ9DEsod)X4xnocH&LUe+`|(ywpyx3+bgH-one2DFHE z*Eh=ic~4 z?PMFsJK}0ozi*e9K8wL?l51FPC z>{+Ia96mj^%#1Tqj$Y`XC+frR?y}+verQ&~Rj5v}EaK{+2mZDy;jG-41zGZ%#mkBT zE!ad-pPM6JWwVp?%QJgY?Mk2&Zm(jx1dGm%>n=!=2w(V38IPLk)NH8;WZqzru{qlo z<^)6Ngz#;m(Kj|oS)ywM=$=77ZEiH}c4g3ghL(jUxHKwV6Zdp~HtU z%aP5P>;VWN7H%Z z+gn?A#?KDc52%l zAu+--NHTm((y^;xAJ&^N~J&A#cp`6Xhv>DolPQ`4<%?vT)mH96fND7~IgW)^&>cAJYL)RR910 literal 0 HcmV?d00001 diff --git a/deploy/faucet/public/assets/javascripts/application/index.js b/deploy/faucet/public/assets/javascripts/application/index.js index 2416247..26ba78b 100644 --- a/deploy/faucet/public/assets/javascripts/application/index.js +++ b/deploy/faucet/public/assets/javascripts/application/index.js @@ -2,17 +2,17 @@ $(function() { var loader = $(".loading-container"); updateBalance(); // on form submit - $( "#faucetForm" ).submit(function( e ) { + $( ".ff" ).submit(function( e ) { e.preventDefault(); $this = $(this); loader.removeClass("hidden"); - var receiver = $("#receiver").val(); + $.ajax({ url:"/", type:"POST", data: $this.serialize() }).done(function(data) { - grecaptcha.reset(); + //grecaptcha.reset(); if (!data.success) { loader.addClass("hidden"); console.log(data) @@ -21,15 +21,15 @@ $(function() { return; } - $("#receiver").val(''); + $(".rec").val(''); loader.addClass("hidden"); swal("Success", - `0.05 🌩ETH has been successfully transferred to ${receiver}`, + `🌩ETH has been successfully transferred!`, "success" ); updateBalance(); }).fail(function(err) { - grecaptcha.reset(); + //grecaptcha.reset(); console.log(err); loader.addClass("hidden"); }); diff --git a/deploy/faucet/public/views/index.pug b/deploy/faucet/public/views/index.pug index 8e152ec..3168872 100644 --- a/deploy/faucet/public/views/index.pug +++ b/deploy/faucet/public/views/index.pug @@ -39,13 +39,13 @@ html .card-header | Thundercloud faucet .card-body - form#faucetForm(action='/' method='POST') + form#faucetForm.ff(action='/' method='POST') .form-group .input-group span.input-group-prepend span.input-group-text.bg-transparent.border-right-0 i.fas.fa-wallet.fa-2x - input#receiver.form-control.form-control-lg.py-2.border-left-0.border(name='receiver' type='text' placeholder='Enter wallet address...') + input#receiver.rec.form-control.form-control-lg.py-2.border-left-0.border(name='receiver' type='text' placeholder='Enter wallet address...') span.input-group-append button.btn.btn-outline-secondary.border-left-0.border(type='button' data-toggle='popover' data-trigger='focus' title='Wallet Address' data-content='This address will get the Ether') i.fas.fa-info @@ -74,13 +74,13 @@ html .card-header | Thundercloud Faucet .card-body - form#faucetFormMin(action='/' method='POST') + form#faucetFormMin.ff(action='/' method='POST') .form-group .input-group span.input-group-prepend span.input-group-text.bg-transparent.border-right-0 i.fas.fa-wallet.fa-2x - input#receiverMin.form-control.form-control-lg.py-2.border-left-0.border(name='receiver' type='text' placeholder='Enter wallet address...') + input#receiverMin.rec.form-control.form-control-lg.py-2.border-left-0.border(name='receiver' type='text' placeholder='Enter wallet address...') span.input-group-append button.btn.btn-outline-secondary.border-left-0.border(type='button' data-toggle='popover' data-trigger='focus' title='Wallet Address' data-content='This address will get the Ether.') i.fas.fa-info diff --git a/package.json b/package.json index 0277457..285db94 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "ganache-cli": "^6.5.0" }, "scripts": { - "clean": "rm -rf deploy/db/*", + "clean": "rm -rf deploy/db/* && rm -rf deploy/keys/*", "faucet": "cd deploy/faucet && yarn start" } } diff --git a/start.js b/start.js index 79b42f6..0bd4abf 100644 --- a/start.js +++ b/start.js @@ -9,8 +9,10 @@ const ssz = require('@chainsafe/ssz'); const BN = require('bn.js'); // Deposit contract data -const deposit_contract_bytecode = "0x740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052341561009857600080fd5b6101406000601f818352015b600061014051602081106100b757600080fd5b600260c052602060c020015460208261016001015260208101905061014051602081106100e357600080fd5b600260c052602060c020015460208261016001015260208101905080610160526101609050602060c0825160208401600060025af161012157600080fd5b60c0519050606051600161014051018060405190131561014057600080fd5b809190121561014e57600080fd5b6020811061015b57600080fd5b600260c052602060c02001555b81516001018083528114156100a4575b505061124d56600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052600015610277575b6101605261014052600061018052610140516101a0526101c060006008818352015b61018051600860008112156100da578060000360020a82046100e1565b8060020a82025b905090506101805260ff6101a051166101e052610180516101e0516101805101101561010c57600080fd5b6101e0516101805101610180526101a0517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86000811215610155578060000360020a820461015c565b8060020a82025b905090506101a0525b81516001018083528114156100bd575b50506018600860208206610200016020828401111561019357600080fd5b60208061022082610180600060046015f15050818152809050905090508051602001806102c0828460006004600a8704601201f16101d057600080fd5b50506102c05160206001820306601f82010390506103206102c0516008818352015b826103205111156102025761021e565b6000610320516102e001535b81516001018083528114156101f2575b50505060206102a05260406102c0510160206001820306601f8201039050610280525b6000610280511115156102535761026f565b602061028051036102a001516020610280510361028052610241565b610160515650005b63863a311b600051141561050957341561029057600080fd5b6000610140526101405161016052600154610180526101a060006020818352015b60016001610180511614156103325760006101a051602081106102d357600080fd5b600060c052602060c02001546020826102400101526020810190506101605160208261024001015260208101905080610240526102409050602060c0825160208401600060025af161032457600080fd5b60c0519050610160526103a0565b6000610160516020826101c00101526020810190506101a0516020811061035857600080fd5b600260c052602060c02001546020826101c0010152602081019050806101c0526101c09050602060c0825160208401600060025af161039657600080fd5b60c0519050610160525b61018060026103ae57600080fd5b60028151048152505b81516001018083528114156102b1575b505060006101605160208261046001015260208101905061014051610160516101805163806732896102e05260015461030052610300516006580161009b565b506103605260006103c0525b6103605160206001820306601f82010390506103c0511015156104355761044e565b6103c05161038001526103c0516020016103c052610413565b61018052610160526101405261036060088060208461046001018260208501600060046012f150508051820191505060006018602082066103e0016020828401111561049957600080fd5b60208061040082610140600060046015f150508181528090509050905060188060208461046001018260208501600060046014f150508051820191505080610460526104609050602060c0825160208401600060025af16104f957600080fd5b60c051905060005260206000f350005b63621fd130600051141561061c57341561052257600080fd5b63806732896101405260015461016052610160516006580161009b565b506101c0526000610220525b6101c05160206001820306601f82010390506102205110151561056d57610586565b610220516101e00152610220516020016102205261054b565b6101c0805160200180610280828460006004600a8704601201f16105a957600080fd5b50506102805160206001820306601f82010390506102e0610280516008818352015b826102e05111156105db576105f7565b60006102e0516102a001535b81516001018083528114156105cb575b5050506020610260526040610280510160206001820306601f8201039050610260f350005b63c47e300d60005114156110c857605060043560040161014037603060043560040135111561064a57600080fd5b60406024356004016101c037602060243560040135111561066a57600080fd5b608060443560040161022037606060443560040135111561068a57600080fd5b63ffffffff6001541061069c57600080fd5b633b9aca006102e0526102e0516106b257600080fd5b6102e05134046102c052633b9aca006102c05110156106d057600080fd5b603061014051146106e057600080fd5b60206101c051146106f057600080fd5b6060610220511461070057600080fd5b610140610360525b6103605151602061036051016103605261036061036051101561072a57610708565b6380673289610380526102c0516103a0526103a0516006580161009b565b50610400526000610460525b6104005160206001820306601f8201039050610460511015156107765761078f565b6104605161042001526104605160200161046052610754565b610340610360525b61036051526020610360510361036052610140610360511015156107ba57610797565b610400805160200180610300828460006004600a8704601201f16107dd57600080fd5b5050610140610480525b61048051516020610480510161048052610480610480511015610809576107e7565b63806732896104a0526001546104c0526104c0516006580161009b565b50610520526000610580525b6105205160206001820306601f8201039050610580511015156108545761086d565b6105805161054001526105805160200161058052610832565b610460610480525b610480515260206104805103610480526101406104805110151561089857610875565b6105208051602001806105a0828460006004600a8704601201f16108bb57600080fd5b505060a06106205261062051610660526101408051602001806106205161066001828460006004600a8704601201f16108f357600080fd5b505061062051610660015160206001820306601f8201039050610620516106600161060081516040818352015b83610600511015156109315761094e565b6000610600516020850101535b8151600101808352811415610920575b50505050602061062051610660015160206001820306601f82010390506106205101016106205261062051610680526101c08051602001806106205161066001828460006004600a8704601201f16109a557600080fd5b505061062051610660015160206001820306601f8201039050610620516106600161060081516020818352015b83610600511015156109e357610a00565b6000610600516020850101535b81516001018083528114156109d2575b50505050602061062051610660015160206001820306601f820103905061062051010161062052610620516106a0526103008051602001806106205161066001828460006004600a8704601201f1610a5757600080fd5b505061062051610660015160206001820306601f8201039050610620516106600161060081516020818352015b8361060051101515610a9557610ab2565b6000610600516020850101535b8151600101808352811415610a84575b50505050602061062051610660015160206001820306601f820103905061062051010161062052610620516106c0526102208051602001806106205161066001828460006004600a8704601201f1610b0957600080fd5b505061062051610660015160206001820306601f8201039050610620516106600161060081516060818352015b8361060051101515610b4757610b64565b6000610600516020850101535b8151600101808352811415610b36575b50505050602061062051610660015160206001820306601f820103905061062051010161062052610620516106e0526105a08051602001806106205161066001828460006004600a8704601201f1610bbb57600080fd5b505061062051610660015160206001820306601f8201039050610620516106600161060081516020818352015b8361060051101515610bf957610c16565b6000610600516020850101535b8151600101808352811415610be8575b50505050602061062051610660015160206001820306601f8201039050610620510101610620527f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c561062051610660a160006107005260006101406030806020846107c001018260208501600060046016f150508051820191505060006010602082066107400160208284011115610cad57600080fd5b60208061076082610700600060046015f15050818152809050905090506010806020846107c001018260208501600060046013f1505080518201915050806107c0526107c09050602060c0825160208401600060025af1610d0d57600080fd5b60c0519050610720526000600060406020820661086001610220518284011115610d3657600080fd5b606080610880826020602088068803016102200160006004601bf1505081815280905090509050602060c0825160208401600060025af1610d7657600080fd5b60c0519050602082610a600101526020810190506000604060206020820661092001610220518284011115610daa57600080fd5b606080610940826020602088068803016102200160006004601bf15050818152809050905090506020806020846109e001018260208501600060046015f1505080518201915050610700516020826109e0010152602081019050806109e0526109e09050602060c0825160208401600060025af1610e2757600080fd5b60c0519050602082610a6001015260208101905080610a6052610a609050602060c0825160208401600060025af1610e5e57600080fd5b60c0519050610840526000600061072051602082610b000101526020810190506101c0602080602084610b0001018260208501600060046015f150508051820191505080610b0052610b009050602060c0825160208401600060025af1610ec457600080fd5b60c0519050602082610c800101526020810190506000610300600880602084610c0001018260208501600060046012f15050805182019150506000601860208206610b800160208284011115610f1957600080fd5b602080610ba082610700600060046015f1505081815280905090509050601880602084610c0001018260208501600060046014f150508051820191505061084051602082610c0001015260208101905080610c0052610c009050602060c0825160208401600060025af1610f8c57600080fd5b60c0519050602082610c8001015260208101905080610c8052610c809050602060c0825160208401600060025af1610fc357600080fd5b60c0519050610ae0526001805460018254011015610fe057600080fd5b6001815401815550600154610d0052610d2060006020818352015b60016001610d005116141561103057610ae051610d20516020811061101f57600080fd5b600060c052602060c02001556110c4565b6000610d20516020811061104357600080fd5b600060c052602060c0200154602082610d40010152602081019050610ae051602082610d4001015260208101905080610d4052610d409050602060c0825160208401600060025af161109457600080fd5b60c0519050610ae052610d0060026110ab57600080fd5b60028151048152505b8151600101808352811415610ffb575b5050005b60006000fd5b61017f61124d0361017f60003961017f61124d036000f3"; -const deposit_contract_abi = '[{"name": "DepositEvent", "inputs": [{"type": "bytes", "name": "pubkey", "indexed": false}, {"type": "bytes", "name": "withdrawal_credentials", "indexed": false}, {"type": "bytes", "name": "amount", "indexed": false}, {"type": "bytes", "name": "signature", "indexed": false}, {"type": "bytes", "name": "index", "indexed": false}], "anonymous": false, "type": "event"}, {"outputs": [], "inputs": [], "constant": false, "payable": false, "type": "constructor"}, {"name": "get_hash_tree_root", "outputs": [{"type": "bytes32", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 91707}, {"name": "get_deposit_count", "outputs": [{"type": "bytes", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 10463}, {"name": "deposit", "outputs": [], "inputs": [{"type": "bytes", "name": "pubkey"}, {"type": "bytes", "name": "withdrawal_credentials"}, {"type": "bytes", "name": "signature"}], "constant": false, "payable": true, "type": "function", "gas": 1334230}]'; +//const deposit_contract_bytecode = "0x740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052341561009857600080fd5b6101406000601f818352015b600061014051602081106100b757600080fd5b600260c052602060c020015460208261016001015260208101905061014051602081106100e357600080fd5b600260c052602060c020015460208261016001015260208101905080610160526101609050602060c0825160208401600060025af161012157600080fd5b60c0519050606051600161014051018060405190131561014057600080fd5b809190121561014e57600080fd5b6020811061015b57600080fd5b600260c052602060c02001555b81516001018083528114156100a4575b505061124d56600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052600015610277575b6101605261014052600061018052610140516101a0526101c060006008818352015b61018051600860008112156100da578060000360020a82046100e1565b8060020a82025b905090506101805260ff6101a051166101e052610180516101e0516101805101101561010c57600080fd5b6101e0516101805101610180526101a0517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86000811215610155578060000360020a820461015c565b8060020a82025b905090506101a0525b81516001018083528114156100bd575b50506018600860208206610200016020828401111561019357600080fd5b60208061022082610180600060046015f15050818152809050905090508051602001806102c0828460006004600a8704601201f16101d057600080fd5b50506102c05160206001820306601f82010390506103206102c0516008818352015b826103205111156102025761021e565b6000610320516102e001535b81516001018083528114156101f2575b50505060206102a05260406102c0510160206001820306601f8201039050610280525b6000610280511115156102535761026f565b602061028051036102a001516020610280510361028052610241565b610160515650005b63863a311b600051141561050957341561029057600080fd5b6000610140526101405161016052600154610180526101a060006020818352015b60016001610180511614156103325760006101a051602081106102d357600080fd5b600060c052602060c02001546020826102400101526020810190506101605160208261024001015260208101905080610240526102409050602060c0825160208401600060025af161032457600080fd5b60c0519050610160526103a0565b6000610160516020826101c00101526020810190506101a0516020811061035857600080fd5b600260c052602060c02001546020826101c0010152602081019050806101c0526101c09050602060c0825160208401600060025af161039657600080fd5b60c0519050610160525b61018060026103ae57600080fd5b60028151048152505b81516001018083528114156102b1575b505060006101605160208261046001015260208101905061014051610160516101805163806732896102e05260015461030052610300516006580161009b565b506103605260006103c0525b6103605160206001820306601f82010390506103c0511015156104355761044e565b6103c05161038001526103c0516020016103c052610413565b61018052610160526101405261036060088060208461046001018260208501600060046012f150508051820191505060006018602082066103e0016020828401111561049957600080fd5b60208061040082610140600060046015f150508181528090509050905060188060208461046001018260208501600060046014f150508051820191505080610460526104609050602060c0825160208401600060025af16104f957600080fd5b60c051905060005260206000f350005b63621fd130600051141561061c57341561052257600080fd5b63806732896101405260015461016052610160516006580161009b565b506101c0526000610220525b6101c05160206001820306601f82010390506102205110151561056d57610586565b610220516101e00152610220516020016102205261054b565b6101c0805160200180610280828460006004600a8704601201f16105a957600080fd5b50506102805160206001820306601f82010390506102e0610280516008818352015b826102e05111156105db576105f7565b60006102e0516102a001535b81516001018083528114156105cb575b5050506020610260526040610280510160206001820306601f8201039050610260f350005b63c47e300d60005114156110c857605060043560040161014037603060043560040135111561064a57600080fd5b60406024356004016101c037602060243560040135111561066a57600080fd5b608060443560040161022037606060443560040135111561068a57600080fd5b63ffffffff6001541061069c57600080fd5b633b9aca006102e0526102e0516106b257600080fd5b6102e05134046102c052633b9aca006102c05110156106d057600080fd5b603061014051146106e057600080fd5b60206101c051146106f057600080fd5b6060610220511461070057600080fd5b610140610360525b6103605151602061036051016103605261036061036051101561072a57610708565b6380673289610380526102c0516103a0526103a0516006580161009b565b50610400526000610460525b6104005160206001820306601f8201039050610460511015156107765761078f565b6104605161042001526104605160200161046052610754565b610340610360525b61036051526020610360510361036052610140610360511015156107ba57610797565b610400805160200180610300828460006004600a8704601201f16107dd57600080fd5b5050610140610480525b61048051516020610480510161048052610480610480511015610809576107e7565b63806732896104a0526001546104c0526104c0516006580161009b565b50610520526000610580525b6105205160206001820306601f8201039050610580511015156108545761086d565b6105805161054001526105805160200161058052610832565b610460610480525b610480515260206104805103610480526101406104805110151561089857610875565b6105208051602001806105a0828460006004600a8704601201f16108bb57600080fd5b505060a06106205261062051610660526101408051602001806106205161066001828460006004600a8704601201f16108f357600080fd5b505061062051610660015160206001820306601f8201039050610620516106600161060081516040818352015b83610600511015156109315761094e565b6000610600516020850101535b8151600101808352811415610920575b50505050602061062051610660015160206001820306601f82010390506106205101016106205261062051610680526101c08051602001806106205161066001828460006004600a8704601201f16109a557600080fd5b505061062051610660015160206001820306601f8201039050610620516106600161060081516020818352015b83610600511015156109e357610a00565b6000610600516020850101535b81516001018083528114156109d2575b50505050602061062051610660015160206001820306601f820103905061062051010161062052610620516106a0526103008051602001806106205161066001828460006004600a8704601201f1610a5757600080fd5b505061062051610660015160206001820306601f8201039050610620516106600161060081516020818352015b8361060051101515610a9557610ab2565b6000610600516020850101535b8151600101808352811415610a84575b50505050602061062051610660015160206001820306601f820103905061062051010161062052610620516106c0526102208051602001806106205161066001828460006004600a8704601201f1610b0957600080fd5b505061062051610660015160206001820306601f8201039050610620516106600161060081516060818352015b8361060051101515610b4757610b64565b6000610600516020850101535b8151600101808352811415610b36575b50505050602061062051610660015160206001820306601f820103905061062051010161062052610620516106e0526105a08051602001806106205161066001828460006004600a8704601201f1610bbb57600080fd5b505061062051610660015160206001820306601f8201039050610620516106600161060081516020818352015b8361060051101515610bf957610c16565b6000610600516020850101535b8151600101808352811415610be8575b50505050602061062051610660015160206001820306601f8201039050610620510101610620527f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c561062051610660a160006107005260006101406030806020846107c001018260208501600060046016f150508051820191505060006010602082066107400160208284011115610cad57600080fd5b60208061076082610700600060046015f15050818152809050905090506010806020846107c001018260208501600060046013f1505080518201915050806107c0526107c09050602060c0825160208401600060025af1610d0d57600080fd5b60c0519050610720526000600060406020820661086001610220518284011115610d3657600080fd5b606080610880826020602088068803016102200160006004601bf1505081815280905090509050602060c0825160208401600060025af1610d7657600080fd5b60c0519050602082610a600101526020810190506000604060206020820661092001610220518284011115610daa57600080fd5b606080610940826020602088068803016102200160006004601bf15050818152809050905090506020806020846109e001018260208501600060046015f1505080518201915050610700516020826109e0010152602081019050806109e0526109e09050602060c0825160208401600060025af1610e2757600080fd5b60c0519050602082610a6001015260208101905080610a6052610a609050602060c0825160208401600060025af1610e5e57600080fd5b60c0519050610840526000600061072051602082610b000101526020810190506101c0602080602084610b0001018260208501600060046015f150508051820191505080610b0052610b009050602060c0825160208401600060025af1610ec457600080fd5b60c0519050602082610c800101526020810190506000610300600880602084610c0001018260208501600060046012f15050805182019150506000601860208206610b800160208284011115610f1957600080fd5b602080610ba082610700600060046015f1505081815280905090509050601880602084610c0001018260208501600060046014f150508051820191505061084051602082610c0001015260208101905080610c0052610c009050602060c0825160208401600060025af1610f8c57600080fd5b60c0519050602082610c8001015260208101905080610c8052610c809050602060c0825160208401600060025af1610fc357600080fd5b60c0519050610ae0526001805460018254011015610fe057600080fd5b6001815401815550600154610d0052610d2060006020818352015b60016001610d005116141561103057610ae051610d20516020811061101f57600080fd5b600060c052602060c02001556110c4565b6000610d20516020811061104357600080fd5b600060c052602060c0200154602082610d40010152602081019050610ae051602082610d4001015260208101905080610d4052610d409050602060c0825160208401600060025af161109457600080fd5b60c0519050610ae052610d0060026110ab57600080fd5b60028151048152505b8151600101808352811415610ffb575b5050005b60006000fd5b61017f61124d0361017f60003961017f61124d036000f3"; +const deposit_contract_bytecode = "0x740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052341561009857600080fd5b6101406000601f818352015b600061014051602081106100b757600080fd5b600260c052602060c020015460208261016001015260208101905061014051602081106100e357600080fd5b600260c052602060c020015460208261016001015260208101905080610160526101609050602060c0825160208401600060025af161012157600080fd5b60c0519050606051600161014051018060405190131561014057600080fd5b809190121561014e57600080fd5b6020811061015b57600080fd5b600260c052602060c02001555b81516001018083528114156100a4575b505061134d56600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052600015610277575b6101605261014052600061018052610140516101a0526101c060006008818352015b61018051600860008112156100da578060000360020a82046100e1565b8060020a82025b905090506101805260ff6101a051166101e052610180516101e0516101805101101561010c57600080fd5b6101e0516101805101610180526101a0517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86000811215610155578060000360020a820461015c565b8060020a82025b905090506101a0525b81516001018083528114156100bd575b50506018600860208206610200016020828401111561019357600080fd5b60208061022082610180600060046015f15050818152809050905090508051602001806102c0828460006004600a8704601201f16101d057600080fd5b50506102c05160206001820306601f82010390506103206102c0516008818352015b826103205111156102025761021e565b6000610320516102e001535b81516001018083528114156101f2575b50505060206102a05260406102c0510160206001820306601f8201039050610280525b6000610280511115156102535761026f565b602061028051036102a001516020610280510361028052610241565b610160515650005b63863a311b600051141561050957341561029057600080fd5b6000610140526101405161016052600154610180526101a060006020818352015b60016001610180511614156103325760006101a051602081106102d357600080fd5b600060c052602060c02001546020826102400101526020810190506101605160208261024001015260208101905080610240526102409050602060c0825160208401600060025af161032457600080fd5b60c0519050610160526103a0565b6000610160516020826101c00101526020810190506101a0516020811061035857600080fd5b600260c052602060c02001546020826101c0010152602081019050806101c0526101c09050602060c0825160208401600060025af161039657600080fd5b60c0519050610160525b61018060026103ae57600080fd5b60028151048152505b81516001018083528114156102b1575b505060006101605160208261046001015260208101905061014051610160516101805163806732896102e05260015461030052610300516006580161009b565b506103605260006103c0525b6103605160206001820306601f82010390506103c0511015156104355761044e565b6103c05161038001526103c0516020016103c052610413565b61018052610160526101405261036060088060208461046001018260208501600060046012f150508051820191505060006018602082066103e0016020828401111561049957600080fd5b60208061040082610140600060046015f150508181528090509050905060188060208461046001018260208501600060046014f150508051820191505080610460526104609050602060c0825160208401600060025af16104f957600080fd5b60c051905060005260206000f350005b63621fd130600051141561061c57341561052257600080fd5b63806732896101405260015461016052610160516006580161009b565b506101c0526000610220525b6101c05160206001820306601f82010390506102205110151561056d57610586565b610220516101e00152610220516020016102205261054b565b6101c0805160200180610280828460006004600a8704601201f16105a957600080fd5b50506102805160206001820306601f82010390506102e0610280516008818352015b826102e05111156105db576105f7565b60006102e0516102a001535b81516001018083528114156105cb575b5050506020610260526040610280510160206001820306601f8201039050610260f350005b63c47e300d60005114156111c857605060043560040161014037603060043560040135111561064a57600080fd5b60406024356004016101c037602060243560040135111561066a57600080fd5b608060443560040161022037606060443560040135111561068a57600080fd5b63ffffffff6001541061069c57600080fd5b633b9aca006102e0526102e0516106b257600080fd5b6102e05134046102c0526308c379a061030052602061032052601b610340527f4d696e696d756d206465706f736974206e6f74207265616368656400000000006103605261034050633b9aca006102c051101561071057608461031cfd5b6308c379a06103a05260206103c05260156103e0527f5075626b6579206c656e20697320696e76616c69640000000000000000000000610400526103e050603061014051146107605760846103bcfd5b6308c379a061044052602061046052601c610480527f57697468647261772063726564206c656e20697320696e76616c6964000000006104a0526104805060206101c051146107b057608461045cfd5b6308c379a06104e0526020610500526012610520527f536967206c656e67746820696e76616c696400000000000000000000000000006105405261052050606061022051146108005760846104fcfd5b6101406105e0525b6105e0515160206105e051016105e0526105e06105e051101561082a57610808565b6380673289610600526102c05161062052610620516006580161009b565b506106805260006106e0525b6106805160206001820306601f82010390506106e0511015156108765761088f565b6106e0516106a001526106e0516020016106e052610854565b6105c06105e0525b6105e0515260206105e051036105e0526101406105e0511015156108ba57610897565b610680805160200180610580828460006004600a8704601201f16108dd57600080fd5b5050610140610700525b61070051516020610700510161070052610700610700511015610909576108e7565b63806732896107205260015461074052610740516006580161009b565b506107a0526000610800525b6107a05160206001820306601f8201039050610800511015156109545761096d565b610800516107c001526108005160200161080052610932565b6106e0610700525b610700515260206107005103610700526101406107005110151561099857610975565b6107a0805160200180610820828460006004600a8704601201f16109bb57600080fd5b505060a06108a0526108a0516108e0526101408051602001806108a0516108e001828460006004600a8704601201f16109f357600080fd5b50506108a0516108e0015160206001820306601f82010390506108a0516108e00161088081516040818352015b8361088051101515610a3157610a4e565b6000610880516020850101535b8151600101808352811415610a20575b5050505060206108a0516108e0015160206001820306601f82010390506108a05101016108a0526108a051610900526101c08051602001806108a0516108e001828460006004600a8704601201f1610aa557600080fd5b50506108a0516108e0015160206001820306601f82010390506108a0516108e00161088081516020818352015b8361088051101515610ae357610b00565b6000610880516020850101535b8151600101808352811415610ad2575b5050505060206108a0516108e0015160206001820306601f82010390506108a05101016108a0526108a051610920526105808051602001806108a0516108e001828460006004600a8704601201f1610b5757600080fd5b50506108a0516108e0015160206001820306601f82010390506108a0516108e00161088081516020818352015b8361088051101515610b9557610bb2565b6000610880516020850101535b8151600101808352811415610b84575b5050505060206108a0516108e0015160206001820306601f82010390506108a05101016108a0526108a051610940526102208051602001806108a0516108e001828460006004600a8704601201f1610c0957600080fd5b50506108a0516108e0015160206001820306601f82010390506108a0516108e00161088081516060818352015b8361088051101515610c4757610c64565b6000610880516020850101535b8151600101808352811415610c36575b5050505060206108a0516108e0015160206001820306601f82010390506108a05101016108a0526108a051610960526108208051602001806108a0516108e001828460006004600a8704601201f1610cbb57600080fd5b50506108a0516108e0015160206001820306601f82010390506108a0516108e00161088081516020818352015b8361088051101515610cf957610d16565b6000610880516020850101535b8151600101808352811415610ce8575b5050505060206108a0516108e0015160206001820306601f82010390506108a05101016108a0527f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c56108a0516108e0a16000610980526000610140603080602084610a4001018260208501600060046016f150508051820191505060006010602082066109c00160208284011115610dad57600080fd5b6020806109e082610980600060046015f1505081815280905090509050601080602084610a4001018260208501600060046013f150508051820191505080610a4052610a409050602060c0825160208401600060025af1610e0d57600080fd5b60c05190506109a05260006000604060208206610ae001610220518284011115610e3657600080fd5b606080610b00826020602088068803016102200160006004601bf1505081815280905090509050602060c0825160208401600060025af1610e7657600080fd5b60c0519050602082610ce001015260208101905060006040602060208206610ba001610220518284011115610eaa57600080fd5b606080610bc0826020602088068803016102200160006004601bf1505081815280905090509050602080602084610c6001018260208501600060046015f150508051820191505061098051602082610c6001015260208101905080610c6052610c609050602060c0825160208401600060025af1610f2757600080fd5b60c0519050602082610ce001015260208101905080610ce052610ce09050602060c0825160208401600060025af1610f5e57600080fd5b60c0519050610ac052600060006109a051602082610d800101526020810190506101c0602080602084610d8001018260208501600060046015f150508051820191505080610d8052610d809050602060c0825160208401600060025af1610fc457600080fd5b60c0519050602082610f000101526020810190506000610580600880602084610e8001018260208501600060046012f15050805182019150506000601860208206610e00016020828401111561101957600080fd5b602080610e2082610980600060046015f1505081815280905090509050601880602084610e8001018260208501600060046014f1505080518201915050610ac051602082610e8001015260208101905080610e8052610e809050602060c0825160208401600060025af161108c57600080fd5b60c0519050602082610f0001015260208101905080610f0052610f009050602060c0825160208401600060025af16110c357600080fd5b60c0519050610d605260018054600182540110156110e057600080fd5b6001815401815550600154610f8052610fa060006020818352015b60016001610f805116141561113057610d6051610fa0516020811061111f57600080fd5b600060c052602060c02001556111c4565b6000610fa0516020811061114357600080fd5b600060c052602060c0200154602082610fc0010152602081019050610d6051602082610fc001015260208101905080610fc052610fc09050602060c0825160208401600060025af161119457600080fd5b60c0519050610d6052610f8060026111ab57600080fd5b60028151048152505b81516001018083528114156110fb575b5050005b60006000fd5b61017f61134d0361017f60003961017f61134d036000f3"; +//const deposit_contract_abi = '[{"name": "DepositEvent", "inputs": [{"type": "bytes", "name": "pubkey", "indexed": false}, {"type": "bytes", "name": "withdrawal_credentials", "indexed": false}, {"type": "bytes", "name": "amount", "indexed": false}, {"type": "bytes", "name": "signature", "indexed": false}, {"type": "bytes", "name": "index", "indexed": false}], "anonymous": false, "type": "event"}, {"outputs": [], "inputs": [], "constant": false, "payable": false, "type": "constructor"}, {"name": "get_hash_tree_root", "outputs": [{"type": "bytes32", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 91707}, {"name": "get_deposit_count", "outputs": [{"type": "bytes", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 10463}, {"name": "deposit", "outputs": [], "inputs": [{"type": "bytes", "name": "pubkey"}, {"type": "bytes", "name": "withdrawal_credentials"}, {"type": "bytes", "name": "signature"}], "constant": false, "payable": true, "type": "function", "gas": 1334230}]'; +const deposit_contract_abi = '[{"name": "DepositEvent", "inputs": [{"type": "bytes", "name": "pubkey", "indexed": false}, {"type": "bytes", "name": "withdrawal_credentials", "indexed": false}, {"type": "bytes", "name": "amount", "indexed": false}, {"type": "bytes", "name": "signature", "indexed": false}, {"type": "bytes", "name": "index", "indexed": false}], "anonymous": false, "type": "event"}, {"outputs": [], "inputs": [], "constant": false, "payable": false, "type": "constructor"}, {"name": "get_hash_tree_root", "outputs": [{"type": "bytes32", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 91707}, {"name": "get_deposit_count", "outputs": [{"type": "bytes", "name": "out"}], "inputs": [], "constant": true, "payable": false, "type": "function", "gas": 10463}, {"name": "deposit", "outputs": [], "inputs": [{"type": "bytes", "name": "pubkey"}, {"type": "bytes", "name": "withdrawal_credentials"}, {"type": "bytes", "name": "signature"}], "constant": false, "payable": true, "type": "function", "gas": 1334488}]'; // Command-line arguments parser var args = process.argv.slice(2); @@ -56,8 +58,7 @@ var myAccounts = []; var mykeys; if (arglist.mykeys) { try { - mykeys = require("./.mykeys.json"); - + mykeys = require("./.mykeys.json"); } catch (e) { console.error("Did you make sure .mykeys exists in this folder before running the command with the mykeys flag?"); return; @@ -111,23 +112,36 @@ provider.listAccounts().then(function(result){ let contractAddress; // Deploy deposit contract, precompiled, save its address into a file async function deployDepositContract(pk) { - let factory = new ethers.ContractFactory(deposit_contract_abi, deposit_contract_bytecode, new ethers.Wallet(pk, provider)); - let contract = await factory.deploy(); - contractAddress = contract.address; - console.log("Contract will be generated at " + contract.address + " when TX " + contract.deployTransaction.hash) + " is mined."; - - fs.writeFile("deploy/keys/deposit_contract.txt", contract.address, function(err) { - if(err) { - return console.log(err); - } - console.log("Contract address saved in deploy/keys."); - }); + if (fs.existsSync("./deploy/keys/deposit_contract.txt")) { - await contract.deployed().then(function(){console.log("Contract deployed and ready.")}); + let path = process.cwd(); + let buffer = fs.readFileSync(path + "/deploy/keys/deposit_contract.txt"); + contractAddress = buffer.toString(); + + console.log("Contract address exists (" + contractAddress + "), indicating contract already deployed. Skipping contract generation."); + return false; + + } else { + let factory = new ethers.ContractFactory(deposit_contract_abi, deposit_contract_bytecode, new ethers.Wallet(pk, provider)); + let contract = await factory.deploy(); + contractAddress = contract.address; + console.log("Contract will be generated at " + contract.address + " when TX " + contract.deployTransaction.hash) + " is mined."; + + fs.writeFile("deploy/keys/deposit_contract.txt", contract.address, function(err) { + if(err) { + return console.log(err); + } + console.log("Contract address saved in deploy/keys."); + }); + + await contract.deployed().then(function(){console.log("Contract deployed and ready.")}); + } } async function makeValidatorDeposits() { + let totalCounter= 0; + let accountMasterList = []; if (arglist.v) { @@ -177,8 +191,26 @@ async function makeValidatorDeposits() { }); console.log("Starting validator deposits"); + let contract = new ethers.Contract(contractAddress, deposit_contract_abi, provider); - accountMasterList.forEach(function(item) { + accountMasterList.forEach(async function(item, ind) { + + if (ind === 0) { + console.log("Skipping first account - that's the faucet.") + return; + } + + // A signer is needed to sign a transaction from a given account + let wallet = new ethers.Wallet(item.pk, provider); + + let bal = await wallet.getBalance(); + + //console.log("Checking balance for address " + wallet.address +". It's " + bal + "(" + ethers.utils.formatEther(bal) + "eth)"); + if (ethers.utils.formatEther(bal) < 32) { + console.log(wallet.address + " already deposited the ether. Skipping."); + checkServerStart(); + return; + } // 48 byte public key for signing let signkeys = new keypair.Keypair(privateKey.PrivateKey.fromHexString(item.bls_key_sign)); @@ -204,10 +236,10 @@ async function makeValidatorDeposits() { amount: new BN("32000000000") } - console.log(depositData); - console.log(sign_prikey); + //console.log(depositData); + //console.log(sign_prikey); - // Signature for Deposit call, should be identical to signature of deposit data 🤔 ¯\_(ツ)_/¯ + // Signature for Deposit call let signature_d = bls.default.sign(sign_prikey, ssz.signingRoot(depositData, { fields: [ ["pubkey", "bytes48"], @@ -217,23 +249,34 @@ async function makeValidatorDeposits() { ], }), new BN('3').toBuffer('le', 8)); - // A signer is needed to sign a transaction from a given account - let wallet = new ethers.Wallet(item.pk, provider); contract = contract.connect(wallet); - let tx = contract.deposit(signkeys.publicKey.toHexString(), withdrawal_credentials_hex, signature_d).then(console.log); + let tx = contract.deposit(signkeys.publicKey.toHexString(), withdrawal_credentials_hex, signature_d, { + value: ethers.utils.parseEther('32.0'), + gasLimit: 230000, + gasPrice: ethers.utils.parseUnits('20', 'gwei'), + }).then(function(result) { + console.log("Validator #" + ind + ": " + wallet.address + " queued up with 32 ether."); + checkServerStart(); + }); - //console.log("Validator " + item.address + " is depositing 32 ether to the deposit contract at " + contractAddress + " via TX " + tx.hash); - }); + function checkServerStart() { + totalCounter++; + if (totalCounter == accountMasterList.length - 1) { + serverStart(); + } + } + + });} - serverStart(); - -} - -function serverStart() { +async function serverStart() { const server = ganache.server(startupOptions); server.listen(8545, function(err, blockchain) { // The server starts, you can connect to it with RPC now. console.log("Server is running, feel free to connect!"); + + provider.getBalance(contractAddress).then(function(result) { + console.log("The deposit contract contains " + ethers.utils.formatUnits(result , "ether") + " Ether"); + }); }); }