From f48530312c3b621a67c435f494f62a7200aea0e7 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 21 Feb 2023 02:55:18 +0800 Subject: [PATCH 01/93] feat(dashmate): HPMN registration with setup command --- .pnp.cjs | 28 ++- ...rette-npm-2.0.19-f73dfe6a4e-888cf5493f.zip | Bin 0 -> 7169 bytes ...listr2-npm-3.5.0-6aad1da502-cf30837462.zip | Bin 48075 -> 0 bytes ...listr2-npm-5.0.7-f7d9c71212-5c2cb6ba3f.zip | Bin 0 -> 32606 bytes packages/dashmate/README.md | 14 -- packages/dashmate/package.json | 2 +- packages/dashmate/src/commands/setup.js | 29 ++- packages/dashmate/src/constants.js | 1 + .../setup/setupRegularPresetTaskFactory.js | 214 ++++++++++++++---- yarn.lock | 31 ++- 10 files changed, 231 insertions(+), 88 deletions(-) create mode 100644 .yarn/cache/colorette-npm-2.0.19-f73dfe6a4e-888cf5493f.zip delete mode 100644 .yarn/cache/listr2-npm-3.5.0-6aad1da502-cf30837462.zip create mode 100644 .yarn/cache/listr2-npm-5.0.7-f7d9c71212-5c2cb6ba3f.zip diff --git a/.pnp.cjs b/.pnp.cjs index e2bcb01108c..e5574aad6ec 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -6992,6 +6992,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["colorette", "npm:2.0.16"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:2.0.19", {\ + "packageLocation": "./.yarn/cache/colorette-npm-2.0.19-f73dfe6a4e-888cf5493f.zip/node_modules/colorette/",\ + "packageDependencies": [\ + ["colorette", "npm:2.0.19"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["colors", [\ @@ -7719,7 +7726,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["hasbin", "npm:1.2.3"],\ ["is-wsl", "npm:2.2.0"],\ ["jayson", "npm:3.6.5"],\ - ["listr2", "virtual:880cda903c2a2be387819a3f857d21494004437a03c92969b9853f7bdeebdfed08d417e68364ee9e158338603a6d78d690c457a55ab11e56398bc10f0ad232fc#npm:3.5.0"],\ + ["listr2", "virtual:880cda903c2a2be387819a3f857d21494004437a03c92969b9853f7bdeebdfed08d417e68364ee9e158338603a6d78d690c457a55ab11e56398bc10f0ad232fc#npm:5.0.7"],\ ["lodash", "npm:4.17.21"],\ ["memory-streams", "npm:0.1.3"],\ ["mocha", "npm:9.2.2"],\ @@ -11989,26 +11996,25 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["listr2", [\ - ["npm:3.5.0", {\ - "packageLocation": "./.yarn/cache/listr2-npm-3.5.0-6aad1da502-cf30837462.zip/node_modules/listr2/",\ + ["npm:5.0.7", {\ + "packageLocation": "./.yarn/cache/listr2-npm-5.0.7-f7d9c71212-5c2cb6ba3f.zip/node_modules/listr2/",\ "packageDependencies": [\ - ["listr2", "npm:3.5.0"]\ + ["listr2", "npm:5.0.7"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:880cda903c2a2be387819a3f857d21494004437a03c92969b9853f7bdeebdfed08d417e68364ee9e158338603a6d78d690c457a55ab11e56398bc10f0ad232fc#npm:3.5.0", {\ - "packageLocation": "./.yarn/__virtual__/listr2-virtual-30886726f2/0/cache/listr2-npm-3.5.0-6aad1da502-cf30837462.zip/node_modules/listr2/",\ + ["virtual:880cda903c2a2be387819a3f857d21494004437a03c92969b9853f7bdeebdfed08d417e68364ee9e158338603a6d78d690c457a55ab11e56398bc10f0ad232fc#npm:5.0.7", {\ + "packageLocation": "./.yarn/__virtual__/listr2-virtual-11e98e34b3/0/cache/listr2-npm-5.0.7-f7d9c71212-5c2cb6ba3f.zip/node_modules/listr2/",\ "packageDependencies": [\ - ["listr2", "virtual:880cda903c2a2be387819a3f857d21494004437a03c92969b9853f7bdeebdfed08d417e68364ee9e158338603a6d78d690c457a55ab11e56398bc10f0ad232fc#npm:3.5.0"],\ + ["listr2", "virtual:880cda903c2a2be387819a3f857d21494004437a03c92969b9853f7bdeebdfed08d417e68364ee9e158338603a6d78d690c457a55ab11e56398bc10f0ad232fc#npm:5.0.7"],\ ["@types/enquirer", null],\ - ["chalk", "npm:4.1.2"],\ ["cli-truncate", "npm:2.1.0"],\ + ["colorette", "npm:2.0.19"],\ ["enquirer", "npm:2.3.6"],\ - ["figures", "npm:3.2.0"],\ - ["indent-string", "npm:4.0.0"],\ ["log-update", "npm:4.0.0"],\ ["p-map", "npm:4.0.0"],\ - ["rxjs", "npm:6.6.7"],\ + ["rfdc", "npm:1.3.0"],\ + ["rxjs", "npm:7.8.0"],\ ["through", "npm:2.3.8"],\ ["wrap-ansi", "npm:7.0.0"]\ ],\ diff --git a/.yarn/cache/colorette-npm-2.0.19-f73dfe6a4e-888cf5493f.zip b/.yarn/cache/colorette-npm-2.0.19-f73dfe6a4e-888cf5493f.zip new file mode 100644 index 0000000000000000000000000000000000000000..89eb6f6c8509bb5a8d5cf884c66cffeda1063249 GIT binary patch literal 7169 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 LfpJ^r*>C>?vIx_n diff --git a/.yarn/cache/listr2-npm-5.0.7-f7d9c71212-5c2cb6ba3f.zip b/.yarn/cache/listr2-npm-5.0.7-f7d9c71212-5c2cb6ba3f.zip new file mode 100644 index 0000000000000000000000000000000000000000..01bccc433c57c2f22fb1ced1766c85a11acb2336 GIT binary patch literal 32606 zcmaglW2`7mwZQEYcwr$&Iz3;d8Jvk?L-`h!b_m3KtPO3(_ z(&K3bX#Yd{>(sY zj&ODjt0!YD3)P6wP!OWN)!BgOQp@e`BFgRe zBgd1yF~IUL-xBV`)`J&|LgR3q%ZSpr<&0AJihP6RS!!8oLp2nqJ&fQ_y$a4% zCtmlaUeUB?vS*S2c$>HWlb)079E-!^O9)}@8IY9E`dP%b2TvCzR@oB{yAu^9k>=>IFs($2)xozB?Gd5YKCZDXW<=ZTs?rxiS! z@_cVuvW%;SW+Fms>^|Z2`1ubNYyv_^CWr<=Q#IA4eJ^)o?Hag%g4|}7Gfu$A@9gaC zjK2*Q-4rQVH6gab!SBFW2V`)sOk$r3G6&RrD><}_C|liQZ`liXCb6N0$SjeIrh9zGE_y#*ZEGs25nJ<~ zjZT!f<4_0f;!KAt@$i9%o=T0cVn2{|19tzc37O}Eux$q-FsloKh$5XaJdkBjCKb;@ zrQB1Y2zwL!QXGF=S7<<$U7}%_hI0SHavr|IC;?<*`g=r4R-CUl$V>`^@CJ-sl+QSY zFD{YO+GSFqEKkxt5TYSy=ZDXq@Q7W5%l-LM6XBR+o8k2co&ClvA*O<5W&o~*c!X89 zVprG+y{=$-(tsbAPi6a#Y}np@2rPWJ0gMX(o~3E*ecyi~5-i8vGNb@v6!c4{!30_{ zYc3r*Rn{7D6y9YcpkAmxrzYYLY#`}}I>}POpFk?|)tdXlDCNFK8hp2)ChzRHB<1H? z>|0Hd_@U?qqbd|^m3Z2ch23^7Zp30qiwMDa`0F%Xu584~G%I|9t>ERM9X#T$L{l1! zp&8yLl!jn;#%iIy83wu)HIar62|sem1Ia{yTXFRg zJXBFTGsDOXeuGEdjt~aTw9j-CRFVu((+Vo~@CkTy)GW2a-%`U)Z-*pr=`yalOoE4U ziGe2d`tiP4=8R(q{Dfh9UTn3|`H3VH{g5%_<3ud5;|$}qk)P8vCL}`TSuPC}EGg2jp~`UcfYgKN-~IL0?+CkBmIjk7|-AaOfFk5)xzY3?vc_ z*?-`l;8hbu4GxZfWEyX5h-|Fbq%(x`Ja4^R`%S#O_{`p)8#c&pKNA-^xSMrF5IITY z6&ay*mbRBwxI!PN|AV1dZ?+icqdzv-xWG;>9#ojtRrP&F`*ptiDuRZ(v+acL$Lsqb zhL+6VMLIJhCx_uMhz=g+cQhQ6yv`*~Uroi-uYX|S@a?9E#{a^~+ziD$yR6jK6pnnW;6y|61 zC8Yxc2S$YQ?-RH_zVC(*!M_deY;T|k1wk`<-G{XvP6YJ>(ueAAGnI;?ql5E9y&l4Q zg}Q?B4q}Bp!_Zf_XxYgpMnjgA^G>lJB*d`_a2>%ETITd$ig4>{HIpA2kaxg~Su$n< zkt<6jt600+*4&E9!0&6tVjvtFQei_U=&CAh4iy$1(%4c1E^jE0k-Z7v0o$>}Oe9)z zs3yit_?HUFOSlXh4WVp7Y@8K9fk}zJ30CMF1)gQ|bdI7_B|-wLs0QYB$WG`Hz4!H! zbnmM``&m#~V<@fRCq_z9WvRisNI0E1x=uLJd+}CnA5`He=kmkT)pE3TQ&pFYsovyz zWQrQz3L`*K2!cnu_ev4Jr{}jR_CGi=&;TSO1P(wY<&XZudhfoG0`g|&_T+tbg_%gwWmN!PX* zyQDg7UiieFJ{&~e@}t0H>nV-U98d~$_%lM4L&FBHWy%d9peO~LaPn>>{+Y-q6HnwV z4E|0)Z4VhmdTuLba&{}R_DtHWzI08tL|LLDzy*nZ6%W77K29K3mNZIaSW&U2BX$B57#8@=Z8dAekm&s@UFRv|IDh z-PX&(SWmHL0ez0^GCj+MgBM%>|KM0ow`=qR6V##&}zSlXty%3ZgZ@+cla45NR z%{N?>&X^=m{~(Vkzy0+MNv3{w8btF7u6xUqy{Xo4h*vV>tRf?_S6b^X-a2+V==%L8 z!}8(cCeQAaxLL-=p>x!W=9r)}xqtSkIu7!fZvJz(M0f@C;4wX&6r>O-#`&rat`i6W z!f-7-H{a~o@NhUgGT0Tb#2S(VNKR+!e4o29(w26jS2 zJc8V41$|kzHl)L!?i_%LICH}kTla@b7!;K?Dwwud5y|$4*t6%Y=JQz5+>7Y~%n(5c z?Ent3cHPm^5f9z8LAAJX=oCN6@PgHVbIx6HD1LK}iGc$7*$t+R!!%Ow#w?RLfdU$A zqu=fx#1x#KSGrL&MWfghd82;;mj?Qm@TCXL);096d{3hbD{z{?3Py=|7~vJ;?5>?N z-j3P;YxB}ZnjPs9A@0}wnr88rhCeqLWoovNvck5CCY)X_wT-Dav?F5TJ)tDHJ%^Yl zM7oyrEj>WzwrjA#Ok1$-!u&^XVd6**#k^@o@Cr!0Vk#z_`%#ApEedVr`bCqjda7@i zqB;=FIm?wNmZ^lhS*#c5Oq)=cyuDuFKR=+~ty3!feA4FBkDb}*>0>>=deijfA6MMY zFBE*f1bwe~RrPnqYjMAxsJfg0eUj2Bm5_<~>3y#Q{MH@{$gXAN04~!khKotUC6)Tu zkwJ+&){vX#H-XD1y#iul$dzBxQ|S*cF}CiOq|M<7p8?BG+;-x3b&yGA{oNZD~}iJ#smbO{wv~jryf%=YD%&(cJCG6}7DoHEp4ivK*b0$Ujl}QbAnv z?6e+-65PeyfHIt#TOH`->Jt1rCd;dXN--fhn-Tq&g9K{CM2(%=<8TbI>(7*-qo&4O1;Q{%iKVs@Pcg<6&*tZnGrwCNrDmad$50NjP3$Hs4`_>o; zn$OH7dupR~&aW8qg%TMD5|rw=?w_k!cie?t0xvyQ(MAMHV&kUhuBxL@lF5~N?QLM< z;TJ7jmjIg?K(l)q=dOiuRxn68c-3b`sw z;^Pu?3>W5^y~Cc|SdoO=A$VDOB=-yQWEI2ZbEd?-i?hm3+DLw^TGdWwAPn2vNsiE$ zy-~@DPDBgZjz61FarrAGdEIkXPczv8s8*ny$E~4mY+ed80w8{vj5~@QF08^3bsz zE!bSkYp6ki7e|lA&VF_xNQZDmjg_8GkJ)r(jyR&m9kIGt!3pzt*TvrnO28ozU?z{9 z{R7_QoTD;~E2Ad8zh@k%W!Vtu&Qk4eQ5cKxrwHWc?(_2XDNZ}?ItG#k;1q9tCiR9} zmw%cgl#7~Cz@zvOH#4hnd^Psiff&;%6dHAs_H0n`DJQPy7k0#|7FZR^+R1tM_WhSI z!sDzZ=|ZbqDK<5LyTHqJO^bmu&DCeD=^A_{n2qHh@7!HL``*+|NfjvG@qt?6khz@v z$G}s;f*Zkuv!yp{Mz<)oR@=)HB-H1~;91#+X_iG(F{bjRp18E6LZIODKJV(`I+6!mDLm zRo*HaVs>EUwVEy2m{pA}CEDGIn0Nj80)S-&EA?Ah&6o(lIz3|^RP1Jx%*n)PuL$8Y zz08=BC`Y9VoDRdnjmj32f)c$Pu0@o7VBl8`S~kcy?^U9b^QaxOA5)zw(ig3y=FAU+ zpPD*6dX-J9CXLAaDVuZYmNfAeihZACAREE3ee(JI*OoXq&jvx)*!=#F`DKK*=1gW9 ztcxXJC7BVS-x|qe(`_Dm$cA^0W=HJ|U{Aw4qhz&ASc+iNTv7a>UDhsJYptTCOC=K; z(Le(YG&r6@Glz|Ok=)3NSs=)y6GTg?dOy(B1Ci{#*v z1uOsrHQhcE*W-V1evLw>I3MpU0&LLHirJKpd+CSPXG`yHil1=ud$X8_k!yJ-=F|!bw^P_$aoLKZJrgII0lCF@_v+ zqEn|I_mMf7@0~~lvv(PI@`5?+DG^!={D%A?|&?%<( zMp-S^DmWB%;VaIl4c%a+zo#h|ZeQx4OL7*Xc*G2j>ZC3LX+C(Q(p#*b)ibmh-=Cy>;`nvBx%M|J8=rW zbM^A9ExcPJDm9Ko6Do-}9`X_T=z$BL%D^KEXoS z&urldRyvzAXzz~q##LkHzZ5?`#{n?Lz*Fr~_UGAH!4VgKD; z)5&SWXt!r{jsH?4ktl--%KxyQp8>Ah?6NrDE2l7*Hb6h_+aI0Ll2wurqZMPb$iU?3 zJI_Hw@w&^XxiRw2$O>FWC${J&9H*g`^iDOzQlqSeP%F7OUFp~t(C4!!DGvR(q+myl zpjd1(s%rZa^hBtvZsXmMNPOWDqi+56hM&b?4acY+$uy(cyb9s(0m>v$X;>hoKTZIQ zbhbMbl{x(&pkhY#E9S%2VQkUB27|{2)1@HPF>0yX+<-gp#(ov=Ofv@-%nv>}>KQ86 zeXmZMCET|zEbUj*McVD|05!LWnN_VW=ZPJZQh;2G+`2^QuM!9Bz0n*q>PMCZJF!># zQxgNvWrEwwoT4?Y>>3%@Z$8C`GhHQD(;^cda%cN!9fSMK7g0Q4(V;suRv(0f9+`NS zH3xQ&nLYuxvQCu>T<91Lf=8}0S5%i7KXe!OfG=-WnKA4SCW64rSCqm$iRofs_C8jp zJ6!KZpCx#rVxa0hws0S&L;r`c3H+MUs3Am-Q^0~R!ELwaESb(wg@;Gl@WI)09$KnW zFHA__FnE1hu-@?(Gu&i%mVPt{!d+toSbsb|h}$iI(jH%!@fxr|Et?p3cO(_c)#GNY zEwPOs_cY%1me9kevTa~5Q6&^yj551F!8^RR#iw^;jD2Fd)^uzpRR{v%uXZ8GTfppb zZ*mR}TmniN)SBsXubbHUglaQAmFl!>n+HuVF^2lr-cw z`C*^Py^or=UToV%Z}ede{?dc({65de0&u`X&;tv#aaFZ!9QlH!ES}(MpkA7ya}|m# zk4}y=B5U?Jk5Y*^B*o9Ac+?RP)ZW{A}pYNi&9Gtp>pNGF3+`m$FB9qTgC7qQGd93GwX z$AKxlkbgF5l9Vt<1xeX9PCix-UPOlNyW1YMJnBbWyBzjQ9J-sA$K*XV`e(#%HN-oA z#{xSj$QiX&;kyp{ZEzz2X#0=97$EU$GNPRnn72}~M;SRQ_;;R@(e-1rEY`DIPmJ!B z+6$Rn=`R}!OMeeC;1X0*B3f=Ir~s8$^1>uL1F%FOi~Dj8aJE31d<7HF1ub2v$Ua<@ zAG=eQDLbdunPG_FEzd0|tb-4=PrFkzkh(2u3mR)zOZ()wUZ(y(p?ie^)j{J)W@XKt9Q`oD5vj4Lq4E)r+_#R$J%&LVCk*b2WTV7H zVuyC}{a0JRuzVwlyG-pg@UdW73xEQ_uMtPrq5`YCil~PDeSUGr0f*}At(IAM<-7ri z+-6$?(>a<=>F&o{m#xg-YQoNp?R-%cJE5X{J|(LbV}FxfU0V5l!nHIu zGHOfhz4`s_B!j8qr|d$L&7iVB(D(?9x(-qQ?%v5r8)LvX@OZT3MP63RRr{Havf^=u zrvdjf!rZeDStveCWZ1UiWH%_w{PM?w{?oL@RndUTZP(zQH9C`L^wBdphU1#Zx(yHV zbS0>uzr=L$2n-Z28XaAlUqc_wineQe+YWISOAxFYKu+Vda4pj|&zUw~4%7;XG*%W? zZO-$f)bvXw%Ci}>$>U*`ZWFHF-Z&cA7w13^kl5VDhfHN}H{goW?jeL@@GRuISl`y^ z2=3w=*r)fxd@4qMN9I*-p<7%L1nI*|K^H;|7e*ypb3M@!;`HtR~o1&)i)QFO@a z!3Z|1TeeTBccHvh6kITH_+$glT#+5MneVqfJ2#bDL zO(~l8hj?$W?0&*-scL`#%W=CN%vHqFl7V$ZGwqFO-kuKL_Q+cByw%l|tEHsayDn!Y zYy8DaR2e3roiN4zR~ABCVK6sJlL0p|qANFR>)lhVAu0+xUKseyIZ##$G>DpQsNp|55E#OS`3}PQJ%(|7}Nfl>buMvzOZi3bJiY5N7zmED9QiL{2 zY?rG97*xAd8>+7Y&UJfaZT0x2{c1;yYfr1t6C$3o7NGKWN+<`BZ^p8@nV5Mp&J0{W}pl*pd&~PO%^{1m)mv@n=UteDXb4+Sg}6E%;Mg z1e8f83e|MQT&f?36^SkZy3W>#+<3lA{dHtJCyP&gKh9LZC-!FP){11b*tugVJaau( z#VZqXC;)xHeo+}lDp!v$5WCv})gH@0g=cO|eZK2OFOqPTb-$pXxY!vxA%XHGw(}oC z#yA+Y*vy>`V)*$y@aWuU>aJg=@YbLj&&m84U9du%!El$O=x9-k-fSWKu4<(AJ9xd( z(IMErXg{`lKi>d9ok{#he)+zT`}Yr9OKcktBE$o&q5>9gP{N4j2RL+7zQ~t+pe|Pm zwK;JH(FnCUyH0_wAW+-L6z|!Ns}J?+M?$BUd`HpS?$!go74`)9rvHl4ug zYq;DHJ=4S83Y(=c5-txPX4>F>l@WaN!LZEnw>RIlcNjpZB5F{SmGH~a z6!n!w&-7?4x9Z_c>$ z`tL&zwC|PCt!#F4>l$k3e<~SrI16eCF@QCnMnXz5bAH;RI#ws;5Kf|L0oWy+$23rS z6yGTZ_(QWxP~wvI_1_mUScxz7F~Yjf6YIV1l#0%^QyQ3&wly$t z83yVFf>F;jHrLTxS%wXA62z4NweGHLJff}Q!r_x0Wjc2dTty4gyxe&sPvuhR?J$!? z!xG9wYYz;B;x96k>bH5bk>v8Cf1NLPC0I}vVAFN(`$w~8a0QH!9i4=8-zQQGxV1|kBV(F9&{7SFN z(=Z_rp=u%Nbbn`C5ocjN_Ni!Si21;HUMhB{t?#23eh0GO8xxGQ>m`mh$0j6yz6mUF#jl>fTVYD4|4J9X14MKb1KJWn6G-0lPtHwY}vh z5$~;q!WID%n&C1yIQ4zHhh?`7OtT0mjsi$@{sAeQ6*%dQ{U97Y?M#idyDNwTx%zo+ zs7SYl%p_p-v-REiaFr{T;mD}C$rC7p?!{&NL~qZK@>COoO~!PjH^s;Gpptt7sUCXp zhT@}GY${?I*2;vZr?SJgR77ARhMPZ)%Hn|s^s+FSj(gd1H{+np)C*#RX4#zjQ>yD{ zpP!M&3eKF_6`Hy_T!_%nj%|W@XFbmrDXmho(u`nt!C|kLC~nLVvL4M90?eoP%f_!2 z`e_sz@R$+Yp0WX9hJ-7I65(hzH5pLOVcA>;TcK!RnB^+p&ofLw9a4T@8yO5t>d#Tj z_`kotUw)g3!z_E>+zS+ylNb^i?&gG&0W!ii~LHanmz1)3#8|OtQN)%vKIbW_K>0=30kE z)7Wb-9#=tmw2)<(?cgK5>HdR54jM<|=%opf`t|l+cX_#ayj^cK;(tHpUj4lJ z)c#z)-F$!M?kz8|r*UiVH2(B@q1($gR-fy;{rno|fopdjj3P#<=!&zoa68$s-AE8{ zaQFNqhbx5_G?IZIHZ)NoQynhSlhoHAjo_svr)aF>zz`Bm%I8TEoq$CYbXdJ>v{Y4u z7LcOp-a#6mO7wB9N>T?+X9wv1lY}Qe9a!HUT8lntLjn!Ko(OBlsMK~)%L_#u&@h+Y zHt1yp=JbU9KpSeLrm9F7t@3SGR@=o)S6blqey0481ulxX!zc^!Bi2IQ+@hwtog{$0 zMG$3fkcoKJh&z$Onle6-G3pq$wO+GP5zAQ#6!Ac^qson_q7zJFPQ#IHQh*;mbm333 zbFN{u>&SWj#FeI-G@5ag(**`Myxk@YllILj9Xcn%&9!HHrz}plwd)4r_$2d#ZOib7 zneW0Uipq1va^yf8NlT3!7W;gSH-+srs87bDFr zNFBi)n-HmvgnUEl_eX_3z34yv&$u z4QR$qs8H}kBsrWvb`vIegKwXYHRy@Vq*1k+CxWzZ4MUJvTO6APZU_2YEX|x%oIa;( z7Wq0lGxJiK*F3JnkXf#6J2>7&*}$9>M(euuXSaVmu9m@)dbzDjmu(t&thmaT4k#kd zRdK%NyBG$Nou3mZ0@WaLu!Y1uL|7SBZTAP+VA0v*E|ZRmE{U;#7lIzR37_MiV~0W$ zCA6!#l$yq3T%lF4W-qamX}qeGDS}a=b=tQ%h^6CR;;UJdwl`fID<)jSLO+xT`orF{ z3}A0JhvV27>B#RXw!BVDY9lzrZ))iM>13*B8<6cD%Wp(`wGBPF79S5XJM*y)4BV;6 z7%U9oieNYyh|u&AJ)+)?v=HM!8XR#~HcN?ydD32P15*NH-UG@76Hd`wh(Q?GdNu5M zd|?UoGnV^^d)}YDgH=2qL_M%6XTy~yI*a?-S2|9!VeR52k_{Q@lkFiEC~zL^8)wk1 z2;bF|;*UzUI_SKk18|Apv^1Lmv(&tr4-VO$ckKK{?%D9GI_ozg0CiTaKh~kT3hzeU zh*D839G>#DQLA@dA8SCHUtH-liZLx(6VZ{zLb}{STofEI2ZDjb+PdIkh+VXpuXFeg zkw09&(8O6fbWM&y`DFl?Vf}c?)6IGwZ9`ap<;cYH%@BJ@@4ya>(STwLVzk(c+OKp! z1!Q_)XDuHvwIJe2U#(amx{p_9|Hhd|e)}!&@~k@n$>%}1uL^0uM3zxnW*O@^2Tmeo z6tro5Z@mP2M=m-9AJ$~&OPQ*yco%Y2YVxVqkkadj28q~oO#!CXt)!<^dZ1& z45L^ms<;~iV zy|**#o=$7F@@nBB49*I>xYNN_dDFp2^S1&%_%`AxBCdDGkT^wo19stHvR2gPF$=q{ z50m0LtO^yk(%?c)b=fIT!c^v(RC?enfJUncH_N64Q~UJp5IYr<@rNaA5jc9(7_T!0 z@@ay4-(;7GF^Zlca>aD$4d77mdz3Y_5*41xBTaKO_I|u&i5TMb*XP0AMZmg-c4B|m z-t-d)&Q8vO50O3L4eOTEG3Yuz8|?*dABsm`i0?h!65|jlC7N?x3r1SVQCmQYXs6ds zqChTh%P2<-KedS{_jIA^6)R-J%-*#qiY1gOX$NU93|r6?M9$$`8p`MGIIUj6}_ySJTGUS#HHNNz$q>wAjW z4mBy(hNJC-yKOSd*EVc1IaVBiF`kA1q6GpjL15{&W7pSCG`~#$xRt!GPSaMp(^x6b zpXwpBM7X!i4?nFs)+;VKwBI*S($Y|JhvDT11Gzkj(D2i zI-QuSyo&xU6}2nsxJR-Yb!74&8X<_ZbQ#|sU+q#BD;Hnu4gU(4t0%u&6^CO4NSsZ= z%^C`0G}I8SI)df!+azYHpJv(!Y5F<&=kwmZ`&39h>)<(*pWI#&~3>uxus|F-;;98+V24HlT7r7Mt z06e$GdZCx^9fv-HhXKdQ8P-4LeiO}e3#;f+TocXM7rot>#X)bjiN;=?I$72~Ry0{9T zmC}PLQTWJs-GaA9uO#GDuXz}Zz`q!sKp1=XwDo!Tw!zB0f588v8~sL)bT*ZXySd1?F%8W?%7 z{Tms2^W^WgWAbmiJT_BFDV(xYTQcpf!82*}P+Xq-bY+UG88D;W+q{~n2q^OLguWag) zq${f@40%1ASq&tjpy*LoW6B%ckzc9 zn94FArk(qDM*jga7@!-Hmab9Vz*bbJM?ueW}Cvxli@*aq#STDfE~B zt|Qk{pGB^Aw2*%+m@Zj5CYf4b%1B(Js~sWctiMcp0zziWMB|(UCK+~{qo5XFXu=Y4 zZ8vzB%NwGl! zJ!BLRTPUh1cy!J_KA;*dFlepz9uF$+x?VK!q{7LsXe>j<2 z;|$!WZS>5{dGVuc;JFsz7r_NI{WXjR@ccnDj=o^|$kRdD;Mjx;TW7`?HdeMeo+-B` z;{ZU_BBt>+jaoUIP{sf*NFGOQlZJ-1l*?-ha!aF}tat9%pvwDB!FUFYcH)m7G(G`7 zp=(_e;9dy^mp8sjBVhj9)t8TltApTo;^($)S)Y6D@zB5a%&Qcgf`=}2RP9UP|FLHd zuM2mbd&B)>V|Nh?tr-`$2wP-^M4osg=mDIb6X`=;dgg-T&1N*hGeF5vVUM$lhlWfH z%a&TpeMBhW14ZilCypMOa<%)^2j=uf)by0(sDVHikZP`us2N9xf&DDa79b;&4fQsO z!dS%%RJK%fBZZ;LOkKsMT6VDul_reUA4~za$8#*$sa2>5n|}&4$Hiz9n_zO#lH4BZ z>4tsnY21NQ7Qjcvr9{w00vp-<=u(VcBYf;gJW^b37MZt|>hhP$^QoiLt7;c~{#2?w zRFol*qemc6Gkpm~V?ji)^odLr4BP-}-=RZJhm{T{MWuz6 z66Dc8$Hm3UcgzW=k6+0hLiJazYaFhXVU%J=lNjQht>%?gd4|1}GI1{l6YpinC%sot zn6J*2()cwPBg05Y|8`4xETAZ{OdK^)`T829qhZlso*9f%Ci{ku+qorTv37U3f8W0v zyNe_Ds!g!7r}A$)lNFv>7)iJ_H&z5tgi=?)dv_&IUc=aND{YZ@5qYe zFI-?cJ!aA>KUUiGwnWgvDGP3&fj6$y9MiV~x$60bh^f;vGwi5O)PFo0_4@(7 zt8qL5W@ybQ*IV6^p9{LbwRL4@6`#aEAdPTwy^ve;5FSRQvL(1AzlEaVH*d#+<^(*N zaUroifP|{ zXI@)*e!0Jh_%H_)M0TSg z2Y6;`+E+pvBB?gKiU?%f3WwCPybe$q(KA@s8(ZWxTY~1~7ISO!Jezb3_W?M6+hQf* zu!<;xM2LGc`jx@-Hm24%?ePbl1G)U0D~)1{H>C!tgljxshkR+HsVW_7n&b4YAcx)x zA8ha-UAx)iMg`H3w~vZ;#k!?~j_=M&&Z~;!v~~1Io6KLMwhOCvDT=S8wEcpH>EU&ABv4vV+Q+m2Y z5h92vfVO!(U^Vv#N#~49g68Ix{DQZVzFRp@v`G86x1#O>8SDo*s6eefEC}W=2n5w4 zR)zvwMTGHsHN)J|CjJ&o4;yxzV2tu$e`-d&K-7m`mb}#pz+w%Lo_C^{tO*Tm-R*QW z>DT#&)i^RVImxy3Kxo{#ngk$6VjrS3;mIjEtI?P%jLLRtiTivbdumR_hJ{?RpPnnN zRIb#o=<>=ZLK|SaL`xj%PIStn@#oRFZcIOhacJ-Bijh+TV^dh2=eGT`^pEh8#ags9 z)D3365;XrFw6sXr1`}3MVlsSbRvAuySmu(uAdRBia>(-sGt(I^510~5E@hX{IwUBC zt=vs&^`|zC#V>iAu*<9;?qTP46Z1mTN7%>my`Udn8)Vf@OV1=Z;s#C!5%NnGD8emN zzaFY_3bDkahU9XBKY^&9I1vOH4d(=5$k?GDbonGHGpfO!nVD;e1s;`O6$VbReuado zeu7i#l4M$Dn}_)}@+CqAhV^p%=1-2X&%(v9cNIv>KA|#fMtazb)H1wZ=~E|N_|Ov0 zIAXm*osbpO2CbQ74^*Nb9;23=L>8?~3YqttIZ4A_V8)6>Zo_g35(nolj$@88b)>G4 zELE*o&=xk{IJNb5;4MTsBVdP@`6qzVPcGb@G$m!IZ{v;)uJfI0<8L(y1eYbjOiNug z?8XXL*76wi$wQI(aK4|NFP&!{mnlj<<*&y5hq&~ilfR!cZy@2BgzTR;eW|3b8_ ze;``o@)7Mn5Urn4u$o3!kS9}(rwNe=go$zv-1i@QJQ^eJHUg3g;F6owmWtoO%Rh}E zyp@8H*QIn1H#ODnyApf+s#hBXgHDy+Ir33>4jjwZws5ejCH5DhMV?=+-Vgd9xa|A~ zqQR>HIK*9V#h8yBYh>=@9@OHqz^=~6zwz}C9)B51Uz1R|@{A9pB@ApH<~;_!>J{AR z9h|lNN1|mcMp%Rs=QfX$+Kgs~(9_&shu|s~eY(X1Csr=R3T64=)39#crW>64Ogvhn zKxuiABnFZ&4K*~OkDV4O=$k?hEE>RL`f$6K)R|kj3n@>((8P8p&Ilx()4CPf+yI3Y znDY(U*=$rv*xMva?!%0-@VRNa=MgZv*V1gH-DYo~`UcT1?^DJctGcNeYOFomf~i&6 zc4qniBhe6UkAiOLEy)3bNSo1KOK1!@0II+*vy2K;Bn(JI3Q zIF9%#Bu>TRf#te|Rqx45g%=bf`yD%q18V+NTneix3%eVrI;ocTjw@v|>>}Umi|Z?^ zVAmX3*o3~96)$+TLM(SZZ9zzcUZE^5n=U~F7t>rM)~7HWkFCS;uuT9 zB8B9krJ_=!%{0QgDUA1(&mDtXUQ;OPW)Rxs792DTT@nLF`fP@gW?3WOgX;BMkru?! zn0-6!v&qMzPx7M$AGcC@u+wb+)WR~}+D9ji@Okd%zpRQi87tK*BHbC|dk`v8#u@)> z(YXFvw7+6`D$T(!buy#K{I&U&wjHftGjrHCUHA=41+ApBREXxD%+o12c#O6)MjC)8 z9XK9J-Tb%T9K(V8oU2mo(oyQIh8iGtp!Dh`mq+Szn*cVs8JCR}zL0j(Zd-j6L^N+<#Kr!h#E^1kQTVu=X z{Cn8D74dsWYru1X{Hp_N_zMQAb$I;f!bSG%*5jb#M5&5ugRDv#QG=%#*y(HX}n{~MtV&HY7a z?l+8@+?}`SnSd%Q&;whu%JIuZJy47>7s+UcX|RD0R=))uc6|>FMW7!+DOyp(b&&r- zXy^fd5gNLxHxg396VEO-7GHreve^{jOiIC|^KY6*w>p0TFbf75m9t7%69FPz9m96D z2Ogx93^N=DqnPRR=W%Q>epRsSGQ-UUm+mK9_UkS17JWCp!@)g%qNCHUfkvISZX{SE zgsa<1`gL;YHnqDb`o9QmNBtj!Rtl7DgBzLvb9J-J7D%4-7oqjd*@?Ab{0E`E-f>Ab zx^n7fRQxUDWG`$ap6`neyUSf~cXAw!S#Ni={fI)35-+%XA3T}{7L9>rPw@f+Z}q#` z-p5*o(o_d)ppEazi#I~-#F`wf<>Ef1lB}T1dzkCP>fRf5bWPE7hrZ&jQ|pN1`ftqd zbHAHCcq0r;!D|h6$Gwcz0n1_0CAIygQxZRSkcYi$z02?1FbQNO$ttxMBn-7Wu~dAk zonV0Te!X2Xx~=p!Sr&{C$F&JS0OE@S0Gu5J2kb$=D~FF0TpJS5iuytvS>E*o-DqvV z_3e6_d3h_8wU+P{?aOl^MOJ$ONiG;5Z!;Pvmev?z>I2UBe zs8mbmaL9?V0IxJ(S1n4l$$3M8k9H(h;nUHY4I;gX0;Gov>_d&m+JA+cKTj$L!l#KR z^mr5Wm}wo9P!LrL2Mi(7xDgIn$64TXzd3i3L7tW(^QF&7{nk%+sooAF(*s&Dx^AD? zxnT$w3(o4pk_($~<|MnRC{7FNas#Ec@KFcN)(%AAqQVyC1fH7L>!*1}vI)}t4@2wv z`zKtBGCmEQ?IzY=hW0JO!ASF!o?9^7X!Q?6tK?;#)L$KHZzJlfcqEh>nbGut6>G%( z`?_h!+4HnzH6#HYgZh}5Z4UOxV6sJ82eeJdHx+Y-7=S>I*-9FN*|IfUeNn*9MfQZO zOwFzz5L&Hcs=IhE*GMLq_;@h!)*?5>y{W@pLF=7gz;s#dHG5lePjipKDs^{TQy11f zLl}hHnN|h{paTvZ?~AXFqEcOI<0mY(MPxDp&Fs+XrtsEF<2IzaZy zfhKs(yJD}n6p7{1&bJ!lJjny3)!*U%xaP0&hbVa=u5r2BwMpEw&cY)Gv-ZY zm6Bykf-*!=U~aUWX96ZTWFBS7zRhxY!VoCILc;R7k`l-c=AN5ysiv=Ln-85B!Rqpb z+APMk_?w$>D}l|Go*=horL-4x^EO61ho*I~5okCqxpyt6P|dHZC2~5-(*(b2Zi$+U z>Lo%t#nX5{Ru>31?N;G@$l8@so%=5BJL9dK7_t!SFi;Sje(IC9mGz-9vXU;Of7Iv5F)BfPpncUbM^593EJ3%^X4O3I;Z^4KC?qDbB`oDd0OVQ;+aVtYMjsqsPtfe3 z@CxyS_qJa)3icGh_&~ism{#8wCt7>Y0H-g&KG7quwU&88&(JQ8!IpKPX$vA`_^}dZ zW(oT;U$+@+U9~g+Y}Q5J)TJiTD9&!)$|Y$hMAv7^1Fl?-jju*~@8Er6g3*-cOLwl` zg@`o*dUT#$*@AfJ{NQS&i7N2zfAw|G!LhXK{_tblw(YDqS+TKV+qP}nwryj@wrzXG z$uG~|XP@)#=RN!M{4q6Eb6<0JO;^uU-=F?op(XUwd_Ne?7WEFK)wR)-&VpOsxQsmq z69i+zh4aN~4%>#3N6)ulW9x@M<Av9}tNt!uOnign_D_U%+qTgoa|c&S;Bj(f0%Cfk5kp*cbs*#4iY?XAMyR5tt)lRIt&MS2{V#M*E(wZ$b@1z` z74-IDvRd+YS_jPfE=(}lqcsjt;*01MO+?`y9&$DgrO!ELW&ZJ4Rxcq1B6Gm@yA^N0 z#aB~4=Xn^}---)ZQwtDBdIlz!w6cDil0BEs=$3o6_m;k|7vy&bYM-$$&eyuYhUu2$49jWc z7>I2&#)LybP^0)5=+==}>BbL~nI_>bck5mZLOihDamXb^3Rl_O6PF>qY3Uxiz?oI= z@Na|`?Z-ek^d+Fic^+LW>-6K;7h-8VoxWg*7@@eB2B zNyDUnI&n?^FMwwC7eG7Jer?%repiaFiqdFgOHOLPvyL!{J|PAi;#cPR$So_r_5meA zIb4AZ$z;xV8NgMEq`hTl#vgo-(aR|NZIJd(?}ZDUu7Jy!_v7YruZRvDYad{p0nT+% zOYe!SNNjPL#K?rCu$F=4rnDajQQ1+?&O=+X10}#s1n&~Wbg-pilChkJ$Xj-3_QG1Q z5IIcy;mjRnev^{U8WTb|!~r6I*^Y{E%0nH;en^lNSAJ_kN$_|e z`oPGuVKD!32P%sZ`%EUN5I_{QzJ>G(3tJz|jdF!coNBHqd$5P}SH*^xTGF1FC6M&G3o`jvvkb9VVdd$!tGR=&SI=Pg&vb-%BG{7az0eG9Z!`>{77EIL1c zD-oJpt*_2B%);|S{{*Hc5<5|<%N-4MRMHC(oN1ik51{siN>B? z9kk=3m0i*UemN&t+Dv8Pr_xYw$Saes{u=}@2X^2G;w9*iO}$hmrKB-|+W9SN!NUKr zXSz7W+9=Q+^yk2R;XFf{>h$=6wDNxN6ky6TkMZbzI9^zqbc6K4%w1SgLV%2L{-zH^ zbDa7N0aFeeFdz&(=llqu8~pjC4A3AP#o$D6M$2AuVfZRxDvvwv$X&(-LA?c~@~QI` z-uKGtNQnn=KqC?d;hfF7U2y($0!>%2Q%2>@F+cEwuz;0pFx7894SMAqgtVG8G_~4@ zS@1kzgz;9$?naUu#U4d?!1bg@eDcEG;m1oVRM&V_FYP?moi*s;plE6$hG;uW{RI+6 zyi-a98CaC1gy9Z5IQ41*OF_7S>R)eDOh9at-k<9j^$aU-@aG7O+SlrOQ9r~$Vgr;7EmAUFC4v9qX4WkShVqgV z)}hB5*Jz_(AnCnxDv6mfPm$mgegu!QE8-sRGmaO_Z;BSc(ImEIK*3R_O}cT zL3)+6pYY2(9(OcM5qIkQl9=YcbEvvu_s$ULIj$_E_vUs#z#`43y~J|}Bh%OE>@#{;{v z!`H#+;N;}PQwrSZBUf%vQwPf0#5w#qm8I9IsZbSI8{!qXpnBR@YVj&^6RJ$;`n~g zH$wKp0C{cm)p`C8FhXZ$_EuQKp;s*Iyq8@vhKiXM^NaHA)8GqAcQu(N=k1>EJc_jQ zK^zr(KY||cF&bY67?SXr0^4a;5`tviMTG@!CRK0e?YeNbBZhr)@Fc!x7X})E8o#R_ zH~)T2KQ3<^#hW%>hXi* zQ|@;gOOKxx1M{o6VPUfocZOifXtTWQ8JQZt$}$rf2{Ur6P*hRluoFDl4}~19 z5!W*q*Dd2Cya|Y^f#W^T^hb$Z$K`95+b+_%`Dk3W0e_$n3;LiX-usabnC9bV>1w$8 zhT6k;4mMw*vCnXZNNsAJv>`tkd`}%e4KH;}86Xp7cFl#9$ z+|ZR9pvR?I!&%DYwXtlJqop%ZtCF(MZr`h&;4HC;#+{q`!d9fav|4e5JK#pM2nd^Q zUMusvOcW&~Z+Z=l|4}({(y|cLR+Qclqlnn}^JW9#d!eK(tjyd1&u0Ec?tX+~_W`4_Wg%ioFB1tHmtu4sfPXahyD$0c@%T~!;deyM>$SF z@o!^xT^7I!Syd5CYdCo6MM*821=wS8wRGrMWvrIostVMK1a1^JYp z8~17W=yB3@XFvdUK&Xw?%Jyjn0$KfA-_-8<1g zs@?J1nC+lAjst%ivlZ)3T-aUJv?bqJRj&@NpH$CqT|iM3O)IpZQ(Z~IHJZ7ngi2(; z^A)Y}qzY_dx+bqQG@)lx!t*;BXczKM=)s&rf0!EefLW?vf)0l*J#5?j1n$r8qv!qceLno#71Yt@GoEK0i9{a!Zi9#IX#}N!i0e7`<1Qkr~E0yWT$qX)`W$2 z)GpSiCGfF9HavBkhLvI`ZFBZq#+w1N%Z!8Av=PzlnN6ol!uL~1M0JTDX>6nH!W<5G zIi6zv=xigcWG;%E2)rkR-maONhrcr8(bvR_!AYcoZss=`Wyp^qPsGa0pHN}nfGW0* zPu28CFloo)bzJ4p*$$=@+qEjZN~XRSMv%3HHcAPELuX}mUT4&TwHD}fLy?wVX~rAW zm@ef`$ZpIv+{V~SM;}6ac9O>kcAR}Rx;k2bIk8frS(!#OLXxdy5;6MBmh`+qMI~FT zLp=#Mu(7TWB34O#<~#BN_nOY7pn?HRK** zD3>zL$wGDkOtDk*^po$TBc}O?6?MZi2RWwBX1JqksK&KTvdR!eh`GEO9$*)2vTH8% za|6VE1mNw)9gY#wM%prK4~+blW!SU>-Rj}oJKa2PkY@<}!HE$Zs=p#TI_)=l$M!C> zY{YS+(a+7i=lM9fakDi$xw%2%*CIal3-*!u zhn$BOj!9_K;v9=qnWT$U;jY)18J@XP6vWyDK%6zVJ!py?-}5$lcbejH6B-^uk8^A; zb>%>Lm&c%M&wt!=ZAJBEjSCi(0FdVjP{QPj#Rh9H05s4}ZfZpiR>QnZE#R(88==M= zVlCVs-+99F9(tkMvrO>xJr&QZI?p=|T>_t2#njf@MuteQvC{ zS)Rqp+!0~17H*?k$ty=$Jyo>ZXRUq)v7j^yRQz(8@NF5riosD$ z7O&ly!He%Q+W`Cx?_A5~g$7y&mE|@}-OvL~+>D$w3^B_SfiP|K7bG$>_diWpxqD2u z;3k+yqp|4TFv_xyA*rdANccEHsDOD=a&UFSr(3fA3Y}ZOjCq`(;+t#sXU)f=|`jzM?aHm zi{HmUtjXPSwi~hp?tL{Bu%BzK6PsoB(D>r`_hoa2j+ITHi(TjgXY#^qgm;9qL;E8( zcDK3k;d$2;P6;!+MPv}D?mGA@0~T@lHK~T}DZ14;&}ettO@Up-{h|p3_#8nYLEa@u>xacOky#i z5QJXuo0R1d3~Pl#3d71spbdC$R3copn%Npl*P+jBIM7&_v{#|s-rsE79|dL+6oZga z;csz~g^l8TYVH?h#xgCAK7hdG_PLQk(w_7?E&Y!429;`Zkke^)Hj9|y3Y%2d3UXy0noL|+| zU)QR(#r2?`E~?eK9-&iT?eF&wlk4LR@FhK6JRE%9G|h5TKhwde?_7mGdQM|nY__^T z-ze4AI?-}hcdu!In*6{* zll!BWr#O&rsGJd$@F~V533WI62wCZukRu*llc>>QNAe)@jE;`h?sz|ThK3ZOHm|Sq zr2R2J}kkk6-W~;YC*A=H}Mps{HO1@ z+ENNyQ;qRNfmm48T=jFmqHVrGB2G_e z{wK@mcb<%|x?PM1YVq#iGX*H2ZAip!EZ&U%7ao`Nw)D`b*M}7bSy>1Y)e-$j#782` zT#gavPptXV`o{-BPMK_Dt{^*!DRa$(tK6Mxq_;baA`h2Tgw&!4+xSTI?Q(%@-QMaB zZ2eOqRXof%8D?6H1lV07uhP_7!uB5`52iQGUCRE;L`|!&Ox^;+f;W0&AteH>;awh; zm1XMO2z8JT<%;Y~-12e!SNO9z0e#d!e2I3zx%f5v4~RN=$WM{PI2Q>v=iT7rc#APl z?kzp39iE$Ttu7kFcqin+I!t@eBMZU6wOptzOVkJ6N*Pp1rl6%Q?DKmbqKcKOxshZ|p z#E}w@!hJj?;c}_fTlVyhym}sai56fp;N@~N0F@fyxA)Hg32x_pHb~FLvn*J+&swS0+5{~E`N_^$@0Wg=xuB}q2 z91|uk2$$KpL^JR%mA?8bV&HvHr95tJuAauUR!0FVoKvi5{(#Nx>odORAq(ZQwlh33 zZX-nzkw@!!`XEObUKQ0a2^!w{UE)ebsn1U4guJwJf)ZtijXKvc-y;uZKY!Pz-+c-% zu#zcpg(rU}X7v*hd4$^&&jk5+$mrdN;iKL~4O!07OB&mreS5|+(6}lVl z*Wz!MapMLLSqw<$KStNNZrnw zI8YDfjhjB(5tFi=$9w?){a_f(5J{`~j*YcT0{|fY4+q0PLTCS(9&1SF=&;GNZja5L zeEk_-twf}Q=k461^HcG5mX0e=3xc-4Uf)Mpwof+hbV$wo>Dn2YU zn=Gj{n7-oGT&YA@TlgAZ_-0!{QHcpX0HU|}h5HrZ@)}=g8-Kh9UJ9^ThT85oel&cx z+#8GRIm@UF*la5WQ{2G}flabOZs6E2^g^<{k)-T4SVuEN;>!FpQ zn_%u{I80xUL^^Rfq%T5-Isos((iMBhjoO`opG0;#5uWN!)z~8C0Tr7vGUH5Y9SqF^ zIW*ypL{y7_Rk<>nIz4*nvlQ%zNCGgieXoF4R;xhm2WL1-illAj}V%&6*kT+rm*0OLb zO^MHRABl$--1OLJ8fq)-TJLKs@WE}9J!y-F5}K&RHDc7zq<0pvB#+wsZkE9}+oHN( z4iY`#)~XWfTHmp^BPXAh|4}wlTsu~ifW*aprnxt4&TC$$X+*LuxWOAp+KR2cHAje* zGP+TMGvB8)ATuoOM!f{T-;HMv>t?Hh_C8Ja;UyYKCamV~H}sQ*`=vmi_gdXpiv^8i z&E{9mgxMjwkLN>*O%G^5jkSbnrlFc5ec*zFJfWV&2u~Mdp@h{PJ7V9bVo?Bn(lPgs1c0~V(e1-QE$>KXV)6ql@`Ef@^aj%h zu;RT(R;CXNr8^Rqdlm-({p-fE2xf{=AzHCIpq^r63auF(6JcJ-ancXoocbpLA8vZX zQ{irN^OtkBDg~uormEIw(6drPJE9L*b^b(gk)E1_^7a76IsDe|h)qh`Pos2k!0{e| z{9E{Vh6e`_#eMunjHhf%UDxyw#P}J6jL}0ykGM)tHsAc^0`|Dc8~ayTAnK2ds9zXy zqvkh(Un)x20Vw1qly_^!5UfFVwcw86(WD+L$lMTO9NH}IO9AdV=VICzAd}?P`KpB- z#0MEyHNT~>dl{`dqmUh}X8Czz zlOsRC{GnbwGu-j3E2N=$b_gW%YFDcIY^R+oJAPaTjDzP)CgOoVrOU>cW@L$tztISTdXU$`9)EeL^28|MXgLChaCClW69h#bkab9#DLM5y@ma+st3*=R?z6F00r(&$H zY<`or5uAzVUl2`%_Nw`7Kp|GXikM=!rCELb0clb*=Y633mLA~BUM#XU!gxvH11sjB zd)N;u;u&ZF!NwOSMXdqiKt|EbRG9wV2r4%!1HGoe*3S|GNgrNUw!P;a+J&u!j7Os5 zYUx)V!;MUQc@@BuUgStdvB+>wO<1@i;ja=b5Weyg3D_i z`{4WdMn4E^g!*JEu+^a3mPY^tcX@ysoXuu*NRdAbr3MK>s2BZwWYz69|K|hwCMn94?ueF~awt%j{MbK4rrQr1? z94_=5dL!`KZ0)J(-QH>%K078v2DW~KAG|~aZM?R=9A}gmGIqgRcUTnf3flA}0HrJ0nkw1O_kQNUj{P;CIHWDgh zlfY8IL)IV3hCoFgPoUd|1<3vzY7U^4*XQM8?-0H>{~L=$iBkA z+`gO+lKSlG)Vn^<4?eP{e5XPUOfDXh`hGs1p03J1FMh6<+kZ}!5q>G6PKmPj%#gp| zCK>6OAqosEmxm^ymUXB(W+YO^Ly$XT(c1OTV~t8;<&W2{jpi%p9P;iWM(FqEDK9Ap zlSIc zz(7B#qy&_p1O=Ze1RD|w(q^tR+6AjRFtBP^C+mf^I*QvhLx>OVtm0m!Qg~w?Q!byF zG4!jtw`J4msT(p|j|WkN1?9_ZguJJ!i7>ABg#Qsiwgd;aS(#4Kw2{Q*67_VypCyvo4iXi9I zj#8`;`sSua1t{01E{>1DAh>)6MyL@O5ob?;ik`ba1Y~3)Sbb7C$`99z5PqQ?T#8z1 z2D}egXFpd=LW^0iOA3YEk?sd|uUoMbFzE_+|L7MHsOjc=80U+yk>Ou}l~o%yS3U=$ ztkUGGR_9w0qlJqwe|Fl4-K^>eoZ(zwK3E-WQD8y2^hgK7lx-zoo25s5YnHb_t{xVaPgbpr7gr-sD-GT1fGws}<&N0~7rj|Or9&Zanjjei`swb5ow~@XAdpSo z98N)cqD6W@$QDb||4Qd{sFYDu6XpTb(F-GGXNlkvnm1st9FlI&HXK zD_03>CvYO6^u!Mad^%cQA1iLm`kib(Lk-$Se9C2~nDvKL*@%M;)!jEe5ENsQQbbdu zyBoI|42@!8m1L6x3s$L-ra0dKrw0YrF3>zQtK79RKprPdLtio6yCx44Op=2w(X<3I zRl^FB*?hvSu0hCT;hk<&JiQZH{}48TP13BAva&raoRKe4UKfM@;Y!3u+wKS$L7*?B z11`;Zj51$!Bm53-ziUZ^e(!TMQqW;J#3Ox`rt9gZ=k%FB)~B)Kv=rCXvQOi2};3kCyCY%6vGHt zj5P@WKPZY+ez7x7e$jU%uZh6(s9M10)`gDA*L)&tAWpz7I#V4C{2>t$VMXnD_O1m=rTa&?klMU=;* z;XrvscWxF5-Uh?o1&A#J}Kf!2?*UOqkY* z6HOCQi5b+1SNcdIVxx1vu)^8|`&|WmZk(^g8$p`X*Z5xCvwTuD<(rI4sB zi(2P$GSYROqPUD_-~~jXpBmB(J_aj*rJc0w7#Tb4ez47Y!s9mVbsLJvw7|9E$E+Q* z^>53dH>y=<`&qh3s(rxIDmL}zjch|Zg(SEwRrzN&YDY&*(8?6g z6TUzd{A@Quv2!jM8DIgv$-xqG&T|}!-89c4Jm3=+Y9-S27!Gi-T_4A5R^zLUHZ%6S zDu7mZK)mLK2j@wN*y!!O?>6n8>2Bo635$ztKW8Dxk|_wDP%ns>J> z3VIMk%kJU!qKW|+%PId;QBp8Zn6>+zSr%eaQt*pr(8p*t;(qt$0oY@xx8sc&>vR%wp+NwC%fSS=M!)wj~;_D?)1 zm^#Ca{tokHT7XspzU`X3L%eE5`q@Wgd&#)cqn+1x5QAR+z~^_|Tiv+ii~V%&AIsNZ zK5y$g*FHYTAJaZxDi4*lKXEgCNJlN;hpOcP#x?0c#oRl;xD^a8kpneQMp_NzxAlGu zap6S$X;&f{v&Z)S<7Wyl;FW3KcZ5DVw$aMIF_L1TRrbdi;c|Ih1u?|q+;8!f0|VCa z>EU&ypx-ui+>JOz0=bm+07xlENo_?%3V+sy^+05jx8O1&QpPfdB zu5xm+QNjde5jQWNkuc{}u;$4&@{6mSj%?W-DIf0aUovaw1MQqf`?PA{T;E%j3uwS*Sd1WxVN?4#R#M`EXqQw3I^z5>OM;pB z4i{yM9lO;=!AQMpAfmpR|McL6&BGSOw<@}N(rZj!R#|EJ)#=+e7x8WeNsQ`*YU}nn zI`OBBHwL_Tp5X56qpd4@>F37Yp9_~2L(W!7{XR&9h`021;GrGLCk-bxu55ukUmI2j z3@YbgQF;oD={K~-%5oWyjY&wK>5|m>tHAc{8Ei_P5EtpLyQZCNuctN7@0(Ga z?CU_>B^}y15`+?p`=4tRNH>Yof6==ld3@d6Fi;*RjS3Cdzlq1dp$hIZZfo;kgX&#r z;ylc;psfvlu&zaCrz#ZfMWnU>a80hm9b5yO-nmGoPLzkl_H9g2 z*VE&a1jV)QYoNpZSXt^0Vn=&(?bv+qHQBdH;gdhAGPGWp7;8$jBSb+Kd*-kKI@eHe zjZ@L)lB{Pb6GA1qCbizPTiNYx>U!zett5%BE&#WHL_@3lTLSiu7lsk#xW$wh( z8v+Y`FUbDEXQ_^c@86=zDzK<$%~>gqhP^9Y0&Q#rRaMVwv{>E=AhXJ$c}@jwB*TxN zVO#e{W6jadfzN4vmxRU?%zGapPsX2n*&K`PKs>}1;^Bg3FhTcQq_7LjSfZGbqNUQ< z*iRJ6P(DVYMmP|>PM}30n?w{}nl>KdHS*|uI%Zm?3V57sDP}rOXKjwTP|2`OW~^_f zWMfG?AGb;n;N~JSGNAI1m1JSwIMn3%p58%@m!mgkDXYuAH&5Hr^ZSXzx2*Sr(`Nih z;OOi2d%4~LJGSk`CpUHBH$_KV0kR~`opaH@-;~LKzC<^-1LfFZ$n4aR7XW*Lx z?Ve)Dtnshqo`Ft1vb|Cx1*>GU4CQd~hev66uv;!(@BFL_ySRqYjFBiE)`#zo72F6T zjzE!F%7AU?u3s*sWIGTjVpT-u#6J0>~Mki&FjzX$Q^ZXiRPH%Do zq7lMpXRE4I(}ZNKymD?IA8%Y2hp!KjnK-M$uphB*%^ay*MNp~E%QKA5)`(@J2l zlch=$k=YpWKrg70kc7%K!VIQy%$N}K<%2lo<9&vwrwbo|ivw%pQA#^tt{yof+qwoC zjtt;@N^hUT%acmPZNz88upu+27-$*pb3o>q^5XJ;m@IujPEd$44nn|&a&#F8aDDew z5P8JbI;^UKez}QROPGT$Kyn|ZDd_TW#QY;d^^zKNvzzT;TTJ}z#-)qujaHuoaN=W& zaSNczmtH^w3m`w_px}-29x;@qSczmTT~7cM!hD{0GE>hKC6Ey+Ah*N@q3MjuuXPw` zW1A)Wn#r^e1=%HzwzZ(lI`l)=cJ-v#7%7vr>r?4d&}B+Ge`mA=3$HJ6(Ej`4L2AkcBJA<&EWO5Cav!fTHR)V6;JS3rQ(2GN*S9gjtQF0l1$3D z-4;aQFmKL1pp?cfNErgHQcAZNBUn$Y@NWUY06e*r*+CR({PU)0#5txOLlf!oM%|(Ug>Bm zLvP3x1~djJr)ExD;Rr2;o<=>AagFXcHxgGs^(!VF%UMvVo^0{PY@p@i1n*f@QlFLv zDN7=Z>qxQz)M!Dn9Blqhp6O4zxOoF4Lh7lnBJHF4a%F}RA!}ky z%V`p|;QFnJX(S(z^ChNRK92Lvi_cUTJ8LqJS_d>DWQl5k$;Ni*wDR$)Xfvv%8@4P7 zriZtrf{L)Dwk;!^jJuf!!)xy{O@xui?MDW?rh5Q9cll)}HwC~F+Sa5}w#^FlT-(|Q zt{M&6JyDNQN;To2iy>}|^OR&i`U1O)sa6p#ZjH(TX7_fXv^lwjyV~#X%7o8NfK*Mx z*v$k}1mbSxP{gDsZI~S6lcGQHEp`KuixrmXvrK4Sp)zS#f@=>V8nnGzY=0_C%nt*B zuqJ~L#f37S4hqG#^P}>|@xm%&|9)@<$ErFF?05c|eUgt1Y^bmhbcP~OCrNN`7KoEc zz&M#(+cg!e(nR4Jj%pK$cb318*+VKfib=Xf>XwIOi1(c^MA*K&BQGd23005-8fQ)E zi}GwYOtIgEzI@zWdcVmP^=yt3h)ZB zi3T$f^DtR;BMW#l)aVaeMZI$2G$mYC&=IDT;Y1v<%eJ zfP@Kl!IE)ysZY=hoJ3i@^gZe*%){uq3j-DU+9)DE4wVF8cz#^F@Mih> z%cpR|C-n>mG1dvQ@g?h@Pppg^+0OVfP+cF524Zs@j_90Uwez0^Kq%a8x$NY$mLE|g z^mTe+2~3tldd(PX+8m)(#zd~wT2uUV0Ls-XNWW?RxMH8jY_u+%-K?L0Nk zOPEvmG3vWh_0&-+Gw0=tu|}LC^Hi^bE&@eWa)=h!=j$vdx>G~ezWYfzQcsd@R|mz@ zWp*Q(WY5*3;WGQXGGsUQnITY|Ue=#t-I(RUJ#R1k6)4OmsG`*5KqIm^a+ty-ntjJ- zh5Qj^`EYM_P7Mtrajegz$3y`4wCbI@I~>!*Dgz8+)QYB`0duuv>w*1woa+zM=qV{Z zXV6(k^llXm==`U-ZVXj#xiSLmhVEJ9sWUk9=z(Ky3B%F7R5;$;xSwNBhCaAj93z1} zjs~azr~a!f1VS731E;NFrH6VI60rf|jUYY+6o=Xbb^@j(d^(Zdo$jo!kMBoEXG7Q# z_m|Xd%$pX22}Khe)>Lnx4+m#9bETb^_7^W_RL4E3kw+rNPKcJZuk%&Y5J z-^6nGlHv?|#Ljp!>kdDCmo~4sqB~e0r}Q!{J&hkkuGhe%=#v{wonqcAo~uf_c>(2h z=ckrcwd%Cj2-vgKZKZtG<^|jaMUan~FCThnXpu{{Z@Q4{06V&D>UzxuAlUr25XSFp7-%DM6gp$mlf? z@Y<{m1=MEfjKoTfZ|6GVfxY6!C%(KACc8LAnp+L%DhtR5bMxoPm$ub;4Ao?{m&p{~ z3%d!}SCEC>LXJIFDmTZVnc#NXyVK15P`Sg-8G2qe%>w<>d#}Y|L2I9pp5uB;@o1tj ztN06E^ON7&P;_=fkzqC!+yGtF1HwUedMbeM^zeC*?8G6?ZXiD!n8*{&(kH1JFJLcwd1^aNRy-sjycp7(5A~?piv1B9XFp z!kR&EF(t^{8~2!kYpDyd*}vg>2`UH;0r3q;V(bII@iuut{CS!-nNP zDr-Q~zntZPX0EeQUD`A>OA=iC!r8wU@jW1YpzJfcqGyJ%(VtY@07i;Z-5AP!SQ%n> zk;vZM!l$c2J94klsDU9tHaSAKDwfv+EU2yVuA+vwJW`^a5TbF0`o;}*r5k&VrdpW` ze&V!;V7Y8*L{y>#eCBUs(bojVoC1}?n@JK>8X?HPp+ITZW)rH ze_b`df~vihLm!`{(m!z!&ivSNFtHRAijf0HfA`>G`hA*QL3OA@l5J&w>yeWL1mXk! z&ppe((aS%!OM$C{?G9M0EK>9|DnQv zbvXaOrt(*_=zndO0@A>L+l&92%73+v{`dL(y?OM%$`twq{$FMOiGjXbN&jnF|JuL5 zr#${oJ!+c&V_N^L_x~^VcM|+R<)jt<_j3PVApG~q{T;sjPqikM|GnCOGq}H(`a7HY hpHls5|9h#wAu2gZP_VxSL4H4yznk3Gd;az6{{eK { if (ctx.preset === undefined) { ctx.preset = await task.prompt([ { type: 'select', - message: 'Select configuration preset', + header: ' Dashmate provides default configuration presets:\n local - la la' + + ' la\n mainnet - bla bla bla\n', + message: 'Select preset', choices: PRESETS, initial: 'testnet', }, ]); + + // eslint-disable-next-line no-param-reassign + task.output = ctx.preset; } }, + options: { + persistentOutput: true, + }, }, { task: (ctx) => { @@ -88,6 +99,7 @@ class SetupCommand extends BaseCommand { }, ], { + concurrent: false, renderer: isVerbose ? 'verbose' : 'default', rendererOptions: { showTimer: isVerbose, @@ -97,6 +109,9 @@ class SetupCommand extends BaseCommand { }, }); + // eslint-disable-next-line no-console + console.log(`Hello! I'm your ${chalk.bold.cyanBright('Dash')} mate\n\nI will help you to setup ...\n`); + try { await tasks.run({ preset, @@ -105,6 +120,7 @@ class SetupCommand extends BaseCommand { debugLogs, minerInterval, externalIp, + platformP2PKey, operatorBlsPrivateKey, fundingPrivateKeyString, isVerbose, @@ -140,10 +156,13 @@ SetupCommand.args = [{ SetupCommand.flags = { 'debug-logs': Flags.boolean({ char: 'd', description: 'enable debug logs', allowNo: true }), 'external-ip': Flags.string({ char: 'i', description: 'external ip' }), - 'operator-bls-private-key': Flags.string({ char: 'k', description: 'operator bls private key' }), - 'funding-private-key': Flags.string({ char: 'p', description: `private key with more than ${MASTERNODE_DASH_AMOUNT} dash for funding collateral` }), + 'masternode-operator-private-key': Flags.string({ char: 'k', description: 'masternode operator BLS private key' }), + 'platform-p2p-key': Flags.string({ char: 'p', description: 'platform p2p private key' }), + // TODO: Remove this one? + 'funding-private-key': Flags.string({ char: 'f', description: `private key with more than ${MASTERNODE_DASH_AMOUNT} dash for funding collateral` }), 'node-count': Flags.integer({ description: 'number of nodes to setup' }), 'miner-interval': Flags.string({ char: 'm', description: 'interval between blocks' }), + // TODO: Refactor this 'ssl-provider': Flags.string({ char: 's', description: '', options: SSL_PROVIDERS.filter((item) => item !== 'selfSigned') }), 'zerossl-apikey': Flags.string({ char: 'z', description: 'ZeroSSL API key', dependsOn: ['ssl-provider'] }), 'ssl-certificate-file': Flags.string({ char: 'c', description: 'SSL certificate file path', dependsOn: ['ssl-provider'] }), diff --git a/packages/dashmate/src/constants.js b/packages/dashmate/src/constants.js index 90676033e4a..789b4d61c34 100644 --- a/packages/dashmate/src/constants.js +++ b/packages/dashmate/src/constants.js @@ -15,6 +15,7 @@ const presets = { }; const nodeTypes = { + NODE_TYPE_HPMN: 'hpmn', NODE_TYPE_MASTERNODE: 'masternode', NODE_TYPE_FULLNODE: 'fullnode', }; diff --git a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js index c42f998d5c8..ca9c44e5d9e 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js @@ -7,11 +7,14 @@ const BlsSignatures = require('@dashevo/bls'); const { PrivateKey } = require('@dashevo/dashcore-lib'); +const crypto = require('crypto'); + const { SSL_PROVIDERS, NODE_TYPES, NODE_TYPE_MASTERNODE, PRESET_MAINNET, + NODE_TYPE_HPMN, } = require('../../../constants'); /** @@ -28,7 +31,6 @@ const { function setupRegularPresetTaskFactory( configFile, generateBlsKeys, - tenderdashInitTask, registerMasternodeTask, renderServiceTemplates, writeServiceConfigs, @@ -48,34 +50,183 @@ function setupRegularPresetTaskFactory( }, }, { - title: 'Set node type', + title: 'Node type', task: async (ctx, task) => { if (ctx.nodeType === undefined) { ctx.nodeType = await task.prompt([ { type: 'select', + header: ' Dash network has different node types\n Blue\n Green\n Red\n We' + + ' should' + + ' explain their purpose and costs\n', message: 'Select node type', - choices: NODE_TYPES, - initial: NODE_TYPE_MASTERNODE, + choices: NODE_TYPES, // TODO: message and value + initial: NODE_TYPE_HPMN, + }, + ]); + + // eslint-disable-next-line no-param-reassign + task.output = ctx.nodeType; + } + }, + options: { + persistentOutput: true, + }, + }, + { + enabled: (ctx) => ctx.nodeType === NODE_TYPE_MASTERNODE || ctx.nodeType === NODE_TYPE_HPMN, + task: async (ctx, task) => { + ctx.isMasternodeRegistered = await task.prompt([ + { + type: 'toggle', + header: 'Tell what it means and what we gonna do in both cases\n', + message: 'Is your masternode already registered?', + enabled: 'Yep', + disabled: 'Nope', + }, + ]); + + ctx.config.set('core.masternode.enable', true); + }, + }, + { + title: 'Masternode operator key', + enabled: (ctx) => ctx.isMasternodeRegistered, + task: async (ctx, task) => { + const blsSignatures = await BlsSignatures(); + const { PrivateKey: BlsPrivateKey } = blsSignatures; + + function validate(value) { + if (value.length < 1) { + return 'should not be empty'; + } + + const operatorBlsPrivateKeyBuffer = Buffer.from(value, 'hex'); + + let key; + try { + key = BlsPrivateKey.fromBytes(operatorBlsPrivateKeyBuffer, true); + } catch (e) { + return 'invalid key'; + } finally { + if (key) { + key.delete(); + } + } + + return true; + } + + if (ctx.operatorBlsPrivateKey === undefined) { + ctx.operatorBlsPrivateKey = await task.prompt([ + { + type: 'input', + header: 'Masternode operator BLS private key... \n' + + 'you can take it there and put here. Must be HEX.\n', + message: 'Enter BLS private key', + validate, }, ]); + } else { + const result = validate(ctx.operatorBlsPrivateKey); + + if (result !== true) { + throw new Error(`operator private key: ${result}`); + } } - ctx.config.set('core.masternode.enable', ctx.nodeType === NODE_TYPE_MASTERNODE); + ctx.config.set('core.masternode.operator.privateKey', ctx.operatorBlsPrivateKey); // eslint-disable-next-line no-param-reassign - task.output = `Selected ${ctx.nodeType} type\n`; + task.output = '*******************************************'; + }, + options: { + persistentOutput: true, }, - options: { persistentOutput: true }, }, { - title: 'Configure external IP address', + title: 'Platform P2P Key', + enabled: (ctx) => ctx.isMasternodeRegistered && ctx.nodeType === NODE_TYPE_HPMN, + task: async (ctx, task) => { + // TODO: Do we accept HEX or base64? + + function validate(value) { + if (value.length < 1) { + return 'should not be empty'; + } + + // TODO: Implement validation + // const privateKeyDer = Buffer.concat([ + // Buffer.from('302a300506032b6570032100', 'hex'), // Static value + // Buffer.from(value, 'hex'), + // ]); + // + // const verifyKey = crypto.createPrivateKey({ + // format: 'der', + // type: 'pkcs8', + // privateKeyDer, + // }); + // + + return true; + } + + if (ctx.platformP2PKey === undefined) { + ctx.platformP2PKey = await task.prompt([ + { + type: 'input', + header: 'Platform P2P private key ... we accept base64 or hex?...', + message: 'Enter ED25519 private key', + validate, + }, + ]); + } else { + const result = validate(ctx.platformP2PKey); + + if (result !== true) { + throw new Error(`platform p2p key: ${result}`); + } + } + + // TODO: Derive node id from key + // config.set('platform.drive.tenderdash.nodeId', nodeId); + + ctx.config.set('platform.drive.tenderdash.nodeKey', ctx.platformP2PKey); + }, + options: { + persistentOutput: true, + }, + }, + { + title: 'Masternode keys', + enabled: (ctx) => !ctx.isMasternodeRegistered + && (ctx.nodeType === NODE_TYPE_HPMN || ctx.nodeType === NODE_TYPE_MASTERNODE), + task: async (ctx, task) => { + ctx.masternodeOwnerKeys = await task.prompt([ + { + type: 'form', + header: 'The user should use a secured wallet to generate a key, and provide the' + + ' resulting public keys. (deploy tool example)\n', + message: 'Please provide the following information:', + choices: [ + { name: 'owner', message: 'Owner public key' }, + { name: 'voting', message: 'Voting public key' }, + { name: 'payout', message: 'Payout script' }, + ], + }, + ]); + }, + }, + { + title: 'External IP address', task: async (ctx, task) => { if (ctx.externalIp === undefined) { ctx.externalIp = await task.prompt([ { type: 'input', - message: 'Enter node public IP (Enter to accept detected IP)', + header: 'The node external IP address must be static and will be used by the' + + ' network ..', + message: 'Enter host public IP', initial: () => publicIp.v4(), }, ]); @@ -84,9 +235,11 @@ function setupRegularPresetTaskFactory( ctx.config.set('externalIp', ctx.externalIp); // eslint-disable-next-line no-param-reassign - task.output = `${ctx.externalIp} is set\n`; + task.output = ctx.externalIp; + }, + options: { + persistentOutput: true, }, - options: { persistentOutput: true }, }, { title: 'Set masternode operator private key', @@ -128,38 +281,7 @@ function setupRegularPresetTaskFactory( options: { persistentOutput: true }, }, { - title: 'Register masternode', - enabled: (ctx) => ( - ctx.nodeType === NODE_TYPE_MASTERNODE - && ctx.fundingPrivateKeyString !== undefined - ), - task: (ctx) => { - if (ctx.preset === PRESET_MAINNET) { - throw new Error('For your own security, this tool will not process mainnet private keys. You should consider the private key you entered to be compromised.'); - } - - const fundingPrivateKey = new PrivateKey(ctx.fundingPrivateKeyString, ctx.preset); - ctx.fundingAddress = fundingPrivateKey.toAddress(ctx.preset).toString(); - - // Write configs - const configFiles = renderServiceTemplates(ctx.config); - writeServiceConfigs(ctx.config.getName(), configFiles); - - return registerMasternodeTask(ctx.config); - }, - options: { persistentOutput: true }, - }, - { - title: 'Set default config', - task: (ctx, task) => { - configFile.setDefaultConfigName(ctx.preset); - - // eslint-disable-next-line no-param-reassign - task.output = `${ctx.config.getName()} set as default config\n`; - }, - }, - { - title: 'Set SSL certificate', + title: 'SSL certificate', enabled: (ctx) => !ctx.certificateProvider, task: async (ctx, task) => { const sslProviders = [...SSL_PROVIDERS].filter((item) => item !== 'selfSigned'); @@ -244,9 +366,9 @@ function setupRegularPresetTaskFactory( }, }, { - title: 'Initialize Tenderdash', - enabled: (ctx) => ctx.preset !== PRESET_MAINNET, - task: (ctx) => tenderdashInitTask(ctx.config), + task: (ctx) => { + configFile.setDefaultConfigName(ctx.preset); + }, }, ]); } diff --git a/yarn.lock b/yarn.lock index 12b3953f17a..ca012f17b0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5119,6 +5119,13 @@ __metadata: languageName: node linkType: hard +"colorette@npm:^2.0.19": + version: 2.0.19 + resolution: "colorette@npm:2.0.19" + checksum: 888cf5493f781e5fcf54ce4d49e9d7d698f96ea2b2ef67906834bb319a392c667f9ec69f4a10e268d2946d13a9503d2d19b3abaaaf174e3451bfe91fb9d82427 + languageName: node + linkType: hard + "colors@npm:1.0.3": version: 1.0.3 resolution: "colors@npm:1.0.3" @@ -5780,7 +5787,7 @@ __metadata: hasbin: ^1.2.3 is-wsl: 2.2.0 jayson: ^3.3.4 - listr2: 3.5.0 + listr2: 5.0.7 lodash: ^4.17.21 memory-streams: ^0.1.3 mocha: ^9.1.2 @@ -7030,7 +7037,7 @@ __metadata: languageName: node linkType: hard -"figures@npm:^3.0.0, figures@npm:^3.2.0": +"figures@npm:^3.0.0": version: 3.2.0 resolution: "figures@npm:3.2.0" dependencies: @@ -9358,22 +9365,24 @@ fsevents@~2.3.2: languageName: node linkType: hard -"listr2@npm:3.5.0": - version: 3.5.0 - resolution: "listr2@npm:3.5.0" +"listr2@npm:5.0.7": + version: 5.0.7 + resolution: "listr2@npm:5.0.7" dependencies: - chalk: ^4.1.0 cli-truncate: ^2.1.0 - figures: ^3.2.0 - indent-string: ^4.0.0 + colorette: ^2.0.19 log-update: ^4.0.0 p-map: ^4.0.0 - rxjs: ^6.6.7 + rfdc: ^1.3.0 + rxjs: ^7.8.0 through: ^2.3.8 wrap-ansi: ^7.0.0 peerDependencies: enquirer: ">= 2.3.0 < 3" - checksum: cf308374629674608e41ca25e9314181551a1e2a752ddba495b7366326da88e1b01df24d13db5b7bf7ab0d8735db9cf1d5b6939b552c9c96b6314d596d3ba268 + peerDependenciesMeta: + enquirer: + optional: true + checksum: 5c2cb6ba3f7a5cfd548f89405febe73dc937acb6060227198c05da0ed5d5285a8107c61fcc4e33884e3bbdd447411aff7580af396bd22b6a11047ceab4950fab languageName: node linkType: hard @@ -12327,7 +12336,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"rxjs@npm:^7.0.0, rxjs@npm:^7.2.0": +"rxjs@npm:^7.0.0, rxjs@npm:^7.2.0, rxjs@npm:^7.8.0": version: 7.8.0 resolution: "rxjs@npm:7.8.0" dependencies: From 4579c0f7c2e064cc9eb1726a44370d86077720a9 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 21 Feb 2023 03:38:08 +0800 Subject: [PATCH 02/93] chore: add message to node type selection --- .../src/listr/tasks/setup/setupRegularPresetTaskFactory.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js index ca9c44e5d9e..15f94193b22 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js @@ -15,6 +15,7 @@ const { NODE_TYPE_MASTERNODE, PRESET_MAINNET, NODE_TYPE_HPMN, + NODE_TYPE_FULLNODE, } = require('../../../constants'); /** @@ -60,7 +61,11 @@ function setupRegularPresetTaskFactory( + ' should' + ' explain their purpose and costs\n', message: 'Select node type', - choices: NODE_TYPES, // TODO: message and value + choices: [ + { name: NODE_TYPE_MASTERNODE }, + { name: NODE_TYPE_HPMN, message: 'high-performance masternode' }, + { name: NODE_TYPE_FULLNODE }, + ], initial: NODE_TYPE_HPMN, }, ]); From ec2b03e3cd91458520cffacfe705017615b84ae2 Mon Sep 17 00:00:00 2001 From: thephez Date: Tue, 21 Feb 2023 10:03:56 -0500 Subject: [PATCH 03/93] chore: some setup instruction suggestions --- packages/dashmate/src/commands/setup.js | 7 ++++--- .../tasks/setup/setupRegularPresetTaskFactory.js | 13 +++++++------ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/dashmate/src/commands/setup.js b/packages/dashmate/src/commands/setup.js index 6e02e15008b..2fcda3c2c6e 100644 --- a/packages/dashmate/src/commands/setup.js +++ b/packages/dashmate/src/commands/setup.js @@ -72,8 +72,9 @@ class SetupCommand extends BaseCommand { ctx.preset = await task.prompt([ { type: 'select', - header: ' Dashmate provides default configuration presets:\n local - la la' - + ' la\n mainnet - bla bla bla\n', + header: ' Dashmate provides default configuration presets:\n local - Run a fully functional network environment on your machine for local development' + + '\n mainnet - Run a node connected to the primary Dash network' + + '\n testnet - Run a node connected to the Dash test network\n', message: 'Select preset', choices: PRESETS, initial: 'testnet', @@ -110,7 +111,7 @@ class SetupCommand extends BaseCommand { }); // eslint-disable-next-line no-console - console.log(`Hello! I'm your ${chalk.bold.cyanBright('Dash')} mate\n\nI will help you to setup ...\n`); + console.log(`Hello! I'm your ${chalk.bold.cyanBright('Dash')} mate\n\nI will assist you with setting up a Dash masternode or full node on Dash's\nmainnet or testnet. I can also help you setup and run a development network\non your local system.\n`); try { await tasks.run({ diff --git a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js index 15f94193b22..ccbcb989506 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js @@ -57,9 +57,10 @@ function setupRegularPresetTaskFactory( ctx.nodeType = await task.prompt([ { type: 'select', - header: ' Dash network has different node types\n Blue\n Green\n Red\n We' - + ' should' - + ' explain their purpose and costs\n', + header: ' The Dash network has several different node types:' + + ' \n Full nodes: Host a full copy of the Dash blockchain (no collateral required)' + + ' \n Masternodes: Full node features plus additional Core services such as ChainLocks and InstantSend (1000 DASH collateral)' + + ' \n High-performance masternodes: Masternode features plus hosting of Dash Platform (4000 DASH collateral)\n', message: 'Select node type', choices: [ { name: NODE_TYPE_MASTERNODE }, @@ -84,7 +85,7 @@ function setupRegularPresetTaskFactory( ctx.isMasternodeRegistered = await task.prompt([ { type: 'toggle', - header: 'Tell what it means and what we gonna do in both cases\n', + header: 'If your masternode is already registered, we will import your BLS operator key and use it to generate the transaction to move your masternode to dashmate. If you are registering a new masternode, we will generate a BLS operator key for you.\n', message: 'Is your masternode already registered?', enabled: 'Yep', disabled: 'Nope', @@ -126,8 +127,8 @@ function setupRegularPresetTaskFactory( ctx.operatorBlsPrivateKey = await task.prompt([ { type: 'input', - header: 'Masternode operator BLS private key... \n' - + 'you can take it there and put here. Must be HEX.\n', + header: 'To import your masternode operator BLS private key, copy the\n' + + '"masternodeblsprivkey" field from your masternode\'s dash.conf file.Must be HEX.\n', message: 'Enter BLS private key', validate, }, From 827f2ab7b05926d567b4f0dfc675028fa91fcc90 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 23 Feb 2023 01:03:28 +0800 Subject: [PATCH 04/93] feat: continuation --- .pnp.cjs | 107 +++++- packages/dashmate/package.json | 4 +- packages/dashmate/src/commands/setup.js | 10 +- .../setup/setupRegularPresetTaskFactory.js | 305 +++++++++++++++--- yarn.lock | 105 ++++++ 5 files changed, 486 insertions(+), 45 deletions(-) diff --git a/.pnp.cjs b/.pnp.cjs index e5574aad6ec..8b6ff7407b5 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -3975,6 +3975,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["@snyk/protect", [\ + ["npm:1.1108.0", {\ + "packageLocation": "./.yarn/cache/@snyk-protect-npm-1.1108.0-623decd138-a594dd8749.zip/node_modules/@snyk/protect/",\ + "packageDependencies": [\ + ["@snyk/protect", "npm:1.1108.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@socket.io/component-emitter", [\ ["npm:3.1.0", {\ "packageLocation": "./.yarn/cache/@socket.io-component-emitter-npm-3.1.0-3f778351c2-db069d9542.zip/node_modules/@socket.io/component-emitter/",\ @@ -5275,6 +5284,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["ansi-regex", "npm:5.0.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:6.0.1", {\ + "packageLocation": "./.yarn/cache/ansi-regex-npm-6.0.1-8d663a607d-1ff8b7667c.zip/node_modules/ansi-regex/",\ + "packageDependencies": [\ + ["ansi-regex", "npm:6.0.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["ansi-split", [\ @@ -5317,6 +5333,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["ansi-styles", "npm:5.2.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:6.2.1", {\ + "packageLocation": "./.yarn/cache/ansi-styles-npm-6.2.1-d43647018c-ef940f2f0c.zip/node_modules/ansi-styles/",\ + "packageDependencies": [\ + ["ansi-styles", "npm:6.2.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["ansicolors", [\ @@ -5910,6 +5933,26 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["begoo", [\ + ["npm:2.0.2", {\ + "packageLocation": "./.yarn/cache/begoo-npm-2.0.2-d0c18c96a8-3c42191429.zip/node_modules/begoo/",\ + "packageDependencies": [\ + ["begoo", "npm:2.0.2"],\ + ["@snyk/protect", "npm:1.1108.0"],\ + ["ansi-regex", "npm:6.0.1"],\ + ["ansi-styles", "npm:6.2.1"],\ + ["chalk", "npm:2.4.2"],\ + ["cli-boxes", "npm:2.2.1"],\ + ["pad-component", "npm:0.0.1"],\ + ["repeating", "npm:3.0.0"],\ + ["string-width", "npm:4.2.3"],\ + ["strip-ansi", "npm:7.0.1"],\ + ["taketalk", "npm:1.0.0"],\ + ["wrap-ansi", "npm:8.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["big.js", [\ ["npm:5.2.2", {\ "packageLocation": "./.yarn/cache/big.js-npm-5.2.2-e147c30820-b89b6e8419.zip/node_modules/big.js/",\ @@ -6740,6 +6783,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["cli-boxes", "npm:1.0.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:2.2.1", {\ + "packageLocation": "./.yarn/cache/cli-boxes-npm-2.2.1-7125a5ba44-be79f8ec23.zip/node_modules/cli-boxes/",\ + "packageDependencies": [\ + ["cli-boxes", "npm:2.2.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["cli-cursor", [\ @@ -7708,6 +7758,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["ajv", "npm:8.8.1"],\ ["ajv-formats", "virtual:58fb68f2aed20e5e0f2e48520ab903ae9bb3440369bfd5e912034003cf27c5aae368649fc5620dd2acbed578131f3a0975e75b838d77d12335fb0412e24026c6#npm:2.1.1"],\ ["awilix", "npm:4.3.4"],\ + ["begoo", "npm:2.0.2"],\ ["chai", "npm:4.3.4"],\ ["chai-as-promised", "virtual:58fb68f2aed20e5e0f2e48520ab903ae9bb3440369bfd5e912034003cf27c5aae368649fc5620dd2acbed578131f3a0975e75b838d77d12335fb0412e24026c6#npm:7.1.1"],\ ["chalk", "npm:4.1.2"],\ @@ -7742,7 +7793,8 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["semver", "npm:7.3.8"],\ ["sinon", "npm:11.1.2"],\ ["sinon-chai", "virtual:12a596dc9572e25ce715d3736dc74b317c5ca5cfb3b4f67864b1e76b3a401006f84d381aaf975bb5b4da9cafac5125e6869fc78d5202f4c95780c81479112f32#npm:3.7.0"],\ - ["table", "npm:5.4.6"]\ + ["table", "npm:5.4.6"],\ + ["yosay", "npm:2.0.2"]\ ],\ "linkType": "SOFT"\ }]\ @@ -8339,6 +8391,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["eastasianwidth", [\ + ["npm:0.2.0", {\ + "packageLocation": "./.yarn/cache/eastasianwidth-npm-0.2.0-c37eb16bd1-7d00d7cd8e.zip/node_modules/eastasianwidth/",\ + "packageDependencies": [\ + ["eastasianwidth", "npm:0.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["ee-first", [\ ["npm:1.1.1", {\ "packageLocation": "./.yarn/cache/ee-first-npm-1.1.1-33f8535b39-1b4cac778d.zip/node_modules/ee-first/",\ @@ -8397,6 +8458,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["emoji-regex", "npm:8.0.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:9.2.2", {\ + "packageLocation": "./.yarn/cache/emoji-regex-npm-9.2.2-e6fac8d058-8487182da7.zip/node_modules/emoji-regex/",\ + "packageDependencies": [\ + ["emoji-regex", "npm:9.2.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["emojis-list", [\ @@ -15091,6 +15159,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["repeating", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/repeating-npm-3.0.0-172bd87ce0-d6d736e32e.zip/node_modules/repeating/",\ + "packageDependencies": [\ + ["repeating", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["replace-ext", [\ ["npm:1.0.1", {\ "packageLocation": "./.yarn/cache/replace-ext-npm-1.0.1-ab0bac6614-4994ea1aaa.zip/node_modules/replace-ext/",\ @@ -16191,6 +16268,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["strip-ansi", "npm:6.0.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:5.1.2", {\ + "packageLocation": "./.yarn/cache/string-width-npm-5.1.2-bf60531341-7369deaa29.zip/node_modules/string-width/",\ + "packageDependencies": [\ + ["string-width", "npm:5.1.2"],\ + ["eastasianwidth", "npm:0.2.0"],\ + ["emoji-regex", "npm:9.2.2"],\ + ["strip-ansi", "npm:7.0.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["string.prototype.trimend", [\ @@ -16272,6 +16359,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["ansi-regex", "npm:5.0.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:7.0.1", {\ + "packageLocation": "./.yarn/cache/strip-ansi-npm-7.0.1-668c121204-257f78fa43.zip/node_modules/strip-ansi/",\ + "packageDependencies": [\ + ["strip-ansi", "npm:7.0.1"],\ + ["ansi-regex", "npm:6.0.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["strip-bom", [\ @@ -18456,6 +18551,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["strip-ansi", "npm:6.0.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:8.1.0", {\ + "packageLocation": "./.yarn/cache/wrap-ansi-npm-8.1.0-26a4e6ae28-371733296d.zip/node_modules/wrap-ansi/",\ + "packageDependencies": [\ + ["wrap-ansi", "npm:8.1.0"],\ + ["ansi-styles", "npm:6.2.1"],\ + ["string-width", "npm:5.1.2"],\ + ["strip-ansi", "npm:7.0.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["wrappy", [\ diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index ed27d3b7dec..3c5fc6e0161 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -63,6 +63,7 @@ "ajv": "^8.6.0", "ajv-formats": "^2.1.1", "awilix": "^4.2.6", + "begoo": "^2.0.2", "chalk": "^4.1.0", "cron": "^2.1.0", "dash": "workspace:*", @@ -86,7 +87,8 @@ "qs": "^6.11.0", "rxjs": "^6.6.7", "semver": "^7.3.2", - "table": "^5.4.6" + "table": "^5.4.6", + "yosay": "^2.0.2" }, "devDependencies": { "@dashevo/oclif": "^1.0.0", diff --git a/packages/dashmate/src/commands/setup.js b/packages/dashmate/src/commands/setup.js index 2fcda3c2c6e..01474583b8b 100644 --- a/packages/dashmate/src/commands/setup.js +++ b/packages/dashmate/src/commands/setup.js @@ -4,6 +4,9 @@ const { Flags } = require('@oclif/core'); const chalk = require('chalk'); +const yosay = require('yosay'); +// const begoo = require('begoo'); + const BaseCommand = require('../oclif/command/BaseCommand'); const MuteOneLineError = require('../oclif/errors/MuteOneLineError'); @@ -111,7 +114,12 @@ class SetupCommand extends BaseCommand { }); // eslint-disable-next-line no-console - console.log(`Hello! I'm your ${chalk.bold.cyanBright('Dash')} mate\n\nI will assist you with setting up a Dash masternode or full node on Dash's\nmainnet or testnet. I can also help you setup and run a development network\non your local system.\n`); + console.log( + yosay( + `Hello! I'm your ${chalk.bold.cyanBright('Dash')} mate!\n\nI will assist you with setting up a Dash node on mainnet or testnet. I can also help you setup a development network on your local system.`, + { maxLength: 45 }, + ), + ); try { await tasks.run({ diff --git a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js index ccbcb989506..a5f8b5ae20a 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js @@ -5,10 +5,12 @@ const publicIp = require('public-ip'); const BlsSignatures = require('@dashevo/bls'); -const { PrivateKey } = require('@dashevo/dashcore-lib'); +const { PrivateKey, PublicKey, Address } = require('@dashevo/dashcore-lib'); const crypto = require('crypto'); +const placeholder = require('enquirer/lib/placeholder'); + const { SSL_PROVIDERS, NODE_TYPES, @@ -17,6 +19,7 @@ const { NODE_TYPE_HPMN, NODE_TYPE_FULLNODE, } = require('../../../constants'); +const { base } = require('../../../../configs/system'); /** * @param {ConfigFile} configFile @@ -63,7 +66,7 @@ function setupRegularPresetTaskFactory( + ' \n High-performance masternodes: Masternode features plus hosting of Dash Platform (4000 DASH collateral)\n', message: 'Select node type', choices: [ - { name: NODE_TYPE_MASTERNODE }, + { name: NODE_TYPE_MASTERNODE, hint: 'Take me, I\'m cheaper' }, { name: NODE_TYPE_HPMN, message: 'high-performance masternode' }, { name: NODE_TYPE_FULLNODE }, ], @@ -82,10 +85,31 @@ function setupRegularPresetTaskFactory( { enabled: (ctx) => ctx.nodeType === NODE_TYPE_MASTERNODE || ctx.nodeType === NODE_TYPE_HPMN, task: async (ctx, task) => { + let header; + if (ctx.nodeType === NODE_TYPE_HPMN) { + header = 'If your masternode is already registered, we will import your masternode ' + + ' operator and platform node keys to configure an HP masternode. Please make ' + + ' sure your IP address didn\'t change, otherwise you need to update. If' + + ' you are' + + ' registering a' + + ' new' + + ' masternode, I will provide more information and help you to generate' + + ' necessary keys.\n'; + } else { + header = 'If your masternode is already registered, we will import your masternode ' + + ' operator to configure a masternode. Please make ' + + ' sure your IP address didn\'t change, otherwise you need to update If' + + ' you are' + + ' registering a' + + ' new' + + ' masternode, I will provide more information and help you to generate' + + ' necessary keys.\n'; + } + ctx.isMasternodeRegistered = await task.prompt([ { type: 'toggle', - header: 'If your masternode is already registered, we will import your BLS operator key and use it to generate the transaction to move your masternode to dashmate. If you are registering a new masternode, we will generate a BLS operator key for you.\n', + header, message: 'Is your masternode already registered?', enabled: 'Yep', disabled: 'Nope', @@ -95,6 +119,192 @@ function setupRegularPresetTaskFactory( ctx.config.set('core.masternode.enable', true); }, }, + { + enabled: (ctx) => (ctx.nodeType === NODE_TYPE_MASTERNODE || ctx.nodeType === NODE_TYPE_HPMN) + && !ctx.isMasternodeRegistered, + task: async (ctx, task) => { + ctx.registrar = await task.prompt([ + { + type: 'select', + header: 'Dashmate is not going to register masternode for you because it\'s not' + + ' secure. You can use Dash Core so we can generate a RPC command for you or you' + + ' can use other tools and we can help you to generate operator key and node id' + + ' because that\'s only what dashmate cares\n', + message: 'What do you want to use to register masternode?', + choices: [ + { name: 'core', message: 'Dash Core (Wallet?)' }, + { name: 'other', message: 'Other' }, + ], + initial: 'core', + }, + ]); + }, + }, + { + title: 'Register masternode with Dash Core (Wallet?)', + enabled: (ctx) => ctx.registrar === 'core' + && (ctx.nodeType === NODE_TYPE_HPMN || ctx.nodeType === NODE_TYPE_MASTERNODE), + task: async (ctx, task) => { + function validateOutputIndex(value) { + const index = Math.floor(Number(value)); + + return index >= 0 && index.toString() === value; + } + + function validateTxHash(value) { + return value.length === 64; + } + + function validateECDSAPublicKey(value) { + try { + PublicKey(value); + + return true; + } catch (e) { + return false; + } + } + + function validateAddress(value) { + try { + Address(value); + + return true; + } catch (e) { + return false; + } + } + + const blsSignatures = await BlsSignatures(); + const { PrivateKey: BlsPrivateKey, BasicSchemeMPL } = blsSignatures; + + const randomBytes = new Uint8Array(crypto.randomBytes(256)); + const operatorPrivateKey = BasicSchemeMPL.keyGen(randomBytes); + + const initialOperatorPrivateKey = Buffer.from(operatorPrivateKey.serialize()).toString('hex'); + + function validateBLSPrivateKey(value) { + if (value.length === 0) { + return 'should not be empty'; + } + + const operatorPrivateKeyBuffer = Buffer.from(value, 'hex'); + + let key; + try { + key = BlsPrivateKey.fromBytes(operatorPrivateKeyBuffer, true); + } catch (e) { + return 'invalid key'; + } finally { + if (key) { + key.delete(); + } + } + + return true; + } + + function validateRewardShare(value) { + const reminder = value.split('.')[1]; + + return Number(value) <= 100 && (!reminder || reminder.length <= 2); + } + + function formatRewardShares(input, choice) { + let str; + + const number = Number(input); + if (Number.isNaN(number) || number.toFixed(2).length < input.length) { + str = input; + } else { + str = number.toFixed(2); + } + + const pos = Math.min(choice.cursor, str.length); + + const options = { + input: str, + initial: choice.initial, + pos, + showCursor: this.state.index === 1, + }; + + return placeholder(this, options); + } + + const form = await task.prompt([ + // { + // type: 'form', + // header: 'Help user with collateral \n', + // message: 'Enter collateral information:', + // choices: [ + // { + // name: 'txId', + // message: 'Transaction hash', + // validate: validateTxHash, + // }, + // { + // name: 'outputIndex', + // message: 'Output index', + // validate: validateOutputIndex, + // }, + // ], + // validate: ({ txId, outputIndex }) => validateTxHash(txId) + // && validateOutputIndex(outputIndex), + // }, + // { + // type: 'form', + // header: 'Help user with these keys \n', + // message: 'Enter masternode keys and payout address:', + // choices: [ + // { + // name: 'ownerPublicKey', + // message: 'Owner public key', + // validate: validateECDSAPublicKey, + // }, + // { + // name: 'votingPublicKey', + // message: 'Voting public key', + // validate: validateECDSAPublicKey, + // }, + // { + // name: 'payoutAddress', + // message: 'Payout address', + // validate: validateAddress, + // }, + // ], + // validate: ({ ownerPublicKey, votingPublicKey, payoutAddress }) => ( + // validateECDSAPublicKey(ownerPublicKey) + // && validateECDSAPublicKey(votingPublicKey) + // && validateAddress(payoutAddress) + // ), + // }, + { + type: 'form', + header: 'Explain options with operator key and explain operator rewards\n', + message: 'Please provide the following information:', + choices: [ + { + name: 'privateKey', + message: 'BLS private key', + initial: initialOperatorPrivateKey, + validate: validateBLSPrivateKey, + }, + { + name: 'rewardShare', + message: 'Reward share', + initial: '0.00', + validate: validateRewardShare, + format: formatRewardShares, + result: (value) => Number(value).toFixed(2), + }, + ], + validate: ({ privateKey, rewardShare }) => validateBLSPrivateKey(privateKey) + && validateRewardShare(rewardShare), + }, + ]); + }, + }, { title: 'Masternode operator key', enabled: (ctx) => ctx.isMasternodeRegistered, @@ -102,8 +312,8 @@ function setupRegularPresetTaskFactory( const blsSignatures = await BlsSignatures(); const { PrivateKey: BlsPrivateKey } = blsSignatures; - function validate(value) { - if (value.length < 1) { + function validateBLSPrivateKey(value) { + if (value.length === 0) { return 'should not be empty'; } @@ -128,13 +338,13 @@ function setupRegularPresetTaskFactory( { type: 'input', header: 'To import your masternode operator BLS private key, copy the\n' - + '"masternodeblsprivkey" field from your masternode\'s dash.conf file.Must be HEX.\n', + + '"masternodeblsprivkey" field from your masternode\'s dash.conf file.\n', message: 'Enter BLS private key', - validate, + validate: validateBLSPrivateKey, }, ]); } else { - const result = validate(ctx.operatorBlsPrivateKey); + const result = validateBLSPrivateKey(ctx.operatorBlsPrivateKey); if (result !== true) { throw new Error(`operator private key: ${result}`); @@ -151,7 +361,7 @@ function setupRegularPresetTaskFactory( }, }, { - title: 'Platform P2P Key', + title: 'Platform node key', enabled: (ctx) => ctx.isMasternodeRegistered && ctx.nodeType === NODE_TYPE_HPMN, task: async (ctx, task) => { // TODO: Do we accept HEX or base64? @@ -181,8 +391,8 @@ function setupRegularPresetTaskFactory( ctx.platformP2PKey = await task.prompt([ { type: 'input', - header: 'Platform P2P private key ... we accept base64 or hex?...', - message: 'Enter ED25519 private key', + header: 'Platform node key. Must be base64\n', + message: 'Enter ED25519 key', validate, }, ]); @@ -197,51 +407,62 @@ function setupRegularPresetTaskFactory( // TODO: Derive node id from key // config.set('platform.drive.tenderdash.nodeId', nodeId); - ctx.config.set('platform.drive.tenderdash.nodeKey', ctx.platformP2PKey); + // ctx.config.set('platform.drive.tenderdash.nodeKey', ctx.platformP2PKey); }, options: { persistentOutput: true, }, }, { - title: 'Masternode keys', - enabled: (ctx) => !ctx.isMasternodeRegistered - && (ctx.nodeType === NODE_TYPE_HPMN || ctx.nodeType === NODE_TYPE_MASTERNODE), - task: async (ctx, task) => { - ctx.masternodeOwnerKeys = await task.prompt([ - { - type: 'form', - header: 'The user should use a secured wallet to generate a key, and provide the' - + ' resulting public keys. (deploy tool example)\n', - message: 'Please provide the following information:', - choices: [ - { name: 'owner', message: 'Owner public key' }, - { name: 'voting', message: 'Voting public key' }, - { name: 'payout', message: 'Payout script' }, - ], - }, - ]); - }, - }, - { - title: 'External IP address', + title: 'IP address and port', + enabled: (ctx) => ctx.nodeType === NODE_TYPE_HPMN || ctx.nodeType === NODE_TYPE_MASTERNODE, task: async (ctx, task) => { if (ctx.externalIp === undefined) { - ctx.externalIp = await task.prompt([ + + const initialIp = !ctx.isMasternodeRegistered ? publicIp.v4() : undefined; + + function validateIp(ip) { + return Boolean(ip.match(/^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$/)); + } + + function validatePort(port) { + const portNumber = Math.floor(Number(port)); + + return portNumber >= 1 + && portNumber <= 65535 + && portNumber.toString() === port; + } + + const form = await task.prompt([ { - type: 'input', + type: 'form', header: 'The node external IP address must be static and will be used by the' - + ' network ..', - message: 'Enter host public IP', - initial: () => publicIp.v4(), + + ' network ..\n', + message: 'Enter IP address and port:', + choices: [ + { + name: 'ip', + message: 'IPv4', + initial: initialIp, + validate: validateIp, + }, + { + name: 'port', + message: 'Port', + initial: base.core.p2p.port.toString(), + validate: validatePort, + }, + ], + validate: ({ ip, port }) => validateIp(ip) && validatePort(port), }, ]); - } - ctx.config.set('externalIp', ctx.externalIp); + ctx.config.set('externalIp', form.ip); + ctx.config.set('core.p2p.port', form.port); - // eslint-disable-next-line no-param-reassign - task.output = ctx.externalIp; + // eslint-disable-next-line no-param-reassign + task.output = `${form.ip}:${form.port}`; + } }, options: { persistentOutput: true, diff --git a/yarn.lock b/yarn.lock index ca012f17b0c..694201f0ab3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2788,6 +2788,15 @@ __metadata: languageName: node linkType: hard +"@snyk/protect@npm:latest": + version: 1.1108.0 + resolution: "@snyk/protect@npm:1.1108.0" + bin: + snyk-protect: bin/snyk-protect + checksum: a594dd8749a4970b815b063fc2da5356f39828e5ace75fed500cfdec0cb6d65903c1fdbd551d0911e64237f6dad1b944ccce7007a8fc2e597328ad76ff4583cf + languageName: node + linkType: hard + "@socket.io/component-emitter@npm:~3.1.0": version: 3.1.0 resolution: "@socket.io/component-emitter@npm:3.1.0" @@ -3676,6 +3685,13 @@ __metadata: languageName: node linkType: hard +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + languageName: node + linkType: hard + "ansi-split@npm:^1.0.1": version: 1.0.1 resolution: "ansi-split@npm:1.0.1" @@ -3717,6 +3733,13 @@ __metadata: languageName: node linkType: hard +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + languageName: node + linkType: hard + "ansicolors@npm:~0.3.2": version: 0.3.2 resolution: "ansicolors@npm:0.3.2" @@ -4169,6 +4192,27 @@ __metadata: languageName: node linkType: hard +"begoo@npm:^2.0.2": + version: 2.0.2 + resolution: "begoo@npm:2.0.2" + dependencies: + "@snyk/protect": latest + ansi-regex: ^6.0.1 + ansi-styles: ^6.1.0 + chalk: ^2.4.2 + cli-boxes: ^2.1.0 + pad-component: 0.0.1 + repeating: ^3.0.0 + string-width: ^4.1.0 + strip-ansi: ^7.0.1 + taketalk: ^1.0.0 + wrap-ansi: ^8.0.1 + bin: + begoo: cli.js + checksum: 3c421914297a474dcccdae6763e4e6d6056b8dd3764f14e6c8718ae2b164afeefe99a40947e77b5e2a4541b05a5cddc74a5d4dbc67b541184b105aff2d0f9bc2 + languageName: node + linkType: hard + "big.js@npm:^5.2.2": version: 5.2.2 resolution: "big.js@npm:5.2.2" @@ -4892,6 +4936,13 @@ __metadata: languageName: node linkType: hard +"cli-boxes@npm:^2.1.0": + version: 2.2.1 + resolution: "cli-boxes@npm:2.2.1" + checksum: be79f8ec23a558b49e01311b39a1ea01243ecee30539c880cf14bf518a12e223ef40c57ead0cb44f509bffdffc5c129c746cd50d863ab879385370112af4f585 + languageName: node + linkType: hard + "cli-cursor@npm:^3.1.0": version: 3.1.0 resolution: "cli-cursor@npm:3.1.0" @@ -5769,6 +5820,7 @@ __metadata: ajv: ^8.6.0 ajv-formats: ^2.1.1 awilix: ^4.2.6 + begoo: ^2.0.2 chai: ^4.3.4 chai-as-promised: ^7.1.1 chalk: ^4.1.0 @@ -5804,6 +5856,7 @@ __metadata: sinon: ^11.1.2 sinon-chai: ^3.7.0 table: ^5.4.6 + yosay: ^2.0.2 bin: dashmate: ./bin/run languageName: unknown @@ -6246,6 +6299,13 @@ __metadata: languageName: node linkType: hard +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed + languageName: node + linkType: hard + "ee-first@npm:1.1.1": version: 1.1.1 resolution: "ee-first@npm:1.1.1" @@ -6300,6 +6360,13 @@ __metadata: languageName: node linkType: hard +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 + languageName: node + linkType: hard + "emojis-list@npm:^3.0.0": version: 3.0.0 resolution: "emojis-list@npm:3.0.0" @@ -12125,6 +12192,13 @@ fsevents@~2.3.2: languageName: node linkType: hard +"repeating@npm:^3.0.0": + version: 3.0.0 + resolution: "repeating@npm:3.0.0" + checksum: d6d736e32e299ea4b846c61adc47bf04573c5dd842a5acb9da99db2d02681e8c27890024b1392620fb4e4d79d1dba87db760d29f54459eaae839bae8f3e3b773 + languageName: node + linkType: hard + "replace-ext@npm:^1.0.0": version: 1.0.1 resolution: "replace-ext@npm:1.0.1" @@ -13111,6 +13185,17 @@ fsevents@~2.3.2: languageName: node linkType: hard +"string-width@npm:^5.0.1": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: ^0.2.0 + emoji-regex: ^9.2.2 + strip-ansi: ^7.0.1 + checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + languageName: node + linkType: hard + "string.prototype.trimend@npm:^1.0.4": version: 1.0.4 resolution: "string.prototype.trimend@npm:1.0.4" @@ -13192,6 +13277,15 @@ fsevents@~2.3.2: languageName: node linkType: hard +"strip-ansi@npm:^7.0.1": + version: 7.0.1 + resolution: "strip-ansi@npm:7.0.1" + dependencies: + ansi-regex: ^6.0.1 + checksum: 257f78fa433520e7f9897722731d78599cb3fce29ff26a20a5e12ba4957463b50a01136f37c43707f4951817a75e90820174853d6ccc240997adc5df8f966039 + languageName: node + linkType: hard + "strip-bom-buf@npm:^1.0.0": version: 1.0.0 resolution: "strip-bom-buf@npm:1.0.0" @@ -14640,6 +14734,17 @@ typescript@^3.9.5: languageName: node linkType: hard +"wrap-ansi@npm:^8.0.1": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: ^6.1.0 + string-width: ^5.0.1 + strip-ansi: ^7.0.1 + checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 + languageName: node + linkType: hard + "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" From e269221624affaf94e7369ab8373f0da43cd1232 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 23 Feb 2023 12:09:40 +0800 Subject: [PATCH 05/93] chore: some experiments --- ...tect-npm-1.1108.0-623decd138-a594dd8749.zip | Bin 0 -> 24810 bytes ...i-regex-npm-6.0.1-8d663a607d-1ff8b7667c.zip | Bin 0 -> 3905 bytes ...-styles-npm-6.2.1-d43647018c-ef940f2f0c.zip | Bin 0 -> 7048 bytes .../begoo-npm-2.0.2-d0c18c96a8-3c42191429.zip | Bin 0 -> 5060 bytes ...i-boxes-npm-2.2.1-7125a5ba44-be79f8ec23.zip | Bin 0 -> 3771 bytes ...anwidth-npm-0.2.0-c37eb16bd1-7d00d7cd8e.zip | Bin 0 -> 3398 bytes ...i-regex-npm-9.2.2-e6fac8d058-8487182da7.zip | Bin 0 -> 20928 bytes ...peating-npm-3.0.0-172bd87ce0-d6d736e32e.zip | Bin 0 -> 2409 bytes ...g-width-npm-5.1.2-bf60531341-7369deaa29.zip | Bin 0 -> 3889 bytes ...ip-ansi-npm-7.0.1-668c121204-257f78fa43.zip | Bin 0 -> 3116 bytes ...ap-ansi-npm-8.1.0-26a4e6ae28-371733296d.zip | Bin 0 -> 5880 bytes packages/dashmate/src/commands/setup.js | 17 ++++++++++------- 12 files changed, 10 insertions(+), 7 deletions(-) create mode 100644 .yarn/cache/@snyk-protect-npm-1.1108.0-623decd138-a594dd8749.zip create mode 100644 .yarn/cache/ansi-regex-npm-6.0.1-8d663a607d-1ff8b7667c.zip create mode 100644 .yarn/cache/ansi-styles-npm-6.2.1-d43647018c-ef940f2f0c.zip create mode 100644 .yarn/cache/begoo-npm-2.0.2-d0c18c96a8-3c42191429.zip create mode 100644 .yarn/cache/cli-boxes-npm-2.2.1-7125a5ba44-be79f8ec23.zip create mode 100644 .yarn/cache/eastasianwidth-npm-0.2.0-c37eb16bd1-7d00d7cd8e.zip create mode 100644 .yarn/cache/emoji-regex-npm-9.2.2-e6fac8d058-8487182da7.zip create mode 100644 .yarn/cache/repeating-npm-3.0.0-172bd87ce0-d6d736e32e.zip create mode 100644 .yarn/cache/string-width-npm-5.1.2-bf60531341-7369deaa29.zip create mode 100644 .yarn/cache/strip-ansi-npm-7.0.1-668c121204-257f78fa43.zip create mode 100644 .yarn/cache/wrap-ansi-npm-8.1.0-26a4e6ae28-371733296d.zip diff --git a/.yarn/cache/@snyk-protect-npm-1.1108.0-623decd138-a594dd8749.zip b/.yarn/cache/@snyk-protect-npm-1.1108.0-623decd138-a594dd8749.zip new file mode 100644 index 0000000000000000000000000000000000000000..7e02f27921758693f4595d2077f82e13b23ebead GIT binary patch literal 24810 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 O+iGYuei|aMvHc$*rbzt& literal 0 HcmV?d00001 diff --git a/.yarn/cache/ansi-regex-npm-6.0.1-8d663a607d-1ff8b7667c.zip b/.yarn/cache/ansi-regex-npm-6.0.1-8d663a607d-1ff8b7667c.zip new file mode 100644 index 0000000000000000000000000000000000000000..088e552d0fe7d4517691801853aff14b7c76cc88 GIT binary patch literal 3905 zcmaKvc{r3`8^?#?CnQ8dWy_YG>}!ZDL)OBW(O@tbGa*a%osgwQWebD6enys1woLZj zSh7X-eJA_!`YpY^xvo0Tbv@_&aqiD~p8MSA+}~SI8%RPA_^aK@|9tN6!M`u6)7}YX z4Yxp|tRFeTU4-?1IhFD3RG5b0D$#3R*ncO zxRVPUVgN=BiO~Db-oLuut3~VcHXFe$T5qPo(fEAb?xL!E2xEPR-pNsis4J3(J>BKN zsY9K&32F5Q%BHv%GOF&iKrAmFqc@y>jjGpaiJSVXw}4NcZ*s@bc4R}!$6D3PpX!yA z6nvm*gh|JHuht!_%A5d;={K=5m3Tz2stA&}k-&()V<)SS3L?e_u#Apbs>hJ6(7e00 zgeIn^rn1_ijrF>wgDbTg zAh9ZD%wBai8!*QfRmvVk@*>gKUbFV#eVMJ7ZQAC`1fH&DEU^1k&0xv4#tHXOIVfy& zUnt=7#Vr`cz*cWmA+2>gA@rkA4llx3M=?2J4 zgvuz;szoZx>E=ZI+iQmOro@N$xjZ4NH+|?p1DhJMmq~(%u zRH~9g=>|euU8A|cPt0?Ci22hgKAE%g20hW_>PB{O8i7qQ5_k5`!zlIhIE&V(gnNli z3&{>IQRegubY8zSobj0HTNb?J#RMGp05ZeWI1`T*D{b40rqIcfp-UnWD}@QmLowkT zlS7aZr*!WZFW4fhbTck$69 z*awNw`{-6rs0>=>%?q4wa20ZZd9lFnO2EP!CSvEr#pE15Rux_u85Rogl9rj}-pQ%X zX9m7%d6q98>np$7V69O$*E?w9%&Qa{lU@ntjHKkTB`x8;l;h1UaVv6v(s*5 z3=q6XN!UAf_Ho*AU;?Yix-vM=%gVn`7O^2efEMCtUeQPuFRIb3|M_OJBH3_<#$sja z(4tTq($b0AbARr^$i8v&D_>ZayPWO{`2oXSvx5}JdZ^SAGHC{s)M>-2pm>!li{$!; z-5iSLSYSGPLymrSaVz2*sbt)2wVUtGw=rSn3n``S3}$c|z@W}&+Sh=eUFT&mWBujS zZPh>kfb%!5L&K~bV7Bm6=b@Y+hB|k@h|nmYd_yq6H%^~alrLR;hj~2S#Zq2ntR}Y3 zDJoqGm(#u%elp7B7kudr$Y!+C)AOb$PO@Z%u2(8=W~dbxM3k^kmrXrZDW1sJ-|kr) zsYz7r(j98POI4fq-m1WaEOjhT>Zy*rE4CMSaO~jMSr7t#kbf^p#m&q+xAcRz_ls1grMfKU%tzNfJ|JF%K!C)9g3ZRci?iqR(iH19O1U zVnQA*l7gl9Zh0=lThs7SH2lWT-VH4Ay`^JihFdAy}(;PtIqqNCSRAtuUB9w2;u-=l0s2!}%BIp4VA;5PlI!eOO#^GuzUTf1L+u=+QOc*&B5+{mR50hD&wm8pY_hp2bS zVXZdqeaW_xte3a_{YGZv!603TFJeN?2-WBJb97jQ^ec~@=7b$`0D%2B(cuh-StH>> zNNdbJ1nP?<&5`-hlK_ZoKORaH$Q>P1qhP>!>v5gaCSJ72-2R=VKpchU@?-t2k2_RZ z3f-A%2lZsOGwbb1L9*QNASN&9hED>d%K=)7*{Iuzo~4N@Hj=(u@}ykcO;hTH5~Pal zf|&$pX!@#C7(7bHLpG%-C9gdNAuVM;ap=rSkkY44K#D!@L?4*l|YR;c|;>))!^!#>bFyNeYMC zGy1r`Yda@x3;1S)WJ;=q-j<-B5UA2!Hzb$1@|fHq-kO=k-w}w~W)GsJ+Ga010WMS9 z{@Ly_sp_3Lcf4o1t1z+rtfvQwOyEvfw#8BV-byu3>0Kj^4?j9XHmclw#>B5b`~wQ^nvm2;{-j8M{^@83pfPtH8~XF$`Zj}>!EmV_v&4hD=`bV( z)(baJwJIZQF5rHcW^^oS^n{W8!w`GMb?Eh?+%K|Rw9h$%wLwVh9svC#T@5o+v+z53 zJqcr0nOjM^k20S=bwPrpM}y_?JLVObDc&XHzJtKw=ZyzN~nQe&6#GvO?zDf;eW~#;tb`e>r2&dmJ z-l#dUk@Szu$xx9!KH495l+@~*_A-{bgzhg;zF7S3U~OosM@ucc@z%>O_!5ajav_8) zi8+o{J25BNuAqNCt?qsLXQ7cNRbyK1gF?}8UNRiI*FEx1p*`qLLKX$| ze&(EnDYy~0X|}-MsbW!QhD29e&b2Z~RWw|A+JfTd1Y(MK8V243oEK;>L~2xWwk$f| zjP*JoP=l#fUVH0UO2qXPaOT(adkCaZznOUFP!`@#$9ShJtO}LH_*C|B_ngFMn(1ub zF_hJ7wrz66w*Gi|NSGqRWM>yUVuI5ST9IxlG|FJj#)9SF0@y|LBwHI?T|#sK2KPI# zN;{}+->|!?8|RwGZ>vDd^}1UbfSaZ#)HA+O^$IL8#Y+NG{05hXrVllWGre5nd>)q8 z#0YoLV^SkGv4ZNiXYXZ)kKmR$>`>h-uO;1EZzz&B9F!fJURiXz z4Y_XUT)rVHtOQFSabMxOPsP9reJBsg(QLfJtIQXGm^wBc#;CW1_hgwqlA~ZZ&Cqb6*6i3%=F@>0>VxP*%M&ly-widLn?7Wb*AYSY|x?99&TRolM& z^Ys|IPcNZy?BNLf-+R->*) z8IuG^e?cj^CIx2Py$mrj6n10(V$;Zx-;36x|L7Zl=`ma>qPn{od9fJ$H4lO-#VB2| z{2kLvtadJ+Kz3H^+k4Bj&FE}ik~JHL788g`n+fb(C4wZCyL829#RHv7a^HZVE|*@B z=;|Rx@)2I#04vVavt19e7l3H%BO8#htrD+F2cwwp?X@(O=vWo}fl$W0o*i zaqu5EA|+C3>mW_L=7Ac&x0Aa|PQFm*(yUc&^ZjS^8FLHFxcvE-ZN{um_Vvek?hR1U zMzMK~d&lnb%u&bJE7?^L-j>h$veZ-8)x#5KKJz`hO;8`GgocVQ(0Tq`%HEs zQiE!P7125qmh&XYzGch3&(42;bEKg0*0xZk=C*G#=YY-170jp8T_7S>0{*%_I^BxD z+p_Xs-I;3X*QS5fOW)hFGXLrDC)1y*r++Bl1?buO={qGe0QMWoztz-uRiI!wmnNbEAW2Mz^94*SG50^duNGfMZpiE=O4c&{!b#D#hpDwKX5N8e~tTb Yr1Z2&PnQJ%$W9-s(}T$JSA`7tFRduP2><{9 literal 0 HcmV?d00001 diff --git a/.yarn/cache/ansi-styles-npm-6.2.1-d43647018c-ef940f2f0c.zip b/.yarn/cache/ansi-styles-npm-6.2.1-d43647018c-ef940f2f0c.zip new file mode 100644 index 0000000000000000000000000000000000000000..aa1bdfde18e826f88c8164634b421dc7be2c5085 GIT binary patch literal 7048 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 wM&bMeB4mwx~Np#Qpve(5B}|Juy|0Yx;S8~^|S literal 0 HcmV?d00001 diff --git a/.yarn/cache/begoo-npm-2.0.2-d0c18c96a8-3c42191429.zip b/.yarn/cache/begoo-npm-2.0.2-d0c18c96a8-3c42191429.zip new file mode 100644 index 0000000000000000000000000000000000000000..bcc1fccf461125f548297781e8d98976ee0fe5e5 GIT binary patch literal 5060 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 literal 0 HcmV?d00001 diff --git a/.yarn/cache/cli-boxes-npm-2.2.1-7125a5ba44-be79f8ec23.zip b/.yarn/cache/cli-boxes-npm-2.2.1-7125a5ba44-be79f8ec23.zip new file mode 100644 index 0000000000000000000000000000000000000000..9f0f731386a48bc989fa25756f0742ff86702130 GIT binary patch literal 3771 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 b2-<(A{$KUMAOPxbFaW8=lJY^)fBX9{i_Z*$ literal 0 HcmV?d00001 diff --git a/.yarn/cache/emoji-regex-npm-9.2.2-e6fac8d058-8487182da7.zip b/.yarn/cache/emoji-regex-npm-9.2.2-e6fac8d058-8487182da7.zip new file mode 100644 index 0000000000000000000000000000000000000000..e6b0ab4d8054147fa3f563e425b2eedbc1be573d GIT binary patch literal 20928 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 z
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�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 J({mw?zX1tR#GL>D diff --git a/.yarn/cache/eslint-visitor-keys-npm-3.1.0-9a6ffc9175-fd2d613bb3.zip b/.yarn/cache/eslint-visitor-keys-npm-3.1.0-9a6ffc9175-fd2d613bb3.zip deleted file mode 100644 index 4fcb36af65f75a44424c639d08da6a09e1948c4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10997 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 P{5nh^!N9zz|GE1=O>G~u diff --git a/.yarn/cache/get-intrinsic-npm-1.1.1-7e868745da-a9fe2ca8fa.zip b/.yarn/cache/get-intrinsic-npm-1.1.1-7e868745da-a9fe2ca8fa.zip deleted file mode 100644 index a33f35fae3309c4b7f0907b9b85d074fc4ed31cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12138 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
  • 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 diff --git a/.yarn/cache/has-bigints-npm-1.0.1-1b93717a74-44ab558681.zip b/.yarn/cache/has-bigints-npm-1.0.1-1b93717a74-44ab558681.zip deleted file mode 100644 index 1f82d8f3f6403525a7d4405e674774c84762eef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6434 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 diff --git a/.yarn/cache/is-callable-npm-1.2.4-03fc17459c-1a28d57dc4.zip b/.yarn/cache/is-callable-npm-1.2.4-03fc17459c-1a28d57dc4.zip deleted file mode 100644 index a5b4069691761740cd43a667e4ff7f91ee382d7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9785 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 aj|;zwJUk@gKtbU_{v078qKoe5xBmyQ&!{Z` diff --git a/.yarn/cache/is-shared-array-buffer-npm-1.0.1-84bc270861-2ffb92533e.zip b/.yarn/cache/is-shared-array-buffer-npm-1.0.1-84bc270861-2ffb92533e.zip deleted file mode 100644 index 0f589025b3837fed2afa8d9130ff8f57aa1e9622..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6384 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 diff --git a/.yarn/cache/is-weakref-npm-1.0.1-152a166933-fdafb7b955.zip b/.yarn/cache/is-weakref-npm-1.0.1-152a166933-fdafb7b955.zip deleted file mode 100644 index eab2ea13a8bc94b5830c18771c095d6a996b750a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9516 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%0A6U%cirQw@*}g5)^!_kyR7xC~z<2 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 z z88fei0=+4Tw_4jP`am-3`tygKX_MQJ((P5ref$x@p@@Ex4PcWN8OH-MeU9BwTF!OWt zF;hxN2K5WgM-~b}H=b8JHY!fFR8)shlO9)$`)>4^Oij9(5~r@d&vHHYLXp;~N!R$E4Tj8N|sQ|z-h6!ev+d-81yclf*Pwad~lILl+6RcLw8rF`_M|F#b-M2);k zPnLkb;)tWScm9g(O>1JiidbRs4rkOxiUbD>d49ox2Oh27L9N^GuqZ=EuXlt(?NoCf zFuC58U_|>i{Fm=1dz06vynf2M;??8EP@G3odUuK!+G8TR_%D#@_3ll@sb1(IqRTo% zNsGYiC@|#^084nAqlggFxf>Mq@(HlA|Gz8)> zfCS?WGH^-JBr=Tdz;d4&dD#+qI>-anE8ZIJGx5?cdWh(K6ggD(Ogx74n*{AU7?6S3 z{1j6nS&-~KmhQW0RvMRqYDPHBiNN>);-(3iI8Kd#Fia!BaI}Uzuq2xRqHww%qhp$K zplH?}vT!&Yvl&|CEINuMgV&IS`aQ+hVaBd0nrF!H%nqqD%MRGb`QtneFg0dk8W{_j8ImBASR diff --git a/.yarn/cache/object.assign-npm-4.1.2-d52edada1c-d621d832ed.zip b/.yarn/cache/object.assign-npm-4.1.2-d52edada1c-d621d832ed.zip deleted file mode 100644 index 0031b97816070ac017c7c5705934d9576a25426e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24511 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 diff --git a/.yarn/cache/object.entries-npm-1.1.5-7a8fcbc43e-d658696f74.zip b/.yarn/cache/object.entries-npm-1.1.5-7a8fcbc43e-d658696f74.zip deleted file mode 100644 index 716d52aa78fc8b98399fddc098bcd5b03ed2f4f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13922 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 z zr7GyN>z3UUeQoEZzv{X!IC=OS6Rbbvhl9U4wwa%<_>foY6ML;tp$irf!PU{B4mQX^ zBb;6IzCgUWnEretJCpZBI?=n4Jk;>imCiimQqB;eqF9!^T+NhhYL-=P8DA*gOe3Rx zT%`U(baGJv)~;wKuEc0Uaytw^=?`oq!%E~XgKjf8) zq0)Q=M!MY+r}3M1P!$htrzh$=xzC>lSvV^&hqTsfh8TreY;jxmPobL%qwb06CbTE9#6@qztm07lvu$g=7Uhecy7e4Fl zi+QWAH>>Kpcg>(loX2N)Ujh?yC9SC|p&@of&5#1n6Y%rDkkoN;sODV-n{)O|&h0+E z&_G!Ai0*!V-kev2{k^hNUYK7-=z;ITWdQQ7)J+U=m7xvVPouHtHHperJp;07lRo9%JzyynhGTM$KvR;!Ti zD6tYTJ^<9VqQu)zy$NPoY0yTwjIHoHd<(qYxRj9U1c}}-&3vl~^J_`8cBsDD*<`Co zsg5d=$Mg}0P94u>1$OM_gndz)JB;wP#?W#bH>YeIR)msf3F^1e3p7E-pb|5uf@`9E zM+q)J*lmhJq;2bG-{{T9OCR0kGt5qkOT9n1{$!UfZMRpW*=w_W10%L+x!$J`iVbtn zuqfB}RulUB(2D9M=#{c&03~i&*cP_6>Z{y5UT8KZlWBgjH4;0w3i=`I9R1<-+*6fo zy)p5o8wV5_8YRopL+rJEE5r0X8o8PHUh}d6qw2=myiZVtwJYybd^fbIb#ItWxI2%5 z)$5*kB3|dP_zQ%S;e}uMl&#+ep1@()=}@b5MMfOFS?knxLJ&ip&_TpJz>U!foy)1j zQX6I#<~g37;WjCEw7!tFR0KV`!tv20OO2%Ty0F7Kkuj$2VlB~uS|3!!?Uqj7I&?%o zp=^eVV#>sW($nK!RJRS77n?}V`7YHQ=6<-}rRbR`s?3^6&L5EM#sKw5m{+C~XH)*U zO{pfyF+YWP(87bVr?h#$q*6Y0g_HA}Sqe`#2cnx~gcP{}qc{BuhlFKI0)ZF0__y~T z0?b(g!=D8Fd-&zhQe8-RKMc;DFdzfoYahb7q7ZM+u@-;5-l}96$em>Gan#~PB(@A3 zH*(L1@f~0|3^)s$BYsuQC~x%S^TlS39+rG7_|~qoG7?B(mDw}d@W5Uk9K~7t-UsPH zmRG?sDPM%UGf_}S#@$YO35Dp}H-_x_F@<~FSmrV@Y4RsNz)-6)5k2FPaX1B?bWy50 zJ})};jq}6&Y(XmZxBcWB?cGxM7}xuXFwzCICOM+vA{*8rO;ruY5RFVK+xsa*q4f2F z%JIyTqdD2ZZw+|@eQtsd5p?T*tb<$1ZaSaTMCkP?C_LfEG2k4s(A#Jeou^#yVf?v; zsUyr>sMj0PmBMyVJm#Fbh$b&`cprtaBRmg3at^k>BKi*-k{WrM(m6^Zfz7%!;;*LF+jej%qPl@+S-b>;2FP`hOaOdB6f61`_1pd0? zFO{&rfE>{O4*W|O`_jUfs@Gq@%-;b2k2v!s`la0S7aH`r{{EZuf2#0aYHVNfUn&}Z z@jadc_HX>Z^^GryFO`D7h|aJ6o%pB4f9VEaVqePaeqm$a{~h}uqPv&Sm!h{{P}S!j z7yX;}e@Wn80$)nXegP#B{~h>;^S=aUFTpPbO25F$$o~cSC;g{f=_U51(&86(=lOB% zzXjkwbr&zGFCX{*qSj&lJM}*w{=THXTzLMX`aGACf3x*}m!Yx}kWfFnp+EmEJYU(< H|9tm9`3y_& diff --git a/.yarn/cache/string.prototype.trimend-npm-1.0.4-a656b8fe24-17e5aa45c3.zip b/.yarn/cache/string.prototype.trimend-npm-1.0.4-a656b8fe24-17e5aa45c3.zip deleted file mode 100644 index 3a6cb8db614d9ea2d842da09cb6d2ddd72e5a3a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10456 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 diff --git a/.yarn/cache/unbox-primitive-npm-1.0.1-50b9fde246-89d950e18f.zip b/.yarn/cache/unbox-primitive-npm-1.0.1-50b9fde246-89d950e18f.zip deleted file mode 100644 index 27f2ec7f93d06c6bdffdf96fac52d12aa4302e44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7691 zcma)>1zc2Hx4=n(p`}sDkr-M50a0M+6oxLT8A4LJBm@EJ#zDG=Zcs`=KtLJ+8M+aM z5Ge(GdM$Slo&sYWcfJ$A7B2u5Tox7j!>A1 zy(84k4(7tA{$C%xarsd<2XjYH9w%oTdmC39ci3N|SQz+!v{HUsmaqgZ!hnf^0s5UN zFAQqq>ga6Y=wNAMNrhN<+#5Aw3rlNF+l>8LQrjw?lmU$|ig7 z*ku~NfTXkHVXp}`#s+WsypjY3>Up=)g@uSU-)xqLaR(^b)Cnr=2^&x*IWw>nn$2Va z-1U^*0n*DHNC4fbEY+@e@bcTLF@;`*r-zE4n+=TbRtrkXmp>IxBLdfTK5Fex-ZV}g zU(xN0J|A|WJj!EtRg+-C@pVRxm!mpYwk)i6lE_IzLHV=*ot!zr3o;^Un+WgXnBgvbv}R>K)|M zsD^NGf>b{)V13c#QiAM5!UMrdB%=Cs&t(;r#Ej~UFn(=KSq-@aN4GMGuB^Xp&B4pU z*+M9~@8`Rco#@w1EFERJUwojeL?fVPFGLDg$zwThf(MlJiKY-9v4Rj~No%S6fxS>m z{+O;{nygkSUN(CR8?p>c0{$kctEFS_meaZ#wA{=F;Atz(-SaE&Z#Q{{dAWRk!D54j zmk};jdlrpKY|g%U%+i2reNXr(bFT8PJF4J=nUJvY$v9K7@1eh@0J%(j4t=NY>7|ir z@Rsg)VqswL;b33@e>XA}MQK?zO<7}zvLlk8sC849Otdaw_?`n&wJyovr3GE}D7Sp4 zjyZ8Om0s`D^Y3wLQ{~uLv@9nr?@OWB&ume&+!hFl7M1NG`9|BFh0Qg-x%tpcvD;vW zf^@pOU7))+jPVCz=CQuIS2xj!s8~kUE1OE_6Z($)+u1pr$*Lm!uBYx@T);Kt!gO5d#NmAOc7f!ssK2R#H_3|tUpA+&>B!NEfhx7N znR#%gcEa6nC^%5{9~O5ss4*9Kt>jZSvaPeU+Tem%t^qvR{;h*FNr6xpu|Z!gSRN?xILqG zWU;P&T7EQxp=SM1*ic=0eudhv_m;BcX>o0lt$J#Ywzfi`kbXg@Si%a0I7_+KF=H~< zCnlTR031gx$e2w1Rk8lP9!41ROZ)cZYR=~_2tlW!MhEC?-o}teWn9{XiG#8Ai7SxY zaJ}c%UXt3Sfu3D>W1@V3cyr&VZK0DOEp0=d%r94*wV_xMF<9w)-C(19ek}v1S4vDv zT<1W`L@;%~_10$+;a6E#Hy)qnM`_*cRM7rp?aTH8a>sEfs#F%ss4tbedhAgWzX3bT zn99>eh>^ba$K3@M5%7*1&n!MOMYCji>Kn>Ex8uMw++WvZS)<503T;C5a4|4${!Vjk z9H1~y-bXG`iEkZp`N={C7dY8cQmwBsnC2Ei@^q&99O@8{v z?re;hmhWVv>b^$X;0^fYo|#T%^Tsij&dJ(^QgDvR4HKuG z!FhLH-_u;$CXdzZ56pdhMB9OIA5>m zAX;D)I+8zykK9)W617~-#CLECd`i4RO?SMAsAWsh{!03%zMxg(|2TJ+-|34h%*FMR z+r~+h6#RhJHzBm8{H+iBL;gbPo@iD%Ao@66ZO5I{Vn1 zr;Z=m)709V;Oj?ykX@G;Jy!7;zxN*HSI%smkKY&H@>N1Dbi9?9jr{c&g4O&Nc_s(j z!}EAHB_65sz^JLWwTFWqg{1Tc8vO@u{Wa_Qbsf=-4*Z5=;{hT%P8N9`Z9U!Z2pKPE~k`9yH0KeXpn-b6qo|Vx@&SJy36lA zf864BvRw3m>NX=QwdUaTbHdasc*^VXu{3jw+VDM9{=)h;oOBhRDk61t8lKGMw^yn6 z3AJ#=KlfPH3KXPGk7+>Ueb-{|mqAuVr<0HGiHNnL7qk&eh*5~fr)Nkaiz^ul7>pg>-6%1*)l{6%A z!74d}AN6oV>3V)x^qKr>gUa7QK@}TOmh>BrW>~Xq7mh zJ_m5U$T)c-uuDP8^D0;D%rBOcRL<1%G18}pI_d( zs}G44Ex9p7HpWlh{A}4txk3elHAd>xL4+1q7Baq4$DeeR*joTDxB=eYd2V)lebA<# zn|9OYiXu-oi3Qz6#uicUmwjsl4I1C~h|+^SOCTVFiun_i-Fx`un* z(xE(ps~TP9zLiwb36$3mja=Y_rxONT@EQ;gh)uajTd}@gfs@-TEn#Vt)a1eabpN~A z#3pePcWb)|KhCRW(IO!83xs@zyr|?PV0v5x^xWAHL;}PWr&OZX#_q&H(w~cDoB7Dp zBvVb4;%r64=iZolKJ`jrH-!j~^c=j0l|-(yA?si0J{+>q?pnoExVe2=TwN~|svk0! z)W=!e|G6Z5L)=F&VoctHv)t@)uHcdMKG&|-gu)HB%C_%y0t`S<+tVBhr_NPwl855b z!(Z1H<{KUas+K1nf(H315|$~21niJa96LqtY|2|^kIW*i)SQ|7T9?b)i9f=}8+2Zl ze`w7!pkz|D9!(jPz=CZn?fbX(&-4Zhkf;nkL|idwZnS#bJoLsBd&VczKbX4v3Y6KD zbF(NSGKRMk0VkLXT6T7pJX$K>ZCNJIrTA75I&LMRSLiy0C-XXhVQ3>UnpIp=3|A+( z-$}H<$CYofgm{=d%7?{wRG{W4qkIsvoNDx&S6KV(p{RF>K4>;3L^WbfL&MJp$Bt1M ze%P{h?OVv`)p2m@60gySYYvws8DAB4OW5A)9`015k6fC%1|5(o@-^ zNWBwl$_Nj{XYNy{j!$fsO$1ofhDXQfKPn2O+kN&y&z|Yc_l;2+Ve|pyAL7z;sm{102KdX$w(_msmaT#Jdo$Lhot)B1|L*ijp6yz&7^C(aAy_M!86Naum!Bdw8pDaff@wqv$|Fl^H zg<0K3mflV3&0SQR#B=wF@B@B>Gk^c!b@A zOqsu)TKz+UV7PDw>)#T<)Yu%!Jmvb(3l{=X zTgN`!%nHX>0;x042B%VKRXiA%qQm3({pbdA6iV>!cvU<4-nzg1slcCs0oh{Zvpmm2gkhbEnS#zpptEw+Bj8cRoGLK zo4Qzy+KQGpRZavaog_U?&tO0SIl11sv^aCW&s=m2D)DAiaJtX3!(w8YS_Ft#9U19c z%to~tASthdi4Xo#OW|YlCUD?k1dSV$umGgLQQOYadLaww47{&Vn4_R8tR>3b@q7$ad$vO$A3ZX8UgQ@cL z!QJQNDH^gh;&Zypkw)~4I{7|9pS<}FImUo1Zz1H zr{F5ZCjgl^$zsL;U^xn$7(mb%B)97U%NP6oz^+w(0@VXd<2s3BW`+m$#8H}^u?(fz zHIhPj#ph5dh;Vhi5@4a4M);bR9Kn&2^~18pwJ9lkPaHjI`#=cxySylFh>O(|!Ne*_ z)()Q(&+v2o({h^|ikX-G~(b&7{`ku`@w;TnVt7GiB zH~h6ULfaCaqfH@WkT7A-L?{Sb(#(bhU4O=IMTt>47Q+j5KpdKAJh#$kx++PnPirJ? z9vJUVc&idTq>?L}t04UZM!Z4Ep>8yZwE6KerP0QX!mQ&=ZdX^gfzuZGDx-lh#{TB# zz(}U@@NukuU@<{mA%eZ7!cuzVP|A3LuTr=Gj(2eNqsrpqqIZ4_-N>XxQuPYV8)n!_*Mik z(>TWAvt-#1)3DJmx`dinSjzt{9#bgNkMCya-ZP&c#_i^d4 z$Bo@SzDdg_^JIz85K*+4VTixo=`{qVS-Z-u{82l0b3H?sDjRD<$-w0piq$V34^8pmyAJe5InmS>Hv2h3 zYiNF+4NO2Ct}V0t*D>ZI@O3XQ#`HOQ%Snv(p}!4$L1d+5RAtf5GfB%Bz2BsKa#Yc% znJ=VZ&ob0SHpDFOt&*Th5$1yceT;I{r0E{8W6%HLHz81)&qT|Iu+4PYK0-;BS*^C3 z=<6%-T?=;6)ivp6?D8KHvk^3M)|iL-3c@2v+1K$E6N@P>RRR}Ej*oE+-t;ibTsgMvsoOh?|QOZ zc>u4PW0skhG@;zJz(HDHD}SW2;Ldy_QEm)i2HQ#xnx$8{{Fm7PMu3a1F#AR>yo^2d}tW z;~Q^wGg6YkT?L~XBWMSumt%4*6VG(dk%xzEre)EMbie@1BRX;iYf079YVXAep>B`n zhRhOxH%jBZ+pV?Ug|||qiwj$-=0w1afu=wzzuDF4u@xfwFB=@{>por1(sa1;1KmV7 z9g9xWcm$4~6Jl*ka6jx_Y&yIaA(jX1D^l3BH~b3btQ$V7w{Q>XsO|Euj8_UY(W?Q# z9&Nfu4BQot*J>78?zIMDKyX2$K{nQX_1cN4UD1_w(GwYAK&fh-Wn2yqfOi)Hzx++sN$K~+#jt|-9Egi+t5`SyL zr$a^f8C@No@A-aw1F>c)$)X!`H}p!(Gu+Aq2&;O*D}q-~sA2gL5&gI5JPnuRox8hO zk%kaMRefrNp@LR>{w+{R%I(IcakYhS-y0VCt>0&q)#~QUo>U)>@*L+qpUQ&_!ICv+ zo0Vx=wP;B12~F}LCI0)F{I@Y2UMm|{Yd7;t$8x|o)*4#$v0MqgCis7M1iL`UX{*U7 zs>$Ic8z4f)3)Ay0!x z`r|W?4o)n0g-s=68JK}h`Kyux?=+M$t$V7kw0b*_ed zuYVS=j%oTU#rlPc5wBaW+*ILFiph)F4&rrZNsp6h2uRrp2KISlbQnx9jlM>Ra`Yp3 z?hb73<7FeH_|nByQp$OuX(?a@5#Y5#%?I*dUi4&^$!TF5BUkAn36j9jeZJW1G9f-9 zCeluJ*x&hMgN_bBr@pS5*45vU<|Kt3##K~v>dKf{64?JeH-et(KMG3f=k1s9`#*{P z%#~ael+@4Y{V$@IBlj1m3+s0|cXENs3$*+l>X%H)pWL76i2px9@y8$NOJ1NpTDShO zi+?2-{!CX~?(gL^#oyeLf5~;WxXiqqjQE>Lhh78!+}A%+6PJOPa{zw>_kRccD0c<4JyY6kB&$iISlf9msvCS4BaT_E!UZ=myl z|JcP}f_oSJyx?9A3H{9#K&#t7a{n_xbQyd3*!(vZiq2I2BlbTJ(U-B8cN2eO^UzEG zAF=ej4?Qf|7bn^Bd-ceZD|mOzLGLe}T*kto^sh|1kOL%DCvw69xt; O`h!GAbLr`R{`wzUbK_zF diff --git a/.yarn/cache/which-typed-array-npm-1.1.7-7cf2d674e6-147837cf58.zip b/.yarn/cache/which-typed-array-npm-1.1.7-7cf2d674e6-147837cf58.zip deleted file mode 100644 index cc17650e9348a72df25b75242ee6c4af2d920b1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11735 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 1 + && portNumber <= 65535 + && portNumber.toString() === port; + } + + /** + * @typedef {createIpAndPortsForm} + * @param {Object} [options] + * @param {Object} [options.skipInitial=false] + * @param {Object} [options.isHPMN=false] + * @returns {Object} + */ + async function createIpAndPortsForm(options = {}) { + let initialIp; + if (!options.skipInitial) { + initialIp = await publicIp.v4(); + } + + let initialCoreP2PPort; + if (!options.skipInitial) { + initialCoreP2PPort = base.core.p2p.port.toString(); + } + + // TODO: Ports shouldn't be equal and must not be busy + // TODO: Validate that IP address is available from outside + // TODO: Validate ports according to the current network + + const fields = [ + { + name: 'ip', + message: 'External IP address IPv4', + initial: initialIp, + validate: validateIp, + }, + { + name: 'coreP2PPort', + message: 'Core P2P Port', + initial: initialCoreP2PPort, + validate: validatePort, + }, + ]; + + if (options.isHPMN) { + let initialPlatformP2PPort; + if (!options.skipInitial) { + initialPlatformP2PPort = base.platform.drive.tenderdash.p2p.port.toString(); + } + + fields.push({ + name: 'platformP2PPort', + message: 'Platform P2P port', + initial: initialPlatformP2PPort, + validate: validatePort, + }); + + let initialPlatformHTTPPort; + if (!options.skipInitial) { + initialPlatformHTTPPort = base.platform.dapi.envoy.http.port.toString(); + } + + fields.push({ + name: 'platformHTTPPort', + message: 'Platform HTTP port', + initial: initialPlatformHTTPPort, + validate: validatePort, + }); + } + + return { + type: 'form', + name: 'ipAndPorts', + header: 'The node external IP address must be static and will be used by the ..' + + ' network ..\n', + message: 'Enter IP address and ports:', + choices: fields, + validate: ({ + ip, + coreP2PPort, + platformP2PPort, + platformHTTPPort, + }) => { + return validateIp(ip) && validatePort(coreP2PPort) + && (!options.isHPMN || (validatePort(platformP2PPort) && validatePort(platformHTTPPort))) + }, + }; + } + + return createIpAndPortsForm; +} + +module.exports = createIpAndPortsFormFactory; diff --git a/packages/dashmate/src/listr/prompts/validators/validateAddressHex.js b/packages/dashmate/src/listr/prompts/validators/validateAddressHex.js new file mode 100644 index 00000000000..21f61b78c84 --- /dev/null +++ b/packages/dashmate/src/listr/prompts/validators/validateAddressHex.js @@ -0,0 +1,20 @@ +const { Address } = require('@dashevo/dashcore-lib'); +const bs58 = require('bs58'); + +function validateAddressHex(value, network) { + if (value.length === 0) { + return false; + } + + const base58value = bs58.encode(Buffer.from(value, 'hex')); + + try { + Address(base58value, network); + } catch (e) { + return false; + } + + return true; +} + +module.exports = validateAddressHex; diff --git a/packages/dashmate/src/listr/prompts/validators/validateTenderdashNodeKey.js b/packages/dashmate/src/listr/prompts/validators/validateTenderdashNodeKey.js new file mode 100644 index 00000000000..44347d01b46 --- /dev/null +++ b/packages/dashmate/src/listr/prompts/validators/validateTenderdashNodeKey.js @@ -0,0 +1,54 @@ +const crypto = require('node:crypto'); + +/** + * @param {string} value + * @returns {boolean|string} + */ +function validateTenderdashNodeKey(value) { + if (value.length < 1) { + return 'should not be empty'; + } + + const nodeKey = Buffer.from(value, 'base64'); + + if (nodeKey.length !== 64) { + return 'invalid format'; + } + + // TODO: Make it work + // const privateKey = nodeKey.slice(0, 32); + // const privateKeyDer = Buffer.concat([ + // Buffer.from('302e020100300506032b657004220420', 'hex'), // Static value + // privateKey, + // ]); + // const privateKeyObject = crypto.createPrivateKey({ + // format: 'der', + // type: 'pkcs8', + // key: privateKeyDer, + // }); + // + // const publicKey = nodeKey.slice(32); + // const publicKeyDer = Buffer.concat([ + // Buffer.from('302a300506032b6570032100', 'hex'), // Static value + // publicKey, + // ]); + // const publicKeyObject = crypto.createPublicKey({ + // format: 'der', + // type: 'spki', + // key: publicKeyDer, + // }); + // + // const data = Buffer.from('Hello, world!'); + // + // const signature = crypto.sign('sha256', data, privateKeyObject); + // + // const verify = crypto.verify('sha256', data, publicKeyObject, signature); + // + // if (!verify) { + // return 'malformed key'; + // } + + return true; +} + +module.exports = validateTenderdashNodeKey; diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js new file mode 100644 index 00000000000..a25f48b7e6a --- /dev/null +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -0,0 +1,318 @@ +const { Listr } = require('listr2'); + +const styles = require('enquirer/lib/styles'); +const chalk = require('chalk'); + +const { Observable } = require('rxjs'); + +const { + NODE_TYPE_MASTERNODE, + NODE_TYPE_HPMN, +} = require('../../../../constants'); + +const crypto = require('crypto'); + +const publicIp = require('public-ip'); + +const BlsSignatures = require('@dashevo/bls'); + +const { PrivateKey, PublicKey, Address } = require('@dashevo/dashcore-lib'); + +const placeholder = require('enquirer/lib/placeholder'); +const createTenderdashNodeId = require('../../../../tenderdash/createTenderdashNodeId'); +const generateTenderdashNodeKey = require('../../../../tenderdash/generateTenderdashNodeKey'); +const validateTenderdashNodeKey = require('../../../prompts/validators/validateTenderdashNodeKey'); +const validateAddressHex = require('../../../prompts/validators/validateAddressHex'); + +/** + * + * @param {startCore} startCore + * @param {createNewAddress} createNewAddress + * @param {generateToAddress} generateToAddress + * @param {generateBlocks} generateBlocks + * @param {waitForCoreSync} waitForCoreSync + * @param {importPrivateKey} importPrivateKey + * @param {getAddressBalance} getAddressBalance + * @param {sendToAddress} sendToAddress + * @param {waitForConfirmations} waitForConfirmations + * @param {registerMasternode} registerMasternode + * @param {waitForBalanceToConfirm} waitForBalanceToConfirm + * @param {createIpAndPortsForm} createIpAndPortsForm + * @return {registerMasternodeGuideTask} + */ +function registerMasternodeGuideTaskFactory( + startCore, + createNewAddress, + generateToAddress, + generateBlocks, + waitForCoreSync, + importPrivateKey, + getAddressBalance, + sendToAddress, + waitForConfirmations, + registerMasternode, + waitForBalanceToConfirm, + createIpAndPortsForm, +) { + /** + * @typedef {registerMasternodeGuideTask} + * @return {Listr} + */ + async function registerMasternodeGuideTask() { + const blsSignatures = await BlsSignatures(); + const { PrivateKey: BlsPrivateKey, BasicSchemeMPL } = blsSignatures; + + const REGISTRARS = { + CORE: 'dashDesktop', + ANDROID: 'dashAndroid', + IOS: 'dashIOS', + OTHER: 'other', + }; + + const registrarList = [ + { name: REGISTRARS.CORE, message: 'Desktop Dash Wallet' }, + { name: REGISTRARS.ANDROID, message: 'Android Dash Wallet' }, + { name: REGISTRARS.IOS, message: 'iOS Dash Wallet' }, + { name: REGISTRARS.OTHER, message: 'Other' }, + ]; + + const registrarMap = registrarList.reduce((obj, { name, message }) => { + // eslint-disable-next-line no-param-reassign + obj[name] = message; + + return obj; + }, {}); + + + function validateOutputIndex(value) { + const index = Math.floor(Number(value)); + + return index >= 0 && index.toString() === value; + } + + function validateTxHash(value) { + return value.length === 64; + } + + function validateECDSAPublicKey(value) { + try { + PublicKey(value); + + return true; + } catch (e) { + return false; + } + } + + function validateBLSPrivateKey(value) { + if (value.length === 0) { + return 'should not be empty'; + } + + const operatorPrivateKeyBuffer = Buffer.from(value, 'hex'); + + let key; + try { + key = BlsPrivateKey.fromBytes(operatorPrivateKeyBuffer, true); + } catch (e) { + return 'invalid key'; + } finally { + if (key) { + key.delete(); + } + } + + return true; + } + + function validateRewardShare(value) { + const reminder = value.split('.')[1]; + + return Number(value) <= 100 && (!reminder || reminder.length <= 2); + } + + function formatRewardShares(input, choice) { + let str; + + const number = Number(input); + if (Number.isNaN(number) || number.toFixed(2).length < input.length) { + str = input; + } else { + str = number.toFixed(2); + } + + const pos = Math.min(choice.cursor, str.length); + + const options = { + input: str, + initial: choice.initial, + pos, + showCursor: this.state.index === 1, + }; + + return placeholder(this, options); + } + + + + + return new Listr([ + { + task: async (ctx, task) => { + ctx.registrar = await task.prompt([ + { + type: 'select', + header: 'For security reasons, Dash masternodes should never store masternode owner' + + ' or collateral private keys. Dashmate therefore cannot register a masternode for' + + ' you directly. Instead, we will generate RPC commands that you can use in ' + + ' Desktop Dash Wallet (Dash Core)' + + ' or other external tools where the keys are handled securely. During this' + + ' process, dashmate can optionally generate configuration elements as necessary,' + + ' such the BLS operator key and the node id, since this is the' + + ' only information necessary for dashmate to configure the masternode.\n', + message: 'Which wallet will you use to store keys for your masternode?', + choices: registrarList, + initial: REGISTRARS.CORE, + }, + ]); + }, + }, + { + title: 'Register masternode', + enabled: (ctx) => !ctx.isMasternodeRegistered + && (ctx.nodeType === NODE_TYPE_HPMN || ctx.nodeType === NODE_TYPE_MASTERNODE), + task: async (ctx, task) => { + // eslint-disable-next-line no-param-reassign + task.title = `Register masternode with ${registrarMap[ctx.registrar]}`; + + let initialOperatorPrivateKey; + if (ctx.registrar === REGISTRARS.CORE || ctx.registrar === REGISTRARS.OTHER) { + const randomBytes = new Uint8Array(crypto.randomBytes(256)); + const operatorPrivateKey = BasicSchemeMPL.keyGen(randomBytes); + + initialOperatorPrivateKey = Buffer.from(operatorPrivateKey.serialize()).toString('hex'); + } + + // TODO: We need to add description on how to find key generation form in the + // specified wallet + + + // TODO: Implement additional validations + /* + ipAddress is set and port is not set to the default mainnet port + ipAddress is set and not routable or not an IPv4 mapped address + ipAddress is set and already used in the registered masternodes set + */ + + const validateAddressHexWithNetwork = (value) => validateAddressHex(value, ctx.preset); + + const prompts = [ + { + type: 'form', + name: 'collateral', + header: 'Help user with collateral \n', + message: 'Enter collateral information:', + choices: [ + { + name: 'txId', + message: 'Transaction hash', + validate: validateTxHash, + }, + { + name: 'outputIndex', + message: 'Output index', + validate: validateOutputIndex, + }, + ], + validate: ({ txId, outputIndex }) => validateTxHash(txId) + && validateOutputIndex(outputIndex), + }, + { + type: 'form', + name: 'keys', + header: 'Help user with these keys \n', + message: 'Enter masternode addresses:', + choices: [ + { + name: 'ownerAddress', + message: chalk` Owner address {gray HEX encoded}`, + network: ctx.preset, + validate: validateAddressHexWithNetwork, + }, + { + name: 'votingAddress', + message: chalk` Voting address {gray HEX encoded}`, + network: ctx.preset, + validate: validateAddressHexWithNetwork, + }, + { + name: 'payoutAddress', + message: chalk` Payout address {gray HEX encoded}`, + network: ctx.preset, + validate: validateAddressHexWithNetwork, + }, + ], + validate: ({ ownerAddress, votingAddress, payoutAddress }) => { + if (ownerAddress === payoutAddress || votingAddress === payoutAddress) { + return 'you should use different payout address'; + } + + return validateAddressHexWithNetwork(ownerAddress) + && validateAddressHexWithNetwork(votingAddress) + && validateAddressHexWithNetwork(payoutAddress); + }, + }, + { + type: 'form', + name: 'operator', + header: 'Explain options with operator key and explain operator rewards\n', + message: 'Please provide the following information:', + choices: [ + { + name: 'privateKey', + message: chalk`BLS private key HEX encoded`, + initial: initialOperatorPrivateKey, + validate: validateBLSPrivateKey, + }, + { + name: 'rewardShare', + message: chalk`Reward shares %`, + initial: '0.00', + validate: validateRewardShare, + format: formatRewardShares, + result: (value) => Number(value).toFixed(2), + }, + ], + validate: ({ privateKey, rewardShare }) => validateBLSPrivateKey(privateKey) + && validateRewardShare(rewardShare), + }, + ]; + + if (ctx.nodeType === NODE_TYPE_HPMN) { + prompts.push({ + type: 'input', + name: 'platformNodeKey', + header: 'Platform node ED25519 key. What\'s that. Must be base64 tendermint' + + ' format\n', + message: 'Enter Node key Base64 encoded', + initial: generateTenderdashNodeKey(), + validate: validateTenderdashNodeKey, + }); + } + + prompts.push(await createIpAndPortsForm({ + isHPMN: ctx.nodeType === NODE_TYPE_HPMN, + })); + + const form = await task.prompt(prompts); + + console.dir(form); + }, + }, + ]); + } + + return registerMasternodeGuideTask; +} + +module.exports = registerMasternodeGuideTaskFactory; diff --git a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js index bce1b261413..2ebb10d1aaa 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js @@ -30,6 +30,7 @@ const { base } = require('../../../../configs/system'); * @param {obtainZeroSSLCertificateTask} obtainZeroSSLCertificateTask * @param {saveCertificateTask} saveCertificateTask * @param {listCertificates} listCertificates + * @param {registerMasternodeGuideTask} registerMasternodeGuideTask */ function setupRegularPresetTaskFactory( configFile, @@ -40,6 +41,7 @@ function setupRegularPresetTaskFactory( obtainZeroSSLCertificateTask, saveCertificateTask, listCertificates, + registerMasternodeGuideTask, ) { /** * @typedef {setupRegularPresetTask} @@ -115,193 +117,9 @@ function setupRegularPresetTaskFactory( }, }, { - enabled: (ctx) => (ctx.nodeType === NODE_TYPE_MASTERNODE || ctx.nodeType === NODE_TYPE_HPMN) - && !ctx.isMasternodeRegistered, - task: async (ctx, task) => { - ctx.registrar = await task.prompt([ - { - type: 'select', - header: 'For security reasons, Dash masternodes should never store masternode owner' - + ' or collateral private keys. Dashmate therefore cannot register a masternode for' - + ' you directly. Instead, we will generate RPC commands that you can use in Dash' - + ' Core or other external tools where the keys are handled securely. During this' - + ' process, dashmate can optionally generate configuration elements as necessary,' - + ' such as certificates, the BLS operator key and the node id, since this is the' - + ' only information necessary for dashmate to configure the masternode.', - message: 'Which tool will you use to register your masternode?', - choices: [ - { name: 'core', message: 'Dash Core (Wallet?)' }, - { name: 'other', message: 'Other' }, - ], - initial: 'core', - }, - ]); - }, - }, - { - title: 'Register masternode with Dash Core', - enabled: (ctx) => ctx.registrar === 'core' - && (ctx.nodeType === NODE_TYPE_HPMN || ctx.nodeType === NODE_TYPE_MASTERNODE), - task: async (ctx, task) => { - function validateOutputIndex(value) { - const index = Math.floor(Number(value)); - - return index >= 0 && index.toString() === value; - } - - function validateTxHash(value) { - return value.length === 64; - } - - function validateECDSAPublicKey(value) { - try { - PublicKey(value); - - return true; - } catch (e) { - return false; - } - } - - function validateAddress(value) { - try { - Address(value); - - return true; - } catch (e) { - return false; - } - } - - const blsSignatures = await BlsSignatures(); - const { PrivateKey: BlsPrivateKey, BasicSchemeMPL } = blsSignatures; - - const randomBytes = new Uint8Array(crypto.randomBytes(256)); - const operatorPrivateKey = BasicSchemeMPL.keyGen(randomBytes); - - const initialOperatorPrivateKey = Buffer.from(operatorPrivateKey.serialize()).toString('hex'); - - function validateBLSPrivateKey(value) { - if (value.length === 0) { - return 'should not be empty'; - } - - const operatorPrivateKeyBuffer = Buffer.from(value, 'hex'); - - let key; - try { - key = BlsPrivateKey.fromBytes(operatorPrivateKeyBuffer, true); - } catch (e) { - return 'invalid key'; - } finally { - if (key) { - key.delete(); - } - } - - return true; - } - - function validateRewardShare(value) { - const reminder = value.split('.')[1]; - - return Number(value) <= 100 && (!reminder || reminder.length <= 2); - } - - function formatRewardShares(input, choice) { - let str; - - const number = Number(input); - if (Number.isNaN(number) || number.toFixed(2).length < input.length) { - str = input; - } else { - str = number.toFixed(2); - } - - const pos = Math.min(choice.cursor, str.length); - - const options = { - input: str, - initial: choice.initial, - pos, - showCursor: this.state.index === 1, - }; - - return placeholder(this, options); - } - - const form = await task.prompt([ - // { - // type: 'form', - // header: 'Help user with collateral \n', - // message: 'Enter collateral information:', - // choices: [ - // { - // name: 'txId', - // message: 'Transaction hash', - // validate: validateTxHash, - // }, - // { - // name: 'outputIndex', - // message: 'Output index', - // validate: validateOutputIndex, - // }, - // ], - // validate: ({ txId, outputIndex }) => validateTxHash(txId) - // && validateOutputIndex(outputIndex), - // }, - // { - // type: 'form', - // header: 'Help user with these keys \n', - // message: 'Enter masternode keys and payout address:', - // choices: [ - // { - // name: 'ownerPublicKey', - // message: 'Owner public key', - // validate: validateECDSAPublicKey, - // }, - // { - // name: 'votingPublicKey', - // message: 'Voting public key', - // validate: validateECDSAPublicKey, - // }, - // { - // name: 'payoutAddress', - // message: 'Payout address', - // validate: validateAddress, - // }, - // ], - // validate: ({ ownerPublicKey, votingPublicKey, payoutAddress }) => ( - // validateECDSAPublicKey(ownerPublicKey) - // && validateECDSAPublicKey(votingPublicKey) - // && validateAddress(payoutAddress) - // ), - // }, - { - type: 'form', - header: 'Explain options with operator key and explain operator rewards\n', - message: 'Please provide the following information:', - choices: [ - { - name: 'privateKey', - message: 'BLS private key', - initial: initialOperatorPrivateKey, - validate: validateBLSPrivateKey, - }, - { - name: 'rewardShare', - message: 'Reward share', - initial: '0.00', - validate: validateRewardShare, - format: formatRewardShares, - result: (value) => Number(value).toFixed(2), - }, - ], - validate: ({ privateKey, rewardShare }) => validateBLSPrivateKey(privateKey) - && validateRewardShare(rewardShare), - }, - ]); - }, + enabled: (ctx) => !ctx.isMasternodeRegistered + && (ctx.nodeType === NODE_TYPE_MASTERNODE || ctx.nodeType === NODE_TYPE_HPMN), + task: () => registerMasternodeGuideTask(), }, { title: 'Masternode operator key', diff --git a/packages/dashmate/src/status/colors.js b/packages/dashmate/src/status/colors.js index c1662c6c3ef..c0b41af3a8f 100644 --- a/packages/dashmate/src/status/colors.js +++ b/packages/dashmate/src/status/colors.js @@ -1,7 +1,7 @@ const chalk = require('chalk'); -const PortStateEnum = require('../enums/portState'); -const ServiceStatusEnum = require('../enums/serviceStatus'); -const DockerStatusEnum = require('../enums/dockerStatus'); +const PortStateEnum = require('./enums/portState'); +const ServiceStatusEnum = require('./enums/serviceStatus'); +const DockerStatusEnum = require('./enums/dockerStatus'); module.exports = { diff --git a/packages/dashmate/src/status/determineStatus.js b/packages/dashmate/src/status/determineStatus.js index ec6630904ca..e4b8e231370 100644 --- a/packages/dashmate/src/status/determineStatus.js +++ b/packages/dashmate/src/status/determineStatus.js @@ -1,6 +1,6 @@ -const DockerStatusEnum = require('../enums/dockerStatus'); -const ServiceStatusEnum = require('../enums/serviceStatus'); -const MasternodeSyncAssetEnum = require('../enums/masternodeSyncAsset'); +const DockerStatusEnum = require('./enums/dockerStatus'); +const ServiceStatusEnum = require('./enums/serviceStatus'); +const MasternodeSyncAssetEnum = require('./enums/masternodeSyncAsset'); module.exports = { /** diff --git a/packages/dashmate/src/enums/dockerStatus.js b/packages/dashmate/src/status/enums/dockerStatus.js similarity index 100% rename from packages/dashmate/src/enums/dockerStatus.js rename to packages/dashmate/src/status/enums/dockerStatus.js diff --git a/packages/dashmate/src/enums/masternodeState.js b/packages/dashmate/src/status/enums/masternodeState.js similarity index 100% rename from packages/dashmate/src/enums/masternodeState.js rename to packages/dashmate/src/status/enums/masternodeState.js diff --git a/packages/dashmate/src/enums/masternodeSyncAsset.js b/packages/dashmate/src/status/enums/masternodeSyncAsset.js similarity index 100% rename from packages/dashmate/src/enums/masternodeSyncAsset.js rename to packages/dashmate/src/status/enums/masternodeSyncAsset.js diff --git a/packages/dashmate/src/enums/portState.js b/packages/dashmate/src/status/enums/portState.js similarity index 100% rename from packages/dashmate/src/enums/portState.js rename to packages/dashmate/src/status/enums/portState.js diff --git a/packages/dashmate/src/enums/serviceStatus.js b/packages/dashmate/src/status/enums/serviceStatus.js similarity index 100% rename from packages/dashmate/src/enums/serviceStatus.js rename to packages/dashmate/src/status/enums/serviceStatus.js diff --git a/packages/dashmate/src/status/providers.js b/packages/dashmate/src/status/providers.js index 75a051e9436..8548611ffbf 100644 --- a/packages/dashmate/src/status/providers.js +++ b/packages/dashmate/src/status/providers.js @@ -1,5 +1,5 @@ const fetch = require('node-fetch'); -const PortStateEnum = require('../enums/portState'); +const PortStateEnum = require('./enums/portState'); const MAX_REQUEST_TIMEOUT = 5000; diff --git a/packages/dashmate/src/status/scopes/core.js b/packages/dashmate/src/status/scopes/core.js index ebc0933af70..ae142461477 100644 --- a/packages/dashmate/src/status/scopes/core.js +++ b/packages/dashmate/src/status/scopes/core.js @@ -1,9 +1,9 @@ /* eslint-disable camelcase */ -const DockerStatusEnum = require('../../enums/dockerStatus'); +const DockerStatusEnum = require('../enums/dockerStatus'); const determineStatus = require('../determineStatus'); const providers = require('../providers'); const extractCoreVersion = require('../../core/extractCoreVersion'); -const ServiceStatusEnum = require('../../enums/serviceStatus'); +const ServiceStatusEnum = require('../enums/serviceStatus'); const ServiceIsNotRunningError = require('../../docker/errors/ServiceIsNotRunningError'); /** diff --git a/packages/dashmate/src/status/scopes/masternode.js b/packages/dashmate/src/status/scopes/masternode.js index 7d3ab112e4d..e17de8d7380 100644 --- a/packages/dashmate/src/status/scopes/masternode.js +++ b/packages/dashmate/src/status/scopes/masternode.js @@ -1,7 +1,7 @@ const calculatePaymentQueuePosition = require('../../core/calculatePaymentQueuePosition'); const blocksToTime = require('../../util/blocksToTime'); -const MasternodeStateEnum = require('../../enums/masternodeState'); -const MasternodeSyncAssetEnum = require('../../enums/masternodeSyncAsset'); +const MasternodeStateEnum = require('../enums/masternodeState'); +const MasternodeSyncAssetEnum = require('../enums/masternodeSyncAsset'); /** * @returns {getMasternodeScopeFactory} diff --git a/packages/dashmate/src/status/scopes/platform.js b/packages/dashmate/src/status/scopes/platform.js index 6e1b596136c..35365ae18ea 100644 --- a/packages/dashmate/src/status/scopes/platform.js +++ b/packages/dashmate/src/status/scopes/platform.js @@ -1,6 +1,6 @@ const fetch = require('node-fetch'); const determineStatus = require('../determineStatus'); -const ServiceStatusEnum = require('../../enums/serviceStatus'); +const ServiceStatusEnum = require('../enums/serviceStatus'); const providers = require('../providers'); /** diff --git a/packages/dashmate/src/tenderdash/createTenderdashNodeId.js b/packages/dashmate/src/tenderdash/createTenderdashNodeId.js new file mode 100644 index 00000000000..293831a297f --- /dev/null +++ b/packages/dashmate/src/tenderdash/createTenderdashNodeId.js @@ -0,0 +1,19 @@ +const crypto = require('crypto'); + +/** + * @typedef createTenderdashNodeId + * @param {string} nodeKey + * @returns {string} + */ +function createTenderdashNodeId(nodeKey) { + const nodeKeyBuffer = Buffer.from(nodeKey, 'base64'); + + const publicKey = nodeKeyBuffer.slice(32); + + return crypto.createHash('sha256') + .update(publicKey) + .digest('hex') + .slice(0, 40); +} + +module.exports = createTenderdashNodeId; diff --git a/packages/dashmate/src/tenderdash/generateTenderdashNodeKey.js b/packages/dashmate/src/tenderdash/generateTenderdashNodeKey.js new file mode 100644 index 00000000000..e4beae67c9d --- /dev/null +++ b/packages/dashmate/src/tenderdash/generateTenderdashNodeKey.js @@ -0,0 +1,27 @@ +const crypto = require('crypto'); + +/** + * @typedef generateTenderdashNodeKey + * @returns {string} + */ +function generateTenderdashNodeKey() { + const { + privateKey, + publicKey, + } = crypto.generateKeyPairSync('ed25519', { + publicKeyEncoding: { + type: 'spki', + format: 'der', + }, + privateKeyEncoding: { + type: 'pkcs8', + format: 'der', + }, + }); + + const nodeKey = Buffer.concat([privateKey.slice(16), publicKey.slice(12)]); + + return nodeKey.toString('base64'); +} + +module.exports = generateTenderdashNodeKey; diff --git a/packages/dashmate/src/tenderdash/generateTenderdashNodeKeyAndId.js b/packages/dashmate/src/tenderdash/generateTenderdashNodeKeyAndId.js deleted file mode 100644 index 131a1dba2fb..00000000000 --- a/packages/dashmate/src/tenderdash/generateTenderdashNodeKeyAndId.js +++ /dev/null @@ -1,38 +0,0 @@ -const { derivePath, getPublicKey } = require('ed25519-hd-key'); - -const crypto = require('crypto'); - -/** - * @typedef generateTenderdashNodeKeyAndId - * @returns {{ - * privateKey: Buffer, - * publicKey: Buffer, - * key: string, - * id: string, - * }} - */ -function generateTenderdashNodeKeyAndId() { - const derivationPath = "m/9'/5'/3'/4'/0'"; - - const seed = crypto.randomBytes(25); - - const { key: privateKey } = derivePath(derivationPath, seed.toString('hex')); - - const publicKey = getPublicKey(privateKey).slice(1); - - const key = Buffer.concat([privateKey, publicKey]); - - const id = crypto.createHash('sha256') - .update(publicKey) - .digest('hex') - .slice(0, 40); - - return { - privateKey, - publicKey, - key: key.toString('base64'), - id, - }; -} - -module.exports = generateTenderdashNodeKeyAndId; diff --git a/packages/dashmate/test/unit/status/colors.spec.js b/packages/dashmate/test/unit/status/colors.spec.js index b3c51342f2a..20b613e4b72 100644 --- a/packages/dashmate/test/unit/status/colors.spec.js +++ b/packages/dashmate/test/unit/status/colors.spec.js @@ -1,7 +1,7 @@ const chalk = require('chalk'); const colors = require('../../../src/status/colors'); -const ServiceStatusEnum = require('../../../src/enums/serviceStatus'); -const DockerStatusEnum = require('../../../src/enums/dockerStatus'); +const ServiceStatusEnum = require('../../../src/status/enums/serviceStatus'); +const DockerStatusEnum = require('../../../src/status/enums/dockerStatus'); describe('colors.js', () => { describe('#portState', () => { diff --git a/packages/dashmate/test/unit/status/determineStatus.spec.js b/packages/dashmate/test/unit/status/determineStatus.spec.js index c9f43b307a3..f293eae0c87 100644 --- a/packages/dashmate/test/unit/status/determineStatus.spec.js +++ b/packages/dashmate/test/unit/status/determineStatus.spec.js @@ -1,6 +1,6 @@ -const MasternodeSyncAssetEnum = require('../../../src/enums/masternodeSyncAsset'); -const ServiceStatusEnum = require('../../../src/enums/serviceStatus'); -const DockerStatusEnum = require('../../../src/enums/dockerStatus'); +const MasternodeSyncAssetEnum = require('../../../src/status/enums/masternodeSyncAsset'); +const ServiceStatusEnum = require('../../../src/status/enums/serviceStatus'); +const DockerStatusEnum = require('../../../src/status/enums/dockerStatus'); const determineStatus = require('../../../src/status/determineStatus'); describe('determineStatus', () => { diff --git a/packages/dashmate/test/unit/status/scopes/core.spec.js b/packages/dashmate/test/unit/status/scopes/core.spec.js index c073e7d2a25..b1a1a85025f 100644 --- a/packages/dashmate/test/unit/status/scopes/core.spec.js +++ b/packages/dashmate/test/unit/status/scopes/core.spec.js @@ -1,6 +1,6 @@ -const MasternodeSyncAssetEnum = require('../../../../src/enums/masternodeSyncAsset'); -const ServiceStatusEnum = require('../../../../src/enums/serviceStatus'); -const DockerStatusEnum = require('../../../../src/enums/dockerStatus'); +const MasternodeSyncAssetEnum = require('../../../../src/status/enums/masternodeSyncAsset'); +const ServiceStatusEnum = require('../../../../src/status/enums/serviceStatus'); +const DockerStatusEnum = require('../../../../src/status/enums/dockerStatus'); const getCoreScopeFactory = require('../../../../src/status/scopes/core'); const determineStatus = require('../../../../src/status/determineStatus'); const providers = require('../../../../src/status/providers'); diff --git a/packages/dashmate/test/unit/status/scopes/masternode.spec.js b/packages/dashmate/test/unit/status/scopes/masternode.spec.js index 7bc60c269f9..8d6d1bd7c04 100644 --- a/packages/dashmate/test/unit/status/scopes/masternode.spec.js +++ b/packages/dashmate/test/unit/status/scopes/masternode.spec.js @@ -1,6 +1,6 @@ -const MasternodeSyncAssetEnum = require('../../../../src/enums/masternodeSyncAsset'); +const MasternodeSyncAssetEnum = require('../../../../src/status/enums/masternodeSyncAsset'); const getMasternodeScopeFactory = require('../../../../src/status/scopes/masternode'); -const MasternodeStateEnum = require('../../../../src/enums/masternodeState'); +const MasternodeStateEnum = require('../../../../src/status/enums/masternodeState'); describe('getMasternodeScopeFactory', () => { describe('#getMasternodeScope', () => { diff --git a/packages/dashmate/test/unit/status/scopes/overview.spec.js b/packages/dashmate/test/unit/status/scopes/overview.spec.js index df9435eef1f..6ab496027d1 100644 --- a/packages/dashmate/test/unit/status/scopes/overview.spec.js +++ b/packages/dashmate/test/unit/status/scopes/overview.spec.js @@ -1,7 +1,7 @@ const getOverviewScopeFactory = require('../../../../src/status/scopes/overview'); -const MasternodeStateEnum = require('../../../../src/enums/masternodeState'); -const DockerStatusEnum = require('../../../../src/enums/dockerStatus'); -const ServiceStatusEnum = require('../../../../src/enums/serviceStatus'); +const MasternodeStateEnum = require('../../../../src/status/enums/masternodeState'); +const DockerStatusEnum = require('../../../../src/status/enums/dockerStatus'); +const ServiceStatusEnum = require('../../../../src/status/enums/serviceStatus'); describe('getOverviewScopeFactory', () => { describe('#getOverviewScope', () => { diff --git a/packages/dashmate/test/unit/status/scopes/platform.spec.js b/packages/dashmate/test/unit/status/scopes/platform.spec.js index 95bbd1589c8..d3a272292ed 100644 --- a/packages/dashmate/test/unit/status/scopes/platform.spec.js +++ b/packages/dashmate/test/unit/status/scopes/platform.spec.js @@ -4,9 +4,9 @@ const { FetchError } = fetch; const getPlatformScopeFactory = require('../../../../src/status/scopes/platform'); const determineStatus = require('../../../../src/status/determineStatus'); -const DockerStatusEnum = require('../../../../src/enums/dockerStatus'); +const DockerStatusEnum = require('../../../../src/status/enums/dockerStatus'); const providers = require('../../../../src/status/providers'); -const ServiceStatusEnum = require('../../../../src/enums/serviceStatus'); +const ServiceStatusEnum = require('../../../../src/status/enums/serviceStatus'); describe('getPlatformScopeFactory', () => { describe('#getPlatformScope', () => { diff --git a/yarn.lock b/yarn.lock index 667da63f935..71caa25b51f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2963,14 +2963,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*": - version: 0.0.50 - resolution: "@types/estree@npm:0.0.50" - checksum: 9a2b6a4a8c117f34d08fbda5e8f69b1dfb109f7d149b60b00fd7a9fb6ac545c078bc590aa4ec2f0a256d680cf72c88b3b28b60c326ee38a7bc8ee1ee95624922 - languageName: node - linkType: hard - -"@types/estree@npm:^0.0.51": +"@types/estree@npm:*, @types/estree@npm:^0.0.51": version: 0.0.51 resolution: "@types/estree@npm:0.0.51" checksum: e56a3bcf759fd9185e992e7fdb3c6a5f81e8ff120e871641607581fb3728d16c811702a7d40fa5f869b7f7b4437ab6a87eb8d98ffafeee51e85bbe955932a189 @@ -3036,14 +3029,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8": - version: 7.0.9 - resolution: "@types/json-schema@npm:7.0.9" - checksum: 259d0e25f11a21ba5c708f7ea47196bd396e379fddb79c76f9f4f62c945879dc21657904914313ec2754e443c5018ea8372362f323f30e0792897fdb2098a705 - languageName: node - linkType: hard - -"@types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.11 resolution: "@types/json-schema@npm:7.0.11" checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d @@ -3690,16 +3676,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.6.0": - version: 8.6.0 - resolution: "acorn@npm:8.6.0" - bin: - acorn: bin/acorn - checksum: 9d0de73b73cb6ea8ccd8263a8144d9e2c4b6af90ea0c429997538af0ebbe83c5addecee814b2a7f91f7f615d0bd1547cc7137b3fa236ce058adc64feccee850b - languageName: node - linkType: hard - -"acorn@npm:^8.7.1": +"acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.6.0, acorn@npm:^8.7.1": version: 8.8.2 resolution: "acorn@npm:8.8.2" bin: @@ -4341,6 +4318,13 @@ __metadata: languageName: node linkType: hard +"base-x@npm:^4.0.0": + version: 4.0.0 + resolution: "base-x@npm:4.0.0" + checksum: b25db9e07eb1998472a20557c7f00c797dc0595f79df95155ab74274e7fa98b9f2659b3ee547ac8773666b7f69540656793aeb97ad2b1ceccdb6fa5faaf69ac0 + languageName: node + linkType: hard + "base64-js@npm:^1.0.2, base64-js@npm:^1.3.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" @@ -4664,6 +4648,15 @@ __metadata: languageName: node linkType: hard +"bs58@npm:^5.0.0": + version: 5.0.0 + resolution: "bs58@npm:5.0.0" + dependencies: + base-x: ^4.0.0 + checksum: 2475cb0684e07077521aac718e604a13e0f891d58cff923d437a2f7e9e28703ab39fce9f84c7c703ab369815a675f11e3bd394d38643bfe8969fbe42e6833d45 + languageName: node + linkType: hard + "bson@npm:^1.1.4": version: 1.1.6 resolution: "bson@npm:1.1.6" @@ -5342,14 +5335,7 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^2.0.14": - version: 2.0.16 - resolution: "colorette@npm:2.0.16" - checksum: cd55596a3a2d1071c1a28eee7fd8a5387593ff1bd10a3e8d0a6221499311fe34a9f2b9272d77c391e0e003dcdc8934fb2f8d106e7ef1f7516f8060c901d41a27 - languageName: node - linkType: hard - -"colorette@npm:^2.0.19": +"colorette@npm:^2.0.14, colorette@npm:^2.0.19": version: 2.0.19 resolution: "colorette@npm:2.0.19" checksum: 888cf5493f781e5fcf54ce4d49e9d7d698f96ea2b2ef67906834bb319a392c667f9ec69f4a10e268d2946d13a9503d2d19b3abaaaf174e3451bfe91fb9d82427 @@ -6006,6 +5992,7 @@ __metadata: ajv-formats: ^2.1.1 awilix: ^4.2.6 begoo: ^2.0.2 + bs58: ^5.0.0 chai: ^4.3.4 chai-as-promised: ^7.1.1 chalk: ^4.1.0 @@ -6239,16 +6226,7 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.1.3": - version: 1.1.3 - resolution: "define-properties@npm:1.1.3" - dependencies: - object-keys: ^1.0.12 - checksum: da80dba55d0cd76a5a7ab71ef6ea0ebcb7b941f803793e4e0257b384cb772038faa0c31659d244e82c4342edef841c1a1212580006a05a5068ee48223d787317 - languageName: node - linkType: hard - -"define-properties@npm:^1.1.4": +"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4": version: 1.2.0 resolution: "define-properties@npm:1.2.0" dependencies: @@ -6724,35 +6702,7 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.18.5, es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1": - version: 1.19.1 - resolution: "es-abstract@npm:1.19.1" - dependencies: - call-bind: ^1.0.2 - es-to-primitive: ^1.2.1 - function-bind: ^1.1.1 - get-intrinsic: ^1.1.1 - get-symbol-description: ^1.0.0 - has: ^1.0.3 - has-symbols: ^1.0.2 - internal-slot: ^1.0.3 - is-callable: ^1.2.4 - is-negative-zero: ^2.0.1 - is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.1 - is-string: ^1.0.7 - is-weakref: ^1.0.1 - object-inspect: ^1.11.0 - object-keys: ^1.1.1 - object.assign: ^4.1.2 - string.prototype.trimend: ^1.0.4 - string.prototype.trimstart: ^1.0.4 - unbox-primitive: ^1.0.1 - checksum: b6be8410672c5364db3fb01eb786e30c7b4bb32b4af63d381c08840f4382c4a168e7855cd338bf59d4f1a1a1138f4d748d1fd40ec65aaa071876f9e9fbfed949 - languageName: node - linkType: hard - -"es-abstract@npm:^1.20.4": +"es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1, es-abstract@npm:^1.20.4": version: 1.21.2 resolution: "es-abstract@npm:1.21.2" dependencies: @@ -7051,14 +7001,7 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.1.0": - version: 3.1.0 - resolution: "eslint-visitor-keys@npm:3.1.0" - checksum: fd2d613bb315bc549068ca97771d868437fb60c8f13ef8d6d54669773ff53f814b759fa9e57966f15e4c50a5f5e11c6ba47060b8f201f9776311f6c5d5c11b70 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.3.0": +"eslint-visitor-keys@npm:^3.1.0, eslint-visitor-keys@npm:^3.3.0": version: 3.3.0 resolution: "eslint-visitor-keys@npm:3.3.0" checksum: d59e68a7c5a6d0146526b0eec16ce87fbf97fe46b8281e0d41384224375c4e52f5ffb9e16d48f4ea50785cde93f766b0c898e31ab89978d88b0e1720fbfb7808 @@ -7597,7 +7540,7 @@ __metadata: languageName: node linkType: hard -"foreach@npm:^2.0.4, foreach@npm:^2.0.5": +"foreach@npm:^2.0.4": version: 2.0.5 resolution: "foreach@npm:2.0.5" checksum: dab4fbfef0b40b69ee5eab81bcb9626b8fa8b3469c8cfa26480f3e5e1ee08c40eae07048c9a967c65aeda26e774511ccc70b3f10a604c01753c6ef24361f0fc8 @@ -7797,18 +7740,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1": - version: 1.1.1 - resolution: "get-intrinsic@npm:1.1.1" - dependencies: - function-bind: ^1.1.1 - has: ^1.0.3 - has-symbols: ^1.0.1 - checksum: a9fe2ca8fa3f07f9b0d30fb202bcd01f3d9b9b6b732452e79c48e79f7d6d8d003af3f9e38514250e3553fdc83c61650851cb6870832ac89deaaceb08e3721a17 - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0": +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0": version: 1.2.0 resolution: "get-intrinsic@npm:1.2.0" dependencies: @@ -8171,14 +8103,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"has-bigints@npm:^1.0.1": - version: 1.0.1 - resolution: "has-bigints@npm:1.0.1" - checksum: 44ab55868174470065d2e0f8f6def1c990d12b82162a8803c679699fa8a39f966e336f2a33c185092fe8aea7e8bf2e85f1c26add5f29d98f2318bd270096b183 - languageName: node - linkType: hard - -"has-bigints@npm:^1.0.2": +"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": version: 1.0.2 resolution: "has-bigints@npm:1.0.2" checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b @@ -8215,14 +8140,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2": - version: 1.0.2 - resolution: "has-symbols@npm:1.0.2" - checksum: 2309c426071731be792b5be43b3da6fb4ed7cbe8a9a6bcfca1862587709f01b33d575ce8f5c264c1eaad09fca2f9a8208c0a2be156232629daa2dd0c0740976b - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.3": +"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": version: 1.0.3 resolution: "has-symbols@npm:1.0.3" checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 @@ -8675,17 +8593,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"internal-slot@npm:^1.0.3": - version: 1.0.3 - resolution: "internal-slot@npm:1.0.3" - dependencies: - get-intrinsic: ^1.1.0 - has: ^1.0.3 - side-channel: ^1.0.4 - checksum: 1944f92e981e47aebc98a88ff0db579fd90543d937806104d0b96557b10c1f170c51fb777b97740a8b6ddeec585fca8c39ae99fd08a8e058dfc8ab70937238bf - languageName: node - linkType: hard - "internal-slot@npm:^1.0.5": version: 1.0.5 resolution: "internal-slot@npm:1.0.5" @@ -8788,20 +8695,13 @@ fsevents@~2.3.2: languageName: node linkType: hard -"is-callable@npm:^1.1.3, is-callable@npm:^1.2.7": +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac languageName: node linkType: hard -"is-callable@npm:^1.1.4, is-callable@npm:^1.2.4": - version: 1.2.4 - resolution: "is-callable@npm:1.2.4" - checksum: 1a28d57dc435797dae04b173b65d6d1e77d4f16276e9eff973f994eadcfdc30a017e6a597f092752a083c1103cceb56c91e3dadc6692fedb9898dfaba701575f - languageName: node - linkType: hard - "is-core-module@npm:^2.5.0, is-core-module@npm:^2.8.0, is-core-module@npm:^2.8.1": version: 2.8.1 resolution: "is-core-module@npm:2.8.1" @@ -8910,13 +8810,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.1": - version: 2.0.1 - resolution: "is-negative-zero@npm:2.0.1" - checksum: a46f2e0cb5e16fdb8f2011ed488979386d7e68d381966682e3f4c98fc126efe47f26827912baca2d06a02a644aee458b9cba307fb389f6b161e759125db7a3b8 - languageName: node - linkType: hard - "is-negative-zero@npm:^2.0.2": version: 2.0.2 resolution: "is-negative-zero@npm:2.0.2" @@ -9003,13 +8896,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.1": - version: 1.0.1 - resolution: "is-shared-array-buffer@npm:1.0.1" - checksum: 2ffb92533e64e2876e6cfe6906871d28400b6f1a53130fe652ec8007bc0e5044d05e7af8e31bdc992fbba520bd92938cfbeedd0f286be92f250c7c76191c4d90 - languageName: node - linkType: hard - "is-shared-array-buffer@npm:^1.0.2": version: 1.0.2 resolution: "is-shared-array-buffer@npm:1.0.2" @@ -9053,7 +8939,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.9": +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.3, is-typed-array@npm:^1.1.9": version: 1.1.10 resolution: "is-typed-array@npm:1.1.10" dependencies: @@ -9066,19 +8952,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"is-typed-array@npm:^1.1.3, is-typed-array@npm:^1.1.7": - version: 1.1.8 - resolution: "is-typed-array@npm:1.1.8" - dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - es-abstract: ^1.18.5 - foreach: ^2.0.5 - has-tostringtag: ^1.0.0 - checksum: aa0f9f0716e19e2fb8aef69e69e4205479d25ace778e2339fc910948115cde4b0d9aff9d5d1e8b80f09a5664998278e05e54ad3dc9cb12cefcf86db71084ed00 - languageName: node - linkType: hard - "is-typedarray@npm:^1.0.0": version: 1.0.0 resolution: "is-typedarray@npm:1.0.0" @@ -9100,15 +8973,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"is-weakref@npm:^1.0.1": - version: 1.0.1 - resolution: "is-weakref@npm:1.0.1" - dependencies: - call-bind: ^1.0.0 - checksum: fdafb7b955671dd2f9658ff47c86e4025c0650fc68a3542a40e5a75898a763b1abd6b1e1f9f13207eed49541cdd76af67d73c44989ea358b201b70274cf8f6c1 - languageName: node - linkType: hard - "is-weakref@npm:^1.0.2": version: 1.0.2 resolution: "is-weakref@npm:1.0.2" @@ -11371,14 +11235,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"object-inspect@npm:^1.11.0, object-inspect@npm:^1.9.0": - version: 1.11.0 - resolution: "object-inspect@npm:1.11.0" - checksum: 8c64f89ce3a7b96b6925879ad5f6af71d498abc217e136660efecd97452991216f375a7eb47cb1cb50643df939bf0c7cc391567b7abc6a924d04679705e58e27 - languageName: node - linkType: hard - -"object-inspect@npm:^1.12.3": +"object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0": version: 1.12.3 resolution: "object-inspect@npm:1.12.3" checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db @@ -11395,7 +11252,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"object-keys@npm:^1.0.12, object-keys@npm:^1.1.1": +"object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a @@ -11409,19 +11266,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"object.assign@npm:^4.1.0, object.assign@npm:^4.1.2": - version: 4.1.2 - resolution: "object.assign@npm:4.1.2" - dependencies: - call-bind: ^1.0.0 - define-properties: ^1.1.3 - has-symbols: ^1.0.1 - object-keys: ^1.1.1 - checksum: d621d832ed7b16ac74027adb87196804a500d80d9aca536fccb7ba48d33a7e9306a75f94c1d29cbfa324bc091bfc530bc24789568efdaee6a47fcfa298993814 - languageName: node - linkType: hard - -"object.assign@npm:^4.1.4": +"object.assign@npm:^4.1.0, object.assign@npm:^4.1.2, object.assign@npm:^4.1.4": version: 4.1.4 resolution: "object.assign@npm:4.1.4" dependencies: @@ -11433,18 +11278,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"object.entries@npm:^1.1.2": - version: 1.1.5 - resolution: "object.entries@npm:1.1.5" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.1 - checksum: d658696f74fd222060d8428d2a9fda2ce736b700cb06f6bdf4a16a1892d145afb746f453502b2fa55d1dca8ead6f14ddbcf66c545df45adadea757a6c4cd86c7 - languageName: node - linkType: hard - -"object.entries@npm:^1.1.5": +"object.entries@npm:^1.1.2, object.entries@npm:^1.1.5": version: 1.1.6 resolution: "object.entries@npm:1.1.6" dependencies: @@ -13722,16 +13556,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.4": - version: 1.0.4 - resolution: "string.prototype.trimend@npm:1.0.4" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - checksum: 17e5aa45c3983f582693161f972c1c1fa4bbbdf22e70e582b00c91b6575f01680dc34e83005b98e31abe4d5d29e0b21fcc24690239c106c7b2315aade6a898ac - languageName: node - linkType: hard - "string.prototype.trimend@npm:^1.0.6": version: 1.0.6 resolution: "string.prototype.trimend@npm:1.0.6" @@ -13743,16 +13567,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.4": - version: 1.0.4 - resolution: "string.prototype.trimstart@npm:1.0.4" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - checksum: 3fb06818d3cccac5fa3f5f9873d984794ca0e9f6616fae6fcc745885d9efed4e17fe15f832515d9af5e16c279857fdbffdfc489ca4ed577811b017721b30302f - languageName: node - linkType: hard - "string.prototype.trimstart@npm:^1.0.6": version: 1.0.6 resolution: "string.prototype.trimstart@npm:1.0.6" @@ -14678,18 +14492,6 @@ typescript@^3.9.5: languageName: node linkType: hard -"unbox-primitive@npm:^1.0.1": - version: 1.0.1 - resolution: "unbox-primitive@npm:1.0.1" - dependencies: - function-bind: ^1.1.1 - has-bigints: ^1.0.1 - has-symbols: ^1.0.2 - which-boxed-primitive: ^1.0.2 - checksum: 89d950e18fb45672bc6b3c961f1e72c07beb9640c7ceed847b571ba6f7d2af570ae1a2584cfee268b9d9ea1e3293f7e33e0bc29eaeb9f8e8a0bab057ff9e6bba - languageName: node - linkType: hard - "unbox-primitive@npm:^1.0.2": version: 1.0.2 resolution: "unbox-primitive@npm:1.0.2" @@ -15172,21 +14974,7 @@ typescript@^3.9.5: languageName: node linkType: hard -"which-typed-array@npm:^1.1.2": - version: 1.1.7 - resolution: "which-typed-array@npm:1.1.7" - dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - es-abstract: ^1.18.5 - foreach: ^2.0.5 - has-tostringtag: ^1.0.0 - is-typed-array: ^1.1.7 - checksum: 147837cf5866e36b6b2e427731709e02f79f1578477cbde68ed773a5307520a6cb6836c73c79c30690a473266ee59010b83b6d9b25d8d677a40ff77fb37a8a84 - languageName: node - linkType: hard - -"which-typed-array@npm:^1.1.9": +"which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": version: 1.1.9 resolution: "which-typed-array@npm:1.1.9" dependencies: From c06477cfc5d7b10c8a1c04d8e453591c1e37e3b5 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 21 Mar 2023 21:24:52 +0800 Subject: [PATCH 09/93] chore(drive): register masternode --- .../base-x-npm-4.0.0-64a1f6fa5e-b25db9e07e.zip | Bin 0 -> 5124 bytes .../bs58-npm-5.0.0-da02537b92-2475cb0684.zip | Bin 0 -> 4045 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 .yarn/cache/base-x-npm-4.0.0-64a1f6fa5e-b25db9e07e.zip create mode 100644 .yarn/cache/bs58-npm-5.0.0-da02537b92-2475cb0684.zip diff --git a/.yarn/cache/base-x-npm-4.0.0-64a1f6fa5e-b25db9e07e.zip b/.yarn/cache/base-x-npm-4.0.0-64a1f6fa5e-b25db9e07e.zip new file mode 100644 index 0000000000000000000000000000000000000000..421971c98eeb081e44d7c5a2aeb5e1a7ab8ee76a GIT binary patch literal 5124 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 literal 0 HcmV?d00001 diff --git a/.yarn/cache/bs58-npm-5.0.0-da02537b92-2475cb0684.zip b/.yarn/cache/bs58-npm-5.0.0-da02537b92-2475cb0684.zip new file mode 100644 index 0000000000000000000000000000000000000000..783d4d4cc61c35d53948932adc351dd5e7036476 GIT binary patch literal 4045 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 literal 0 HcmV?d00001 From 5b0fd7f0d221ef549f7aa8c3a36398aa2fe9a734 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 21 Mar 2023 22:30:05 +0800 Subject: [PATCH 10/93] fix: register guide flow --- .../prompts/createIpAndPortsFormFactory.js | 1 + .../registerMasternodeGuideTaskFactory.js | 25 ++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/packages/dashmate/src/listr/prompts/createIpAndPortsFormFactory.js b/packages/dashmate/src/listr/prompts/createIpAndPortsFormFactory.js index b6e5073f1d4..674325acf16 100644 --- a/packages/dashmate/src/listr/prompts/createIpAndPortsFormFactory.js +++ b/packages/dashmate/src/listr/prompts/createIpAndPortsFormFactory.js @@ -36,6 +36,7 @@ function createIpAndPortsFormFactory() { // TODO: Ports shouldn't be equal and must not be busy // TODO: Validate that IP address is available from outside // TODO: Validate ports according to the current network + // TODO: We should take initial values from corresponding configs not from the base const fields = [ { diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index a25f48b7e6a..103e58722c2 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -304,8 +304,31 @@ function registerMasternodeGuideTaskFactory( isHPMN: ctx.nodeType === NODE_TYPE_HPMN, })); - const form = await task.prompt(prompts); + let form; + let confirmation; + do { + form = await task.prompt(prompts); + + confirmation = await task.prompt([ + { + type: 'toggle', + name: 'confirm', + header: chalk` You should run the command: + {bold.green dash-cli ${ctx.nodeType === NODE_TYPE_HPMN ? 'register_hpmn' : 'register'} + argument1 + argument2 + } + + Go with nope to come back to edit command\n`, + message: 'Have you registered a masternode successfully?', + enabled: 'Yep', + disabled: 'Nope', + }, + ]); + } while (!confirmation); + + // TODO: Store form information to the config console.dir(form); }, }, From 3fe10d344ddaa579c04566f37f687f45893c6944 Mon Sep 17 00:00:00 2001 From: strophy Date: Tue, 21 Mar 2023 22:31:18 +0800 Subject: [PATCH 11/93] chore: add more detailed messages to mn guide --- .../registerMasternodeGuideTaskFactory.js | 47 ++++++++++++------- .../setup/setupRegularPresetTaskFactory.js | 7 +-- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index a25f48b7e6a..1f2301fc301 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -63,14 +63,14 @@ function registerMasternodeGuideTaskFactory( const { PrivateKey: BlsPrivateKey, BasicSchemeMPL } = blsSignatures; const REGISTRARS = { - CORE: 'dashDesktop', + CORE: 'dashCore', ANDROID: 'dashAndroid', IOS: 'dashIOS', OTHER: 'other', }; const registrarList = [ - { name: REGISTRARS.CORE, message: 'Desktop Dash Wallet' }, + { name: REGISTRARS.CORE, message: 'Dash Core Wallet' }, { name: REGISTRARS.ANDROID, message: 'Android Dash Wallet' }, { name: REGISTRARS.IOS, message: 'iOS Dash Wallet' }, { name: REGISTRARS.OTHER, message: 'Other' }, @@ -164,11 +164,10 @@ function registerMasternodeGuideTaskFactory( type: 'select', header: 'For security reasons, Dash masternodes should never store masternode owner' + ' or collateral private keys. Dashmate therefore cannot register a masternode for' - + ' you directly. Instead, we will generate RPC commands that you can use in ' - + ' Desktop Dash Wallet (Dash Core)' - + ' or other external tools where the keys are handled securely. During this' + + ' you directly. Instead, we will generate RPC commands that you can use in' + + ' Dash Core or other external tools where keys are handled securely. During this' + ' process, dashmate can optionally generate configuration elements as necessary,' - + ' such the BLS operator key and the node id, since this is the' + + ' such as the BLS operator key and the node id, since this is the' + ' only information necessary for dashmate to configure the masternode.\n', message: 'Which wallet will you use to store keys for your masternode?', choices: registrarList, @@ -210,8 +209,10 @@ function registerMasternodeGuideTaskFactory( { type: 'form', name: 'collateral', - header: 'Help user with collateral \n', - message: 'Enter collateral information:', + header: 'Dashmate needs to collect details about your collateral funding' + + ' transaction. The funding value must be exactly 1000 DASH (masternode)' + + ' or 4000 DASH (high-performance masternode).\n', + message: 'Enter collateral funding transaction information:', choices: [ { name: 'txId', @@ -230,8 +231,10 @@ function registerMasternodeGuideTaskFactory( { type: 'form', name: 'keys', - header: 'Help user with these keys \n', - message: 'Enter masternode addresses:', + header: 'Dashmate needs to collect details about the owner, voting and payout' + + ' addresses to use in the masternode registration transaction. These are' + + ' regular Dash addresses, encoded in HEX format.\n', + message: 'Enter DIP3 masternode addresses:', choices: [ { name: 'ownerAddress', @@ -254,7 +257,7 @@ function registerMasternodeGuideTaskFactory( ], validate: ({ ownerAddress, votingAddress, payoutAddress }) => { if (ownerAddress === payoutAddress || votingAddress === payoutAddress) { - return 'you should use different payout address'; + return 'The payout address may not be the same as the owner or voting address'; } return validateAddressHexWithNetwork(ownerAddress) @@ -265,18 +268,23 @@ function registerMasternodeGuideTaskFactory( { type: 'form', name: 'operator', - header: 'Explain options with operator key and explain operator rewards\n', - message: 'Please provide the following information:', + header: 'Dashmate needs to collect details on the operator key and operator' + + ' reward share to use in the registration transaction. The operator key is' + + ' a BLS private key, encoded in HEX format. Dashmate will record the private' + + ' key in the masternode configuration, and derive the public key for use in' + + ' the masternode registration transaction. You may optionally also specify a' + + ' percentage share of the masternode reward to pay to the operator.\n', + message: 'Enter masternode operator private key and reward share:', choices: [ { name: 'privateKey', - message: chalk`BLS private key HEX encoded`, + message: chalk`BLS private key {gray HEX encoded}`, initial: initialOperatorPrivateKey, validate: validateBLSPrivateKey, }, { name: 'rewardShare', - message: chalk`Reward shares %`, + message: chalk`Reward share %`, initial: '0.00', validate: validateRewardShare, format: formatRewardShares, @@ -292,9 +300,12 @@ function registerMasternodeGuideTaskFactory( prompts.push({ type: 'input', name: 'platformNodeKey', - header: 'Platform node ED25519 key. What\'s that. Must be base64 tendermint' + - ' format\n', - message: 'Enter Node key Base64 encoded', + header: 'Dashmate needs to collect details on your Tenderdash node key. This key' + + ' is used to uniquely identify your high-performance masternode on Dash' + + ' Platform. The node key is derived from a standard Ed25519 cryptographic' + + ' key pair, presented in a cached format specific to Tenderdash. You can' + + ' provide a key, or a new key will be generated for you.\n', + message: 'Enter Ed25519 node key {gray Base64 encoded}', initial: generateTenderdashNodeKey(), validate: validateTenderdashNodeKey, }); diff --git a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js index 2ebb10d1aaa..80d0b513748 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js @@ -208,7 +208,7 @@ function setupRegularPresetTaskFactory( { type: 'input', header: 'Platform node key. Must be base64\n', - message: 'Enter ED25519 key', + message: 'Enter Tenderdash Ed25519 cached key', validate, }, ]); @@ -252,8 +252,9 @@ function setupRegularPresetTaskFactory( const form = await task.prompt([ { type: 'form', - header: 'The node external IP address must be static and will be used by the' - + ' network ..\n', + header: 'The masternode public static IPv4 address and port will be included' + + ' in the masternode registration transaction. Your masternode must provide' + + ' service to the network at this address, or it will eventually be banned.\n', message: 'Enter IP address and port:', choices: [ { From b294134776f00dbeb63a0a6bd6ddb01fcc1533d6 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 21 Mar 2023 22:38:19 +0800 Subject: [PATCH 12/93] chore: use hint --- .../tasks/setup/regular/registerMasternodeGuideTaskFactory.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index 103e58722c2..e5fa226cc5b 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -294,7 +294,8 @@ function registerMasternodeGuideTaskFactory( name: 'platformNodeKey', header: 'Platform node ED25519 key. What\'s that. Must be base64 tendermint' + ' format\n', - message: 'Enter Node key Base64 encoded', + message: 'Enter Node key', + hint: 'Base64 encoded', initial: generateTenderdashNodeKey(), validate: validateTenderdashNodeKey, }); From 99f0ee0d87c712e51e90e2b8642aa8ab8f76b40d Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 23 Mar 2023 00:21:17 +0800 Subject: [PATCH 13/93] feat: bring things together --- .pnp.cjs | 22 +- ...hd-key-npm-1.3.0-248db2e234-65dcf405f9.zip | Bin 4745 -> 0 bytes ...etnacl-npm-1.0.3-b7eef04660-e4a57cac18.zip | Bin 52158 -> 0 bytes package.json | 6 +- packages/dashmate/package.json | 4 +- packages/dashmate/src/commands/setup.js | 56 +-- packages/dashmate/src/commands/ssl/renew.js | 7 +- packages/dashmate/src/config/Config.js | 10 + .../src/config/configFile/ConfigFile.js | 9 + .../src/{ => config}/ensureHomeDirFactory.js | 6 +- packages/dashmate/src/constants.js | 8 +- packages/dashmate/src/createDIContainer.js | 16 +- .../{ => docker}/getConnectionHostFactory.js | 0 .../src/listr/prompts/createIpAndPortsForm.js | 90 ++++ .../prompts/createIpAndPortsFormFactory.js | 104 ----- .../prompts/createPlatformNodeKeyInput.js | 25 ++ .../prompts/formatters/formatPercentage.js | 25 ++ .../validateBLSPrivateKeyFactory.js | 31 ++ .../prompts/validators/validateFileExists.js | 11 + .../listr/prompts/validators/validateIPv4.js | 5 + .../prompts/validators/validatePercentage.js | 7 + .../listr/prompts/validators/validatePort.js | 9 + .../validators/validatePositiveInteger.js | 7 + .../listr/prompts/validators/validateTxHex.js | 5 + .../src/listr/tasks/setup/nodeTypes.js | 32 ++ .../setup/regular/configureNodeTaskFactory.js | 74 ++++ .../configureSSLCertificateTaskFactory.js | 111 +++++ .../registerMasternodeGuideTaskFactory.js | 242 +++-------- .../setup/setupRegularPresetTaskFactory.js | 404 +++--------------- scripts/configure.sh | 8 + scripts/configure_dashmate.sh | 4 - scripts/setup_local_network.sh | 7 +- yarn.lock | 21 +- 33 files changed, 603 insertions(+), 763 deletions(-) delete mode 100644 .yarn/cache/ed25519-hd-key-npm-1.3.0-248db2e234-65dcf405f9.zip delete mode 100644 .yarn/cache/tweetnacl-npm-1.0.3-b7eef04660-e4a57cac18.zip rename packages/dashmate/src/{ => config}/ensureHomeDirFactory.js (76%) rename packages/dashmate/src/{ => docker}/getConnectionHostFactory.js (100%) create mode 100644 packages/dashmate/src/listr/prompts/createIpAndPortsForm.js delete mode 100644 packages/dashmate/src/listr/prompts/createIpAndPortsFormFactory.js create mode 100644 packages/dashmate/src/listr/prompts/createPlatformNodeKeyInput.js create mode 100644 packages/dashmate/src/listr/prompts/formatters/formatPercentage.js create mode 100644 packages/dashmate/src/listr/prompts/validators/validateBLSPrivateKeyFactory.js create mode 100644 packages/dashmate/src/listr/prompts/validators/validateFileExists.js create mode 100644 packages/dashmate/src/listr/prompts/validators/validateIPv4.js create mode 100644 packages/dashmate/src/listr/prompts/validators/validatePercentage.js create mode 100644 packages/dashmate/src/listr/prompts/validators/validatePort.js create mode 100644 packages/dashmate/src/listr/prompts/validators/validatePositiveInteger.js create mode 100644 packages/dashmate/src/listr/prompts/validators/validateTxHex.js create mode 100644 packages/dashmate/src/listr/tasks/setup/nodeTypes.js create mode 100644 packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js create mode 100644 packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js create mode 100755 scripts/configure.sh diff --git a/.pnp.cjs b/.pnp.cjs index dfe0401dfbf..425d207a9ef 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -8045,7 +8045,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["dockerode", "npm:3.3.1"],\ ["dot", "npm:1.1.3"],\ ["dotenv", "npm:8.6.0"],\ - ["ed25519-hd-key", "npm:1.3.0"],\ ["enquirer", "npm:2.3.6"],\ ["eslint", "npm:7.32.0"],\ ["eslint-config-airbnb-base", "virtual:12a596dc9572e25ce715d3736dc74b317c5ca5cfb3b4f67864b1e76b3a401006f84d381aaf975bb5b4da9cafac5125e6869fc78d5202f4c95780c81479112f32#npm:14.2.1"],\ @@ -8071,8 +8070,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["semver", "npm:7.3.8"],\ ["sinon", "npm:11.1.2"],\ ["sinon-chai", "virtual:12a596dc9572e25ce715d3736dc74b317c5ca5cfb3b4f67864b1e76b3a401006f84d381aaf975bb5b4da9cafac5125e6869fc78d5202f4c95780c81479112f32#npm:3.7.0"],\ - ["table", "npm:5.4.6"],\ - ["yosay", "npm:2.0.2"]\ + ["table", "npm:5.4.6"]\ ],\ "linkType": "SOFT"\ }]\ @@ -8679,17 +8677,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["ed25519-hd-key", [\ - ["npm:1.3.0", {\ - "packageLocation": "./.yarn/cache/ed25519-hd-key-npm-1.3.0-248db2e234-65dcf405f9.zip/node_modules/ed25519-hd-key/",\ - "packageDependencies": [\ - ["ed25519-hd-key", "npm:1.3.0"],\ - ["create-hmac", "npm:1.1.7"],\ - ["tweetnacl", "npm:1.0.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["ee-first", [\ ["npm:1.1.1", {\ "packageLocation": "./.yarn/cache/ee-first-npm-1.1.1-33f8535b39-1b4cac778d.zip/node_modules/ee-first/",\ @@ -17944,13 +17931,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["tweetnacl", "npm:0.14.5"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:1.0.3", {\ - "packageLocation": "./.yarn/cache/tweetnacl-npm-1.0.3-b7eef04660-e4a57cac18.zip/node_modules/tweetnacl/",\ - "packageDependencies": [\ - ["tweetnacl", "npm:1.0.3"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["type-check", [\ diff --git a/.yarn/cache/ed25519-hd-key-npm-1.3.0-248db2e234-65dcf405f9.zip b/.yarn/cache/ed25519-hd-key-npm-1.3.0-248db2e234-65dcf405f9.zip deleted file mode 100644 index 78e55327ea7c173b54d524798513ef359bb5f717..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4745 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 diff --git a/.yarn/cache/tweetnacl-npm-1.0.3-b7eef04660-e4a57cac18.zip b/.yarn/cache/tweetnacl-npm-1.0.3-b7eef04660-e4a57cac18.zip deleted file mode 100644 index eb6ea706262a72d0831aece6d0d81d03effbd596..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52158 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 item !== 'selfSigned') }), - 'zerossl-apikey': Flags.string({ char: 'z', description: 'ZeroSSL API key', dependsOn: ['ssl-provider'] }), - 'ssl-certificate-file': Flags.string({ char: 'c', description: 'SSL certificate file path', dependsOn: ['ssl-provider'] }), - 'ssl-privatekey-file': Flags.string({ char: 'l', description: 'SSL certificate private key file path', dependsOn: ['ssl-provider'] }), verbose: Flags.boolean({ char: 'v', description: 'use verbose mode for output', default: false }), }; diff --git a/packages/dashmate/src/commands/ssl/renew.js b/packages/dashmate/src/commands/ssl/renew.js index 7e9871db016..45ccbdaeb5f 100644 --- a/packages/dashmate/src/commands/ssl/renew.js +++ b/packages/dashmate/src/commands/ssl/renew.js @@ -10,12 +10,7 @@ class RenewCommand extends ConfigBaseCommand { * @param {Object} args * @param {Object} flags * @param {Config} config - * @param {createCertificate} createCertificate - * @param {verifyDomain} verifyDomain - * @param {downloadCertificate} downloadCertificate - * @param {listCertificates} listCertificates - * @param {saveCertificateTask} saveCertificateTask - * @param {VerificationServer} verificationServer + * @param {renewZeroSSLCertificateTask} renewZeroSSLCertificateTask * @return {Promise} */ async runWithDependencies( diff --git a/packages/dashmate/src/config/Config.js b/packages/dashmate/src/config/Config.js index c5765751580..0044142d2a1 100644 --- a/packages/dashmate/src/config/Config.js +++ b/packages/dashmate/src/config/Config.js @@ -103,6 +103,16 @@ class Config { return this; } + /** + * Remove by path + * + * @param {string} path + * @returns {Config} + */ + remove(path) { + return this.set(path, undefined); + } + /** * Get options * diff --git a/packages/dashmate/src/config/configFile/ConfigFile.js b/packages/dashmate/src/config/configFile/ConfigFile.js index adab07151df..36848857806 100644 --- a/packages/dashmate/src/config/configFile/ConfigFile.js +++ b/packages/dashmate/src/config/configFile/ConfigFile.js @@ -205,6 +205,15 @@ class ConfigFile { return this; } + /** + * Set config + * + * @param {Config} config + */ + setConfig(config) { + this.configsMap[config.getName()] = config; + } + /** * Get config file as plain object * diff --git a/packages/dashmate/src/ensureHomeDirFactory.js b/packages/dashmate/src/config/ensureHomeDirFactory.js similarity index 76% rename from packages/dashmate/src/ensureHomeDirFactory.js rename to packages/dashmate/src/config/ensureHomeDirFactory.js index 4498073d640..3105209068f 100644 --- a/packages/dashmate/src/ensureHomeDirFactory.js +++ b/packages/dashmate/src/config/ensureHomeDirFactory.js @@ -1,9 +1,9 @@ const fs = require('fs'); -const CouldNotCreateHomeDirError = require('./config/errors/CouldNotCreateHomeDirError'); -const HomeDirIsNotWritableError = require('./config/errors/HomeDirIsNotWritableError'); +const CouldNotCreateHomeDirError = require('./errors/CouldNotCreateHomeDirError'); +const HomeDirIsNotWritableError = require('./errors/HomeDirIsNotWritableError'); -const { HOME_DIR_PATH } = require('./constants'); +const { HOME_DIR_PATH } = require('../constants'); /** * @return {ensureHomeDir} diff --git a/packages/dashmate/src/constants.js b/packages/dashmate/src/constants.js index da75c9b9ec2..919cdaac376 100644 --- a/packages/dashmate/src/constants.js +++ b/packages/dashmate/src/constants.js @@ -15,7 +15,6 @@ const presets = { }; const nodeTypes = { - NODE_TYPE_HPMN: 'hpmn', NODE_TYPE_MASTERNODE: 'masternode', NODE_TYPE_FULLNODE: 'fullnode', }; @@ -41,9 +40,9 @@ const OUTPUT_FORMATS = { PLAIN: 'plain', }; -const sslProviders = { +const SSL_PROVIDERS = { ZEROSSL: 'zerossl', - MANUL: 'manual', + FILE: 'file', SELF_SIGNED: 'selfSigned', }; @@ -62,5 +61,6 @@ module.exports = { HOME_DIR_PATH, CONFIG_FILE_PATH, OUTPUT_FORMATS, - SSL_PROVIDERS: Object.values(sslProviders), + SSL_PROVIDERS, + SSL_PROVIDERS_LIST: Object.values(SSL_PROVIDERS), }; diff --git a/packages/dashmate/src/createDIContainer.js b/packages/dashmate/src/createDIContainer.js index 0e92797fde3..dd6a4658098 100644 --- a/packages/dashmate/src/createDIContainer.js +++ b/packages/dashmate/src/createDIContainer.js @@ -8,8 +8,8 @@ const { const Docker = require('dockerode'); -const ensureHomeDirFactory = require('./ensureHomeDirFactory'); -const getConnectionHostFactory = require('./getConnectionHostFactory'); +const ensureHomeDirFactory = require('./config/ensureHomeDirFactory'); +const getConnectionHostFactory = require('./docker/getConnectionHostFactory'); const ConfigFileJsonRepository = require('./config/configFile/ConfigFileJsonRepository'); const createSystemConfigsFactory = require('./config/systemConfigs/createSystemConfigsFactory'); const isSystemConfigFactory = require('./config/systemConfigs/isSystemConfigFactory'); @@ -91,7 +91,8 @@ const createSelfSignedCertificate = require('./ssl/selfSigned/createCertificate' const scheduleRenewZeroSslCertificateFactory = require('./helper/scheduleRenewZeroSslCertificateFactory'); const generateTenderdashNodeKeyAndId = require('./tenderdash/createTenderdashNodeId'); const registerMasternodeGuideTaskFactory = require('./listr/tasks/setup/regular/registerMasternodeGuideTaskFactory'); -const createIpAndPortsFormFactory = require('./listr/prompts/createIpAndPortsFormFactory'); +const configureNodeTaskFactory = require('./listr/tasks/setup/regular/configureNodeTaskFactory'); +const configureSSLCertificateTaskFactory = require('./listr/tasks/setup/regular/configureSSLCertificateTaskFactory'); async function createDIContainer() { const container = createAwilixContainer({ @@ -228,13 +229,8 @@ async function createDIContainer() { getOverviewScope: asFunction(getOverviewScopeFactory).singleton(), getServicesScope: asFunction(getServicesScopeFactory).singleton(), getHostScope: asFunction(getHostScopeFactory).singleton(), - }); - - /** - * Prompts - */ - container.register({ - createIpAndPortsForm: asFunction(createIpAndPortsFormFactory).singleton(), + configureNodeTask: asFunction(configureNodeTaskFactory).singleton(), + configureSSLCertificateTask: asFunction(configureSSLCertificateTaskFactory).singleton(), }); /** diff --git a/packages/dashmate/src/getConnectionHostFactory.js b/packages/dashmate/src/docker/getConnectionHostFactory.js similarity index 100% rename from packages/dashmate/src/getConnectionHostFactory.js rename to packages/dashmate/src/docker/getConnectionHostFactory.js diff --git a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js new file mode 100644 index 00000000000..a0c64935ad4 --- /dev/null +++ b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js @@ -0,0 +1,90 @@ +const publicIp = require('public-ip'); + +const { base } = require('../../../configs/system'); +const validateIPv4 = require('./validators/validateIPv4'); +const validatePort = require('./validators/validatePort'); + +/** + * @typedef {createIpAndPortsForm} + * @param {Object} [options] + * @param {Object} [options.skipInitial=false] + * @param {Object} [options.isHPMN=false] + * @returns {Object} + */ +async function createIpAndPortsForm(options = {}) { + let initialIp; + if (!options.skipInitial) { + initialIp = await publicIp.v4(); + } + + let initialCoreP2PPort; + if (!options.skipInitial) { + initialCoreP2PPort = base.core.p2p.port.toString(); + } + + // TODO: Ports shouldn't be equal and must not be busy + // TODO: Validate that IP address is available from outside + // TODO: Validate ports according to the current network + // TODO: We should take initial values from corresponding configs not from the base + + const fields = [ + { + name: 'ip', + message: 'External IP address IPv4', + initial: initialIp, + validate: validateIPv4, + }, + { + name: 'coreP2PPort', + message: 'Core P2P Port', + initial: initialCoreP2PPort, + validate: validatePort, + }, + ]; + + if (options.isHPMN) { + let initialPlatformP2PPort; + if (!options.skipInitial) { + initialPlatformP2PPort = base.platform.drive.tenderdash.p2p.port.toString(); + } + + fields.push({ + name: 'platformP2PPort', + message: 'Platform P2P port', + initial: initialPlatformP2PPort, + validate: validatePort, + }); + + let initialPlatformHTTPPort; + if (!options.skipInitial) { + initialPlatformHTTPPort = base.platform.dapi.envoy.http.port.toString(); + } + + fields.push({ + name: 'platformHTTPPort', + message: 'Platform HTTP port', + initial: initialPlatformHTTPPort, + validate: validatePort, + }); + } + + return { + type: 'form', + name: 'ipAndPorts', + header: 'The node external IP address must be static and will be used by the ..' + + ' network ..\n', + message: 'Enter IP address and ports:', + choices: fields, + validate: ({ + ip, + coreP2PPort, + platformP2PPort, + platformHTTPPort, + }) => { + return validateIPv4(ip) && validatePort(coreP2PPort) + && (!options.isHPMN || (validatePort(platformP2PPort) && validatePort(platformHTTPPort))) + }, + }; +} + +module.exports = createIpAndPortsForm; diff --git a/packages/dashmate/src/listr/prompts/createIpAndPortsFormFactory.js b/packages/dashmate/src/listr/prompts/createIpAndPortsFormFactory.js deleted file mode 100644 index 674325acf16..00000000000 --- a/packages/dashmate/src/listr/prompts/createIpAndPortsFormFactory.js +++ /dev/null @@ -1,104 +0,0 @@ -const publicIp = require('public-ip'); - -const { base } = require('../../../configs/system'); - -function createIpAndPortsFormFactory() { - function validateIp(ip) { - return Boolean(ip.match(/^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$/)); - } - - function validatePort(port) { - const portNumber = Math.floor(Number(port)); - - return portNumber >= 1 - && portNumber <= 65535 - && portNumber.toString() === port; - } - - /** - * @typedef {createIpAndPortsForm} - * @param {Object} [options] - * @param {Object} [options.skipInitial=false] - * @param {Object} [options.isHPMN=false] - * @returns {Object} - */ - async function createIpAndPortsForm(options = {}) { - let initialIp; - if (!options.skipInitial) { - initialIp = await publicIp.v4(); - } - - let initialCoreP2PPort; - if (!options.skipInitial) { - initialCoreP2PPort = base.core.p2p.port.toString(); - } - - // TODO: Ports shouldn't be equal and must not be busy - // TODO: Validate that IP address is available from outside - // TODO: Validate ports according to the current network - // TODO: We should take initial values from corresponding configs not from the base - - const fields = [ - { - name: 'ip', - message: 'External IP address IPv4', - initial: initialIp, - validate: validateIp, - }, - { - name: 'coreP2PPort', - message: 'Core P2P Port', - initial: initialCoreP2PPort, - validate: validatePort, - }, - ]; - - if (options.isHPMN) { - let initialPlatformP2PPort; - if (!options.skipInitial) { - initialPlatformP2PPort = base.platform.drive.tenderdash.p2p.port.toString(); - } - - fields.push({ - name: 'platformP2PPort', - message: 'Platform P2P port', - initial: initialPlatformP2PPort, - validate: validatePort, - }); - - let initialPlatformHTTPPort; - if (!options.skipInitial) { - initialPlatformHTTPPort = base.platform.dapi.envoy.http.port.toString(); - } - - fields.push({ - name: 'platformHTTPPort', - message: 'Platform HTTP port', - initial: initialPlatformHTTPPort, - validate: validatePort, - }); - } - - return { - type: 'form', - name: 'ipAndPorts', - header: 'The node external IP address must be static and will be used by the ..' - + ' network ..\n', - message: 'Enter IP address and ports:', - choices: fields, - validate: ({ - ip, - coreP2PPort, - platformP2PPort, - platformHTTPPort, - }) => { - return validateIp(ip) && validatePort(coreP2PPort) - && (!options.isHPMN || (validatePort(platformP2PPort) && validatePort(platformHTTPPort))) - }, - }; - } - - return createIpAndPortsForm; -} - -module.exports = createIpAndPortsFormFactory; diff --git a/packages/dashmate/src/listr/prompts/createPlatformNodeKeyInput.js b/packages/dashmate/src/listr/prompts/createPlatformNodeKeyInput.js new file mode 100644 index 00000000000..a3ce6b09afb --- /dev/null +++ b/packages/dashmate/src/listr/prompts/createPlatformNodeKeyInput.js @@ -0,0 +1,25 @@ +const generateTenderdashNodeKey = require('../../tenderdash/generateTenderdashNodeKey'); +const validateTenderdashNodeKey = require('./validators/validateTenderdashNodeKey'); + +/** + * @param {Object} [options] + * @param {boolean} [options.skipInitial=false] + * @returns {Object} + */ +function createPlatformNodeKeyInput(options = {}) { + return { + type: 'input', + name: 'platformNodeKey', + header: 'Dashmate needs to collect details on your Tenderdash node key. This key' + + ' is used to uniquely identify your Dash Platform node. The node key is derived from a standard' + + ' Ed25519 cryptographic' + + ' key pair, presented in a cached format specific to Tenderdash. You can' + + ' provide a key, or a new key will be generated for you.\n', + message: 'Enter Ed25519 node key', + hint: 'Base64 encoded', + initial: options.skipInitial ? undefined : generateTenderdashNodeKey(), + validate: validateTenderdashNodeKey, + }; +} + +module.exports = createPlatformNodeKeyInput; diff --git a/packages/dashmate/src/listr/prompts/formatters/formatPercentage.js b/packages/dashmate/src/listr/prompts/formatters/formatPercentage.js new file mode 100644 index 00000000000..b01482d4f20 --- /dev/null +++ b/packages/dashmate/src/listr/prompts/formatters/formatPercentage.js @@ -0,0 +1,25 @@ +const placeholder = require('enquirer/lib/placeholder'); + +function formatPercentage(input, choice) { + let str; + + const number = Number(input); + if (Number.isNaN(number) || number.toFixed(2).length < input.length) { + str = input; + } else { + str = number.toFixed(2); + } + + const pos = Math.min(choice.cursor, str.length); + + const options = { + input: str, + initial: choice.initial, + pos, + showCursor: this.state.index === 1, + }; + + return placeholder(this, options); +} + +module.exports = formatPercentage; diff --git a/packages/dashmate/src/listr/prompts/validators/validateBLSPrivateKeyFactory.js b/packages/dashmate/src/listr/prompts/validators/validateBLSPrivateKeyFactory.js new file mode 100644 index 00000000000..fea48413120 --- /dev/null +++ b/packages/dashmate/src/listr/prompts/validators/validateBLSPrivateKeyFactory.js @@ -0,0 +1,31 @@ +function validateBLSPrivateKeyFactory(blsSignatures) { + /** + * @typedef validateBLSPrivateKey + * @param {string} value + * @returns {boolean|string} + */ + function validateBLSPrivateKey(value) { + if (value.length === 0) { + return 'should not be empty'; + } + + const operatorPrivateKeyBuffer = Buffer.from(value, 'hex'); + + let key; + try { + key = blsSignatures.PrivateKey.fromBytes(operatorPrivateKeyBuffer, true); + } catch (e) { + return 'invalid key'; + } finally { + if (key) { + key.delete(); + } + } + + return true; + } + + return validateBLSPrivateKey; +} + +module.exports = validateBLSPrivateKeyFactory; diff --git a/packages/dashmate/src/listr/prompts/validators/validateFileExists.js b/packages/dashmate/src/listr/prompts/validators/validateFileExists.js new file mode 100644 index 00000000000..aa54e79896f --- /dev/null +++ b/packages/dashmate/src/listr/prompts/validators/validateFileExists.js @@ -0,0 +1,11 @@ +const fs = require('fs'); + +function validateFileExists(value) { + if (fs.existsSync(value)) { + return true; + } + + return 'File doesn\'t exist'; +} + +module.exports = validateFileExists; diff --git a/packages/dashmate/src/listr/prompts/validators/validateIPv4.js b/packages/dashmate/src/listr/prompts/validators/validateIPv4.js new file mode 100644 index 00000000000..2d5fa49fccb --- /dev/null +++ b/packages/dashmate/src/listr/prompts/validators/validateIPv4.js @@ -0,0 +1,5 @@ +function validateIPv4(ip) { + return Boolean(ip.match(/^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$/)); +} + +module.exports = validateIPv4; diff --git a/packages/dashmate/src/listr/prompts/validators/validatePercentage.js b/packages/dashmate/src/listr/prompts/validators/validatePercentage.js new file mode 100644 index 00000000000..08f963a8c0d --- /dev/null +++ b/packages/dashmate/src/listr/prompts/validators/validatePercentage.js @@ -0,0 +1,7 @@ +function validatePercentage(value) { + const reminder = value.split('.')[1]; + + return Number(value) <= 100 && (!reminder || reminder.length <= 2); +} + +module.exports = validatePercentage; diff --git a/packages/dashmate/src/listr/prompts/validators/validatePort.js b/packages/dashmate/src/listr/prompts/validators/validatePort.js new file mode 100644 index 00000000000..1d20c62d5e9 --- /dev/null +++ b/packages/dashmate/src/listr/prompts/validators/validatePort.js @@ -0,0 +1,9 @@ +function validatePort(port) { + const portNumber = Math.floor(Number(port)); + + return portNumber >= 1 + && portNumber <= 65535 + && portNumber.toString() === port; +} + +module.exports = validatePort; diff --git a/packages/dashmate/src/listr/prompts/validators/validatePositiveInteger.js b/packages/dashmate/src/listr/prompts/validators/validatePositiveInteger.js new file mode 100644 index 00000000000..adb84ced8ab --- /dev/null +++ b/packages/dashmate/src/listr/prompts/validators/validatePositiveInteger.js @@ -0,0 +1,7 @@ +function validatePositiveInteger(value) { + const index = Math.floor(Number(value)); + + return index >= 0 && index.toString() === value; +} + +module.exports = validatePositiveInteger; diff --git a/packages/dashmate/src/listr/prompts/validators/validateTxHex.js b/packages/dashmate/src/listr/prompts/validators/validateTxHex.js new file mode 100644 index 00000000000..561a33de340 --- /dev/null +++ b/packages/dashmate/src/listr/prompts/validators/validateTxHex.js @@ -0,0 +1,5 @@ +function validateTxHex(value) { + return Boolean(value.match(/$[0-9A-Fa-f]{64}^/)); +} + +module.exports = validateTxHex; diff --git a/packages/dashmate/src/listr/tasks/setup/nodeTypes.js b/packages/dashmate/src/listr/tasks/setup/nodeTypes.js new file mode 100644 index 00000000000..ace169c6004 --- /dev/null +++ b/packages/dashmate/src/listr/tasks/setup/nodeTypes.js @@ -0,0 +1,32 @@ +const { + NODE_TYPE_MASTERNODE, + NODE_TYPE_FULLNODE, +} = require('../../../constants'); + +const NODE_TYPE_NAMES = { + MASTERNODE: 'masternode', + HP_MASTERNODE: 'high-performance masternode', + FULLNODE: 'fullnode', + HP_FULLNODE: 'high-performance fullnode', +}; + +const NODE_TYPE_NAME_TYPES = { + [NODE_TYPE_NAMES.MASTERNODE]: NODE_TYPE_MASTERNODE, + [NODE_TYPE_NAMES.HP_MASTERNODE]: NODE_TYPE_MASTERNODE, + [NODE_TYPE_NAMES.FULLNODE]: NODE_TYPE_FULLNODE, + [NODE_TYPE_NAMES.HP_FULLNODE]: NODE_TYPE_FULLNODE, +}; + +function isNodeTypeNameHighPerformance(nodeTypeName) { + return [NODE_TYPE_NAMES.HP_MASTERNODE, NODE_TYPE_NAMES.HP_FULLNODE].includes(nodeTypeName); +} + +function getNodeTypeByName(nodeTypeName) { + return NODE_TYPE_NAME_TYPES[nodeTypeName]; +} + +module.exports = { + NODE_TYPE_NAMES, + isNodeTypeNameHighPerformance, + getNodeTypeByName, +}; diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js new file mode 100644 index 00000000000..0a1a23ee31f --- /dev/null +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js @@ -0,0 +1,74 @@ +const { Listr } = require('listr2'); + +const chalk = require('chalk'); + +const BlsSignatures = require('@dashevo/bls'); + +const { + NODE_TYPE_MASTERNODE, +} = require('../../../../constants'); + +const validateBLSPrivateKeyFactory = require('../../../prompts/validators/validateBLSPrivateKeyFactory'); +const createPlatformNodeKeyInput = require('../../../prompts/createPlatformNodeKeyInput'); +const createIpAndPortsForm = require('../../../prompts/createIpAndPortsForm'); +const createTenderdashNodeId = require('../../../../tenderdash/createTenderdashNodeId'); + +function configureNodeTaskFactory() { + /** + * @typedef configureNodeTask + * @returns {Listr} + */ + async function configureNodeTask() { + const blsSignatures = await BlsSignatures(); + + const validateBLSPrivateKey = validateBLSPrivateKeyFactory(blsSignatures); + + return new Listr([ + { + title: 'Configure node', + task: async (ctx, task) => { + // eslint-disable-next-line no-param-reassign + task.title = `Configure ${ctx.nodeType}`; + + if (ctx.nodeType === NODE_TYPE_MASTERNODE) { + const masternodeOperatorPrivateKey = await task.prompt({ + type: 'input', + header: 'Any suggestions where to get it?\n', + message: 'BLS private key', + hint: 'HEX encoded', + validate: validateBLSPrivateKey, + }); + + ctx.config.set('core.masternode.operator.privateKey', masternodeOperatorPrivateKey); + } + + if (ctx.isHP) { + const platformNodeKey = await task.prompt(createPlatformNodeKeyInput({ + skipInitial: ctx.nodeType === NODE_TYPE_MASTERNODE, + })); + + ctx.config.set('platform.drive.tenderdash.node.id', createTenderdashNodeId(platformNodeKey)); + ctx.config.set('platform.drive.tenderdash.node.key', platformNodeKey); + } + + const form = await task.prompt(await createIpAndPortsForm({ + isHPMN: ctx.isHP, + skipInitial: ctx.nodeType === NODE_TYPE_MASTERNODE, + })); + + ctx.config.set('core.p2p.port', form.coreP2PPort); + ctx.config.set('externalIp', form.ip); + + if (ctx.isHP) { + ctx.config.set('platform.dapi.envoy.http.port', form.platformHTTPPort); + ctx.config.set('platform.drive.tenderdash.p2p.port', form.platformP2PPort); + } + }, + }, + ]); + } + + return configureNodeTask; +} + +module.exports = configureNodeTaskFactory; diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js new file mode 100644 index 00000000000..27c94a6caa5 --- /dev/null +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js @@ -0,0 +1,111 @@ +const fs = require('fs'); + +const { Listr } = require('listr2'); + +const { + PRESET_MAINNET, + SSL_PROVIDERS, +} = require('../../../../constants'); + +const listCertificates = require('../../../../ssl/zerossl/listCertificates'); + +const validateFileExists = require('../../../prompts/validators/validateFileExists'); + +/** + * @returns {configureSSLCertificateTask} + */ +function configureSSLCertificateTaskFactory( + saveCertificateTask, + obtainZeroSSLCertificateTask, +) { + /** + * @typedef configureSSLCertificateTask + * @returns {Listr} + */ + function configureSSLCertificateTask() { + return new Listr([ + { + task: async (ctx, task) => { + const choices = [ + { name: SSL_PROVIDERS.ZEROSSL, message: 'ZeroSSL' }, + { name: SSL_PROVIDERS.FILE, message: 'File on disk' }, + ]; + + if (ctx.preset !== PRESET_MAINNET) { + choices.push({ name: SSL_PROVIDERS.SELF_SIGNED, message: 'Self-signed' }); + } + + ctx.certificateProvider = await task.prompt({ + type: 'select', + message: 'How do you prefer to configure SSL', + choices, + initial: SSL_PROVIDERS.ZEROSSL, + }); + + ctx.config.set('platform.dapi.envoy.ssl.provider', ctx.certificateProvider); + }, + }, + { + title: 'Obtain ZeroSSL certificate', + enabled: (ctx) => ctx.certificateProvider === SSL_PROVIDERS.ZEROSSL, + task: async (ctx, task) => { + const apiKey = await task.prompt({ + type: 'input', + message: 'Enter ZeroSSL API key', + validate: async (state) => { + try { + await listCertificates(state); + + return true; + } catch (e) { + // do nothing + } + + return 'Please enter a valid ZeroSSL API key'; + }, + }); + + ctx.config.set('platform.dapi.envoy.ssl.providerConfigs.zerossl.apiKey', apiKey); + + return obtainZeroSSLCertificateTask(ctx.config); + }, + }, + { + title: 'Set SSL certificate file', + enabled: (ctx) => ctx.certificateProvider === SSL_PROVIDERS.FILE, + task: async (ctx, task) => { + + const form = await task.prompt({ + type: 'form', + message: 'Provide paths to your certificate files', + choices: [ + { + name: 'chainFile', + message: 'Path to certificate chain file', + validate: validateFileExists, + }, + { + name: 'privateFile', + message: 'Path to private file', + validate: validateFileExists, + }, + ], + validate: ({ chainFile, privateFile }) => validateFileExists(chainFile) + && validateFileExists(privateFile), + }); + + ctx.certificate = fs.readFileSync(form.chainFile, 'utf8'); + ctx.keyPair = { + privateKey: fs.readFileSync(form.privateFile, 'utf8'), + }; + + return saveCertificateTask(ctx.config); + }, + }, + ]); + } + + return configureSSLCertificateTask; +} + +module.exports = configureSSLCertificateTaskFactory; diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index 773d667dfc8..47d4479964f 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -1,66 +1,31 @@ const { Listr } = require('listr2'); -const styles = require('enquirer/lib/styles'); const chalk = require('chalk'); -const { Observable } = require('rxjs'); - -const { - NODE_TYPE_MASTERNODE, - NODE_TYPE_HPMN, -} = require('../../../../constants'); - -const crypto = require('crypto'); - -const publicIp = require('public-ip'); - const BlsSignatures = require('@dashevo/bls'); -const { PrivateKey, PublicKey, Address } = require('@dashevo/dashcore-lib'); - -const placeholder = require('enquirer/lib/placeholder'); -const createTenderdashNodeId = require('../../../../tenderdash/createTenderdashNodeId'); -const generateTenderdashNodeKey = require('../../../../tenderdash/generateTenderdashNodeKey'); -const validateTenderdashNodeKey = require('../../../prompts/validators/validateTenderdashNodeKey'); const validateAddressHex = require('../../../prompts/validators/validateAddressHex'); +const validateTxHex = require('../../../prompts/validators/validateTxHex'); +const validatePositiveInteger = require('../../../prompts/validators/validatePositiveInteger'); +const validatePercentage = require('../../../prompts/validators/validatePercentage'); +const formatPercentage = require('../../../prompts/formatters/formatPercentage'); +const generateBlsKeys = require('../../../../core/generateBlsKeys'); +const validateBLSPrivateKeyFactory = require('../../../prompts/validators/validateBLSPrivateKeyFactory'); +const createPlatformNodeKeyInput = require('../../../prompts/createPlatformNodeKeyInput'); +const createIpAndPortsForm = require('../../../prompts/createIpAndPortsForm'); /** - * - * @param {startCore} startCore - * @param {createNewAddress} createNewAddress - * @param {generateToAddress} generateToAddress - * @param {generateBlocks} generateBlocks - * @param {waitForCoreSync} waitForCoreSync - * @param {importPrivateKey} importPrivateKey - * @param {getAddressBalance} getAddressBalance - * @param {sendToAddress} sendToAddress - * @param {waitForConfirmations} waitForConfirmations - * @param {registerMasternode} registerMasternode - * @param {waitForBalanceToConfirm} waitForBalanceToConfirm - * @param {createIpAndPortsForm} createIpAndPortsForm * @return {registerMasternodeGuideTask} */ -function registerMasternodeGuideTaskFactory( - startCore, - createNewAddress, - generateToAddress, - generateBlocks, - waitForCoreSync, - importPrivateKey, - getAddressBalance, - sendToAddress, - waitForConfirmations, - registerMasternode, - waitForBalanceToConfirm, - createIpAndPortsForm, -) { +function registerMasternodeGuideTaskFactory() { /** * @typedef {registerMasternodeGuideTask} * @return {Listr} */ async function registerMasternodeGuideTask() { const blsSignatures = await BlsSignatures(); - const { PrivateKey: BlsPrivateKey, BasicSchemeMPL } = blsSignatures; + + const validateBLSPrivateKey = validateBLSPrivateKeyFactory(blsSignatures); const REGISTRARS = { CORE: 'dashCore', @@ -69,97 +34,11 @@ function registerMasternodeGuideTaskFactory( OTHER: 'other', }; - const registrarList = [ - { name: REGISTRARS.CORE, message: 'Dash Core Wallet' }, - { name: REGISTRARS.ANDROID, message: 'Android Dash Wallet' }, - { name: REGISTRARS.IOS, message: 'iOS Dash Wallet' }, - { name: REGISTRARS.OTHER, message: 'Other' }, - ]; - - const registrarMap = registrarList.reduce((obj, { name, message }) => { - // eslint-disable-next-line no-param-reassign - obj[name] = message; - - return obj; - }, {}); - - - function validateOutputIndex(value) { - const index = Math.floor(Number(value)); - - return index >= 0 && index.toString() === value; - } - - function validateTxHash(value) { - return value.length === 64; - } - - function validateECDSAPublicKey(value) { - try { - PublicKey(value); - - return true; - } catch (e) { - return false; - } - } - - function validateBLSPrivateKey(value) { - if (value.length === 0) { - return 'should not be empty'; - } - - const operatorPrivateKeyBuffer = Buffer.from(value, 'hex'); - - let key; - try { - key = BlsPrivateKey.fromBytes(operatorPrivateKeyBuffer, true); - } catch (e) { - return 'invalid key'; - } finally { - if (key) { - key.delete(); - } - } - - return true; - } - - function validateRewardShare(value) { - const reminder = value.split('.')[1]; - - return Number(value) <= 100 && (!reminder || reminder.length <= 2); - } - - function formatRewardShares(input, choice) { - let str; - - const number = Number(input); - if (Number.isNaN(number) || number.toFixed(2).length < input.length) { - str = input; - } else { - str = number.toFixed(2); - } - - const pos = Math.min(choice.cursor, str.length); - - const options = { - input: str, - initial: choice.initial, - pos, - showCursor: this.state.index === 1, - }; - - return placeholder(this, options); - } - - - - return new Listr([ { + title: 'Register masternode', task: async (ctx, task) => { - ctx.registrar = await task.prompt([ + const registrar = await task.prompt([ { type: 'select', header: 'For security reasons, Dash masternodes should never store masternode owner' @@ -170,32 +49,23 @@ function registerMasternodeGuideTaskFactory( + ' such as the BLS operator key and the node id, since this is the' + ' only information necessary for dashmate to configure the masternode.\n', message: 'Which wallet will you use to store keys for your masternode?', - choices: registrarList, + choices: [ + { name: REGISTRARS.CORE, message: 'Dash Core Wallet' }, + { name: REGISTRARS.ANDROID, message: 'Android Dash Wallet' }, + { name: REGISTRARS.IOS, message: 'iOS Dash Wallet' }, + { name: REGISTRARS.OTHER, message: 'Other' }, + ], initial: REGISTRARS.CORE, }, ]); - }, - }, - { - title: 'Register masternode', - enabled: (ctx) => !ctx.isMasternodeRegistered - && (ctx.nodeType === NODE_TYPE_HPMN || ctx.nodeType === NODE_TYPE_MASTERNODE), - task: async (ctx, task) => { - // eslint-disable-next-line no-param-reassign - task.title = `Register masternode with ${registrarMap[ctx.registrar]}`; let initialOperatorPrivateKey; - if (ctx.registrar === REGISTRARS.CORE || ctx.registrar === REGISTRARS.OTHER) { - const randomBytes = new Uint8Array(crypto.randomBytes(256)); - const operatorPrivateKey = BasicSchemeMPL.keyGen(randomBytes); - - initialOperatorPrivateKey = Buffer.from(operatorPrivateKey.serialize()).toString('hex'); + if (registrar === REGISTRARS.CORE || registrar === REGISTRARS.OTHER) { + ({ privateKey: initialOperatorPrivateKey } = await generateBlsKeys()); } // TODO: We need to add description on how to find key generation form in the // specified wallet - - // TODO: Implement additional validations /* ipAddress is set and port is not set to the default mainnet port @@ -217,16 +87,16 @@ function registerMasternodeGuideTaskFactory( { name: 'txId', message: 'Transaction hash', - validate: validateTxHash, + validate: validateTxHex, }, { name: 'outputIndex', message: 'Output index', - validate: validateOutputIndex, + validate: validatePositiveInteger, }, ], - validate: ({ txId, outputIndex }) => validateTxHash(txId) - && validateOutputIndex(outputIndex), + validate: ({ txId, outputIndex }) => validateTxHex(txId) + && validatePositiveInteger(outputIndex), }, { type: 'form', @@ -286,62 +156,54 @@ function registerMasternodeGuideTaskFactory( name: 'rewardShare', message: chalk`Reward share %`, initial: '0.00', - validate: validateRewardShare, - format: formatRewardShares, + validate: validatePercentage, + format: formatPercentage, result: (value) => Number(value).toFixed(2), }, ], validate: ({ privateKey, rewardShare }) => validateBLSPrivateKey(privateKey) - && validateRewardShare(rewardShare), + && validatePercentage(rewardShare), }, ]; - if (ctx.nodeType === NODE_TYPE_HPMN) { - prompts.push({ - type: 'input', - name: 'platformNodeKey', - header: 'Dashmate needs to collect details on your Tenderdash node key. This key' - + ' is used to uniquely identify your high-performance masternode on Dash' - + ' Platform. The node key is derived from a standard Ed25519 cryptographic' - + ' key pair, presented in a cached format specific to Tenderdash. You can' - + ' provide a key, or a new key will be generated for you.\n', - message: 'Enter Ed25519 node key', - hint: 'Base64 encoded', - initial: generateTenderdashNodeKey(), - validate: validateTenderdashNodeKey, - }); + if (ctx.isHP) { + prompts.push(createPlatformNodeKeyInput()); } prompts.push(await createIpAndPortsForm({ - isHPMN: ctx.nodeType === NODE_TYPE_HPMN, + isHPMN: ctx.isHP, })); - let form; let confirmation; do { form = await task.prompt(prompts); - confirmation = await task.prompt([ - { - type: 'toggle', - name: 'confirm', - header: chalk` You should run the command: - {bold.green dash-cli ${ctx.nodeType === NODE_TYPE_HPMN ? 'register_hpmn' : 'register'} - argument1 - argument2 - } - - Go with nope to come back to edit command\n`, - message: 'Have you registered a masternode successfully?', - enabled: 'Yep', - disabled: 'Nope', - }, - ]); + confirmation = await task.prompt({ + type: 'toggle', + name: 'confirm', + header: chalk` You should run the command: + {bold.green dash-cli ${ctx.isHP ? 'register_hpmn' : 'register'} + argument1 + argument2 + } + + Go with nope to come back to edit command\n`, + message: 'Have you registered a masternode successfully?', + enabled: 'Yep', + disabled: 'Nope', + }); } while (!confirmation); // TODO: Store form information to the config console.dir(form); + + // ctx.config.set('externalIp', form.ip); + // ctx.config.set('core.p2p.port', form.port); + // TODO: Derive node id from key + // config.set('platform.drive.tenderdash.nodeId', nodeId); + + // ctx.config.set('platform.drive.tenderdash.nodeKey', ctx.platformP2PKey); }, }, ]); diff --git a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js index 80d0b513748..cb5f8c96b6d 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js @@ -1,25 +1,21 @@ const { Listr } = require('listr2'); -const fs = require('fs'); - -const publicIp = require('public-ip'); - -const BlsSignatures = require('@dashevo/bls'); - -const { PrivateKey, PublicKey, Address } = require('@dashevo/dashcore-lib'); - -const crypto = require('crypto'); - -const placeholder = require('enquirer/lib/placeholder'); const { - SSL_PROVIDERS, - NODE_TYPES, NODE_TYPE_MASTERNODE, PRESET_MAINNET, NODE_TYPE_HPMN, NODE_TYPE_FULLNODE, } = require('../../../constants'); -const { base } = require('../../../../configs/system'); + +const systemConfigs = require('../../../../configs/system'); + +const { + NODE_TYPE_NAMES, + getNodeTypeByName, + isNodeTypeNameHighPerformance, +} = require('./nodeTypes'); + +const Config = require('../../../config/Config'); /** * @param {ConfigFile} configFile @@ -31,6 +27,8 @@ const { base } = require('../../../../configs/system'); * @param {saveCertificateTask} saveCertificateTask * @param {listCertificates} listCertificates * @param {registerMasternodeGuideTask} registerMasternodeGuideTask + * @param {configureNodeTask} configureNodeTask + * @param {configureSSLCertificateTask} configureSSLCertificateTask */ function setupRegularPresetTaskFactory( configFile, @@ -42,6 +40,8 @@ function setupRegularPresetTaskFactory( saveCertificateTask, listCertificates, registerMasternodeGuideTask, + configureNodeTask, + configureSSLCertificateTask, ) { /** * @typedef {setupRegularPresetTask} @@ -49,45 +49,51 @@ function setupRegularPresetTaskFactory( */ function setupRegularPresetTask() { return new Listr([ - { - task: (ctx) => { - ctx.config = configFile.getConfig(ctx.preset); - }, - }, { title: 'Node type', task: async (ctx, task) => { - if (ctx.nodeType === undefined) { - ctx.nodeType = await task.prompt([ - { - type: 'select', - header: ' The Dash network consists of several different node types:' - + ' \n Full nodes: Host a full copy of the Dash blockchain (no collateral required)' - + ' \n Masternodes: Full node features, plus Core services such as ChainLocks and InstantSend (1000 DASH collateral)' - + ' \n High-performance masternodes: Masternode features, plus Platform services such as DAPI and Drive (4000 DASH collateral)\n', - message: 'Select node type', - choices: [ - { name: NODE_TYPE_MASTERNODE, hint: '1000 DASH collateral' }, - { name: NODE_TYPE_HPMN, message: 'high-performance masternode', hint: '4000 DASH collateral' }, - { name: NODE_TYPE_FULLNODE }, - ], - initial: NODE_TYPE_HPMN, - }, - ]); + const nodeTypeName = await task.prompt([ + { + type: 'select', + header: ' The Dash network consists of several different node types:' + + ' \n Full nodes: Host a full copy of the Dash blockchain (no collateral required)' + + ' \n Masternodes: Full node features, plus Core services such as ChainLocks and InstantSend (1000 DASH collateral)' + + ' \n High-performance masternodes: Masternode features, plus Platform services such as DAPI and Drive (4000 DASH collateral)\n', + message: 'Select node type', + choices: [ + { name: NODE_TYPE_NAMES.MASTERNODE, hint: '1000 DASH collateral' }, + { name: NODE_TYPE_NAMES.HP_MASTERNODE, hint: '4000 DASH collateral' }, + { name: NODE_TYPE_NAMES.FULLNODE }, + { name: NODE_TYPE_NAMES.HP_FULLNODE }, + ], + initial: NODE_TYPE_NAMES.MASTERNODE, + }, + ]); - // eslint-disable-next-line no-param-reassign - task.output = ctx.nodeType; + ctx.nodeType = getNodeTypeByName(nodeTypeName); + ctx.isHP = isNodeTypeNameHighPerformance(nodeTypeName); + + + ctx.config = new Config(ctx.preset, systemConfigs[ctx.preset]); + + if (!ctx.isHP) { + delete ctx.config.remove('platform'); } + + ctx.config.set('core.masternode.enable', ctx.nodeType === NODE_TYPE_MASTERNODE); + + // eslint-disable-next-line no-param-reassign + task.output = nodeTypeName; }, options: { persistentOutput: true, }, }, { - enabled: (ctx) => ctx.nodeType === NODE_TYPE_MASTERNODE || ctx.nodeType === NODE_TYPE_HPMN, + enabled: (ctx) => ctx.nodeType === NODE_TYPE_MASTERNODE, task: async (ctx, task) => { let header; - if (ctx.nodeType === NODE_TYPE_HPMN) { + if (ctx.isHP === NODE_TYPE_HPMN) { header = 'If your HP masternode is already registered, we will import your masternode' + ' operator and platform node keys to configure an HP masternode.' + ' Please make sure your IP address has not changed, otherwise you will need' @@ -103,315 +109,43 @@ function setupRegularPresetTaskFactory( + ' and help you to generate the necessary keys.\n'; } - ctx.isMasternodeRegistered = await task.prompt([ - { - type: 'toggle', - header, - message: 'Is your masternode already registered?', - enabled: 'Yes', - disabled: 'No', - }, - ]); - - ctx.config.set('core.masternode.enable', true); + ctx.isMasternodeRegistered = await task.prompt({ + type: 'toggle', + header, + message: 'Is your masternode already registered?', + enabled: 'Yes', + disabled: 'No', + }); }, }, { - enabled: (ctx) => !ctx.isMasternodeRegistered - && (ctx.nodeType === NODE_TYPE_MASTERNODE || ctx.nodeType === NODE_TYPE_HPMN), + enabled: (ctx) => !ctx.isMasternodeRegistered && ctx.nodeType === NODE_TYPE_MASTERNODE, task: () => registerMasternodeGuideTask(), }, { - title: 'Masternode operator key', - enabled: (ctx) => ctx.isMasternodeRegistered, - task: async (ctx, task) => { - const blsSignatures = await BlsSignatures(); - const { PrivateKey: BlsPrivateKey } = blsSignatures; - - function validateBLSPrivateKey(value) { - if (value.length === 0) { - return 'should not be empty'; - } - - const operatorBlsPrivateKeyBuffer = Buffer.from(value, 'hex'); - - let key; - try { - key = BlsPrivateKey.fromBytes(operatorBlsPrivateKeyBuffer, true); - } catch (e) { - return 'invalid key'; - } finally { - if (key) { - key.delete(); - } - } - - return true; - } - - if (ctx.operatorBlsPrivateKey === undefined) { - ctx.operatorBlsPrivateKey = await task.prompt([ - { - type: 'input', - header: 'To import your masternode operator BLS private key, copy the\n' - + '"masternodeblsprivkey" field from your masternode\'s dash.conf file.\n', - message: 'Enter BLS private key', - validate: validateBLSPrivateKey, - }, - ]); - } else { - const result = validateBLSPrivateKey(ctx.operatorBlsPrivateKey); - - if (result !== true) { - throw new Error(`operator private key: ${result}`); - } - } - - ctx.config.set('core.masternode.operator.privateKey', ctx.operatorBlsPrivateKey); - - // eslint-disable-next-line no-param-reassign - task.output = '*******************************************'; - }, - options: { - persistentOutput: true, - }, + enabled: (ctx) => ctx.isMasternodeRegistered || ctx.nodeType === NODE_TYPE_FULLNODE, + task: () => configureNodeTask(), }, { - title: 'Platform node key', - enabled: (ctx) => ctx.isMasternodeRegistered && ctx.nodeType === NODE_TYPE_HPMN, - task: async (ctx, task) => { - // TODO: Do we accept HEX or base64? - - function validate(value) { - if (value.length < 1) { - return 'should not be empty'; - } - - // TODO: Implement validation - // const privateKeyDer = Buffer.concat([ - // Buffer.from('302a300506032b6570032100', 'hex'), // Static value - // Buffer.from(value, 'hex'), - // ]); - // - // const verifyKey = crypto.createPrivateKey({ - // format: 'der', - // type: 'pkcs8', - // privateKeyDer, - // }); - // - - return true; - } - - if (ctx.platformP2PKey === undefined) { - ctx.platformP2PKey = await task.prompt([ - { - type: 'input', - header: 'Platform node key. Must be base64\n', - message: 'Enter Tenderdash Ed25519 cached key', - validate, - }, - ]); - } else { - const result = validate(ctx.platformP2PKey); - - if (result !== true) { - throw new Error(`platform p2p key: ${result}`); - } - } - - // TODO: Derive node id from key - // config.set('platform.drive.tenderdash.nodeId', nodeId); - - // ctx.config.set('platform.drive.tenderdash.nodeKey', ctx.platformP2PKey); - }, - options: { - persistentOutput: true, - }, + title: 'Configure SSL certificate', + // TODO: We don't need certificates for mainnet since we don't run platform there on + // first version + enabled: (ctx) => ctx.isHP && ctx.preset !== PRESET_MAINNET, + task: () => configureSSLCertificateTask(), }, { - title: 'IP address and port', - enabled: (ctx) => ctx.nodeType === NODE_TYPE_HPMN || ctx.nodeType === NODE_TYPE_MASTERNODE, - task: async (ctx, task) => { - if (ctx.externalIp === undefined) { - - const initialIp = !ctx.isMasternodeRegistered ? publicIp.v4() : undefined; - - function validateIp(ip) { - return Boolean(ip.match(/^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$/)); - } - - function validatePort(port) { - const portNumber = Math.floor(Number(port)); - - return portNumber >= 1 - && portNumber <= 65535 - && portNumber.toString() === port; - } - - const form = await task.prompt([ - { - type: 'form', - header: 'The masternode public static IPv4 address and port will be included' - + ' in the masternode registration transaction. Your masternode must provide' - + ' service to the network at this address, or it will eventually be banned.\n', - message: 'Enter IP address and port:', - choices: [ - { - name: 'ip', - message: 'IPv4', - initial: initialIp, - validate: validateIp, - }, - { - name: 'port', - message: 'Port', - initial: base.core.p2p.port.toString(), - validate: validatePort, - }, - ], - validate: ({ ip, port }) => validateIp(ip) && validatePort(port), - }, - ]); - - ctx.config.set('externalIp', form.ip); - ctx.config.set('core.p2p.port', form.port); + task: (ctx, task) => { + configFile.setConfig(ctx.config); + configFile.setDefaultConfigName(ctx.preset); - // eslint-disable-next-line no-param-reassign - task.output = `${form.ip}:${form.port}`; - } + // eslint-disable-next-line no-param-reassign + task.output = 'Use dashmate start \n \n to .... quick help on how \n to use \n node'; }, options: { persistentOutput: true, - }, - }, - { - title: 'Set masternode operator BLS private key', - enabled: (ctx) => ctx.nodeType === NODE_TYPE_MASTERNODE, - task: async (ctx, task) => { - if (ctx.operatorBlsPrivateKey === undefined) { - const { privateKey: generatedPrivateKeyHex } = await generateBlsKeys(); - - ctx.operatorBlsPrivateKey = await task.prompt([ - { - type: 'input', - message: 'Enter operator BLS private key (Enter to accept generated key)', - initial: generatedPrivateKeyHex, - }, - ]); - } - - const operatorBlsPrivateKeyBuffer = Buffer.from(ctx.operatorBlsPrivateKey, 'hex'); - - const blsSignatures = await BlsSignatures(); - const { PrivateKey: BlsPrivateKey } = blsSignatures; - - const privateKey = BlsPrivateKey.fromBytes(operatorBlsPrivateKeyBuffer, true); - const publicKey = privateKey.getG1(); - const publicKeyHex = Buffer.from(publicKey.serialize()).toString('hex'); - - ctx.config.set('core.masternode.operator.privateKey', ctx.operatorBlsPrivateKey); - - ctx.operator = { - publicKey: publicKeyHex, - }; - - privateKey.delete(); - publicKey.delete(); - - // eslint-disable-next-line no-param-reassign - task.output = `BLS public key: ${publicKeyHex}\nBLS private key: ${ctx.operatorBlsPrivateKey}`; - }, - options: { persistentOutput: true }, - }, - { - title: 'SSL certificate', - enabled: (ctx) => !ctx.certificateProvider, - task: async (ctx, task) => { - const sslProviders = [...SSL_PROVIDERS].filter((item) => item !== 'selfSigned'); - - ctx.certificateProvider = await task.prompt({ - type: 'select', - message: 'Select SSL certificate provider', - choices: sslProviders, - initial: sslProviders[0], - }); - - ctx.config.set('platform.dapi.envoy.ssl.provider', ctx.certificateProvider); - }, - }, - { - title: 'Obtain ZeroSSL certificate', - enabled: (ctx) => ctx.certificateProvider === 'zerossl', - task: async (ctx, task) => { - let apiKey = ctx.zeroSslApiKey; - - if (!apiKey) { - apiKey = await task.prompt({ - type: 'input', - message: 'Enter ZeroSSL API key', - validate: async (state) => { - try { - await listCertificates(state); - - return true; - } catch (e) { - // do nothing - } - - return 'Please enter a valid ZeroSSL API key'; - }, - }); - } - - ctx.config.set('platform.dapi.envoy.ssl.providerConfigs.zerossl.apiKey', apiKey); - - return obtainZeroSSLCertificateTask(ctx.config); - }, - }, - { - title: 'Set SSL certificate', - enabled: (ctx) => ctx.certificateProvider === 'manual', - task: async (ctx, task) => { - if (!ctx.sslCertificateFilePath) { - ctx.sslCertificateFilePath = await task.prompt({ - type: 'input', - message: 'Enter the path to your certificate chain file', - validate: (state) => { - if (fs.existsSync(state)) { - return true; - } - - return 'Please enter a valid path to your certificate chain file'; - }, - }); - } - - if (!ctx.sslCertificatePrivateKeyFilePath) { - ctx.sslCertificatePrivateKeyFilePath = await task.prompt({ - type: 'input', - message: 'Enter the path to your private key file', - validate: (state) => { - if (fs.existsSync(state)) { - return true; - } - - return 'Please enter a valid path to your private key file'; - }, - }); - } - - ctx.certificate = fs.readFileSync(ctx.sslCertificateFilePath, 'utf8'); - ctx.keyPair = { - privateKey: fs.readFileSync(ctx.sslCertificatePrivateKeyFilePath, 'utf8'), - }; - - return saveCertificateTask(ctx.config); - }, - }, - { - task: (ctx) => { - configFile.setDefaultConfigName(ctx.preset); + rendererOptions: { + bottomBar: true, + }, }, }, ]); diff --git a/scripts/configure.sh b/scripts/configure.sh new file mode 100755 index 00000000000..e078e0afd66 --- /dev/null +++ b/scripts/configure.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e + +source ./scripts/setup_local_network.sh +source ./scripts/configure_dashmate.sh +source ./scripts/configure_test_suite.sh +source ./scripts/configure_dotenv.sh diff --git a/scripts/configure_dashmate.sh b/scripts/configure_dashmate.sh index e5c50bff584..6597a799af0 100755 --- a/scripts/configure_dashmate.sh +++ b/scripts/configure_dashmate.sh @@ -7,10 +7,6 @@ CONFIG_NAME="local" FULL_PATH=$(realpath "$0") DIR_PATH=$(dirname "$FULL_PATH") ROOT_PATH=$(dirname "$DIR_PATH") -PACKAGES_PATH="$ROOT_PATH/packages" - -DAPI_REPO_PATH="${PACKAGES_PATH}/dapi" -DRIVE_REPO_PATH="${PACKAGES_PATH}/js-drive" # build Drive, DAPI and Dashmate helper from sources yarn dashmate config set --config=${CONFIG_NAME} platform.sourcePath "$ROOT_PATH" diff --git a/scripts/setup_local_network.sh b/scripts/setup_local_network.sh index 5338bb50924..4ae896203df 100755 --- a/scripts/setup_local_network.sh +++ b/scripts/setup_local_network.sh @@ -8,11 +8,8 @@ MASTERNODES_COUNT=3 FULL_PATH=$(realpath $0) DIR_PATH=$(dirname $FULL_PATH) ROOT_PATH=$(dirname $DIR_PATH) -PACKAGES_PATH="$ROOT_PATH/packages" -DASHMATE_BIN="${PACKAGES_PATH}/dashmate/bin/dashmate" - -yarn dashmate setup local --verbose \ +yarn run dashmate setup local --verbose \ --debug-logs \ --miner-interval="${MINING_INTERVAL_IN_SECONDS}s" \ - --node-count=${MASTERNODES_COUNT} | tee "${ROOT_PATH}"/logs/setup.log + --node-count=${MASTERNODES_COUNT} | tee "${ROOT_PATH}"/logs/setup.log || exit 1 diff --git a/yarn.lock b/yarn.lock index 71caa25b51f..d0cf9d12ef6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5806,7 +5806,7 @@ __metadata: languageName: node linkType: hard -"create-hmac@npm:1.1.7, create-hmac@npm:^1.1.0, create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": +"create-hmac@npm:^1.1.0, create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": version: 1.1.7 resolution: "create-hmac@npm:1.1.7" dependencies: @@ -6002,7 +6002,6 @@ __metadata: dockerode: ^3.2.0 dot: ^1.1.3 dotenv: ^8.6.0 - ed25519-hd-key: ^1.3.0 enquirer: ^2.3.6 eslint: ^7.32.0 eslint-config-airbnb-base: ^14.2.1 @@ -6029,7 +6028,6 @@ __metadata: sinon: ^11.1.2 sinon-chai: ^3.7.0 table: ^5.4.6 - yosay: ^2.0.2 bin: dashmate: ./bin/run languageName: unknown @@ -6480,16 +6478,6 @@ __metadata: languageName: node linkType: hard -"ed25519-hd-key@npm:^1.3.0": - version: 1.3.0 - resolution: "ed25519-hd-key@npm:1.3.0" - dependencies: - create-hmac: 1.1.7 - tweetnacl: 1.0.3 - checksum: 65dcf405f948ca592adc1e81d750627ce65887310ba0e1b430a6ae0dcc13e9e67a81cb855252c8d64cc0303da2b84ddad810db3098d24c808a5ae89e79fe58cf - languageName: node - linkType: hard - "ee-first@npm:1.1.1": version: 1.1.1 resolution: "ee-first@npm:1.1.1" @@ -14303,13 +14291,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"tweetnacl@npm:1.0.3": - version: 1.0.3 - resolution: "tweetnacl@npm:1.0.3" - checksum: e4a57cac188f0c53f24c7a33279e223618a2bfb5fea426231991652a13247bea06b081fd745d71291fcae0f4428d29beba1b984b1f1ce6f66b06a6d1ab90645c - languageName: node - linkType: hard - "tweetnacl@npm:^0.14.3": version: 0.14.5 resolution: "tweetnacl@npm:0.14.5" From d95734a84f3662a9b6157986d9f732b0ae21b8ac Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 23 Mar 2023 12:51:07 +0800 Subject: [PATCH 14/93] feat: validate if preset already configured --- packages/dashmate/src/commands/setup.js | 60 ++++++++++++++++++------- packages/dashmate/src/config/Config.js | 11 +++++ 2 files changed, 54 insertions(+), 17 deletions(-) diff --git a/packages/dashmate/src/commands/setup.js b/packages/dashmate/src/commands/setup.js index 9d4332d6ef0..f463d8d3368 100644 --- a/packages/dashmate/src/commands/setup.js +++ b/packages/dashmate/src/commands/setup.js @@ -10,14 +10,19 @@ const MuteOneLineError = require('../oclif/errors/MuteOneLineError'); const { PRESET_LOCAL, + PRESET_MAINNET, PRESETS, } = require('../constants'); +const systemConfigs = require('../../configs/system'); + +const Config = require('../config/Config'); + class SetupCommand extends BaseCommand { /** * @param {Object} args * @param {Object} flags - * @param {generateBlsKeys} generateBlsKeys + * @param {ConfigFile} configFile * @param {setupLocalPresetTask} setupLocalPresetTask * @param {setupRegularPresetTask} setupRegularPresetTask * @return {Promise} @@ -32,7 +37,7 @@ class SetupCommand extends BaseCommand { 'miner-interval': minerInterval, verbose: isVerbose, }, - generateBlsKeys, + configFile, setupLocalPresetTask, setupRegularPresetTask, ) { @@ -48,21 +53,42 @@ class SetupCommand extends BaseCommand { ctx.preset = await task.prompt([ { type: 'select', - header: ' Dashmate provides three default configuration presets:\n local - Run a fully functional network environment on your machine for local development' - + '\n mainnet - Run a node connected to the Dash main network' - + '\n testnet - Run a node connected to the Dash test network\n', + header: ` Dashmate provides three default configuration presets:\n + local - Run a fully functional network environment on your machine for local development + mainnet - Run a node connected to the Dash main network + testnet - Run a node connected to the Dash test network\n`, message: 'Select preset', choices: PRESETS, - initial: 'testnet', + initial: PRESET_MAINNET, }, ]); - // eslint-disable-next-line no-param-reassign - task.output = ctx.preset; + let isAlreadyConfigured = false; + if (ctx.preset === PRESET_LOCAL) { + isAlreadyConfigured = configFile.isGroupExists(ctx.preset); + } else { + const systemConfig = new Config(ctx.preset, systemConfigs[ctx.preset]); + + isAlreadyConfigured = !configFile.getConfig(ctx.preset).isEqual(systemConfig); + } + + if (isAlreadyConfigured) { + task.output = `Preset ${ctx.preset} already configured. + To setup a node with this preset from scratch use "dashmate reset --config ${ctx.preset} --hard". Previous data and configuration for this preset will be lost. + If you want to keep existing data and configuration please use "dashmate config create" command to create a new configuration for this preset`; + + throw new Error(`Preset ${ctx.preset} already configured`); + } else { + // eslint-disable-next-line no-param-reassign + + task.output = ctx.preset; + } + } }, options: { persistentOutput: true, + showErrorMessage: false, }, }, { @@ -86,17 +112,17 @@ class SetupCommand extends BaseCommand { }, }); - // eslint-disable-next-line no-console - await import('begoo').then(({ begoo }) => { - console.log( - begoo( - `Hello! I'm your ${chalk.bold.cyanBright('Dash')} mate!\n\nI will assist you with setting up a Dash node on mainnet or testnet. I can also help you set up a development network on your local system.`, - { maxLength: 45 }, - ), - ); - }) + if (!isVerbose) { // TODO: We need to print it only with default renderer + const { begoo } = await import('begoo'); + const welcomeText = begoo( + chalk`Hello! I'm your {bold.cyanBright Dash} mate!\n\nI will assist you with setting up a Dash node on mainnet or testnet. I can also help you set up a development network on your local system.`, + { maxLength: 45 }, + ); + // eslint-disable-next-line no-console + console.log(welcomeText); + } try { await tasks.run({ diff --git a/packages/dashmate/src/config/Config.js b/packages/dashmate/src/config/Config.js index 0044142d2a1..025260ddb65 100644 --- a/packages/dashmate/src/config/Config.js +++ b/packages/dashmate/src/config/Config.js @@ -5,6 +5,7 @@ const nodePath = require('path'); const lodashGet = require('lodash/get'); const lodashSet = require('lodash/set'); const lodashCloneDeep = require('lodash/cloneDeep'); +const lodashIsEqual = require('lodash/isEqual'); const addFormats = require('ajv-formats'); const configJsonSchema = require('../../configs/schema/configJsonSchema'); @@ -149,6 +150,16 @@ class Config { return this; } + /** + * Compare two configs + * + * @param {Config} config + * @returns {boolean} + */ + isEqual(config) { + return lodashIsEqual(this.getOptions(), config.getOptions()); + } + /** * * @return {{CONFIG_NAME: string, COMPOSE_PROJECT_NAME: string}} From 12f0b81ae8cfcfbaf79519fa2d5a3d99d7006b12 Mon Sep 17 00:00:00 2001 From: strophy Date: Thu, 23 Mar 2023 12:52:50 +0800 Subject: [PATCH 15/93] chore: string formatting --- packages/dashmate/src/commands/setup.js | 7 ++++--- .../src/listr/prompts/createIpAndPortsForm.js | 4 ++-- .../tasks/setup/setupRegularPresetTaskFactory.js | 14 ++++++++------ 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/packages/dashmate/src/commands/setup.js b/packages/dashmate/src/commands/setup.js index 9d4332d6ef0..c6d8777608e 100644 --- a/packages/dashmate/src/commands/setup.js +++ b/packages/dashmate/src/commands/setup.js @@ -48,9 +48,10 @@ class SetupCommand extends BaseCommand { ctx.preset = await task.prompt([ { type: 'select', - header: ' Dashmate provides three default configuration presets:\n local - Run a fully functional network environment on your machine for local development' - + '\n mainnet - Run a node connected to the Dash main network' - + '\n testnet - Run a node connected to the Dash test network\n', + header: ' Dashmate provides three default configuration presets:' + + '\n local - Run a fully functional network environment on your machine for local development' + + '\n testnet - Run a node connected to the Dash test network' + + '\n mainnet - Run a node connected to the Dash main network\n', message: 'Select preset', choices: PRESETS, initial: 'testnet', diff --git a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js index a0c64935ad4..81408b8eb81 100644 --- a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js +++ b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js @@ -71,8 +71,8 @@ async function createIpAndPortsForm(options = {}) { return { type: 'form', name: 'ipAndPorts', - header: 'The node external IP address must be static and will be used by the ..' - + ' network ..\n', + header: 'Dashmate needs to collect your external public static IP address and port information to use in the registration transaction.\n' + + 'You will need to ensure these ports are open and reachable from the public internet at this IP address in order to avoid PoSe bans.\n', message: 'Enter IP address and ports:', choices: fields, validate: ({ diff --git a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js index cb5f8c96b6d..8355cebc6d6 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js @@ -56,15 +56,16 @@ function setupRegularPresetTaskFactory( { type: 'select', header: ' The Dash network consists of several different node types:' - + ' \n Full nodes: Host a full copy of the Dash blockchain (no collateral required)' - + ' \n Masternodes: Full node features, plus Core services such as ChainLocks and InstantSend (1000 DASH collateral)' - + ' \n High-performance masternodes: Masternode features, plus Platform services such as DAPI and Drive (4000 DASH collateral)\n', + + ' \n Full node - Host a full copy of the Dash blockchain (no collateral required)' + + ' \n Masternode - Full node features, plus Core services such as ChainLocks and InstantSend (1000 DASH collateral)' + + ' \n High-performance full node - Full node features, plus host a full copy of the Platform blockchain (no collateral required)' + + ' \n High-performance masternode - Masternode features, plus Platform services such as DAPI and Drive (4000 DASH collateral)\n', message: 'Select node type', choices: [ - { name: NODE_TYPE_NAMES.MASTERNODE, hint: '1000 DASH collateral' }, - { name: NODE_TYPE_NAMES.HP_MASTERNODE, hint: '4000 DASH collateral' }, { name: NODE_TYPE_NAMES.FULLNODE }, + { name: NODE_TYPE_NAMES.MASTERNODE, hint: '1000 DASH collateral' }, { name: NODE_TYPE_NAMES.HP_FULLNODE }, + { name: NODE_TYPE_NAMES.HP_MASTERNODE, hint: '4000 DASH collateral' }, ], initial: NODE_TYPE_NAMES.MASTERNODE, }, @@ -139,7 +140,8 @@ function setupRegularPresetTaskFactory( configFile.setDefaultConfigName(ctx.preset); // eslint-disable-next-line no-param-reassign - task.output = 'Use dashmate start \n \n to .... quick help on how \n to use \n node'; + task.output = 'Your node configuration is now complete. You can now run `dashmate start` to start your node, and `dashmate status` for a status\n' + + 'overview of node health. Run `dashmate --help` or `dashmate --help` for quick help on how to use dashmate to manage your node.\n'; }, options: { persistentOutput: true, From 27753ad4a3d7c24b1811818c458cfd394e6e561d Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 23 Mar 2023 14:14:05 +0800 Subject: [PATCH 16/93] fix: do not ask for ip and ports for full nodes --- packages/dashmate/src/commands/setup.js | 16 ++++++++------- .../setup/regular/configureNodeTaskFactory.js | 20 ++++++++++--------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/packages/dashmate/src/commands/setup.js b/packages/dashmate/src/commands/setup.js index 4af88be007f..68768e2072a 100644 --- a/packages/dashmate/src/commands/setup.js +++ b/packages/dashmate/src/commands/setup.js @@ -53,17 +53,18 @@ class SetupCommand extends BaseCommand { ctx.preset = await task.prompt([ { type: 'select', - header: ' Dashmate provides three default configuration presets:' - + '\n local - Run a fully functional network environment on your machine for local development' - + '\n testnet - Run a node connected to the Dash test network' - + '\n mainnet - Run a node connected to the Dash main network\n', + header: ` Dashmate provides three default configuration presets: + + local - Run a fully functional network environment on your machine for local development + testnet - Run a node connected to the Dash test network + mainnet - Run a node connected to the Dash main network\n`, message: 'Select preset', choices: PRESETS, initial: PRESET_MAINNET, }, ]); - let isAlreadyConfigured = false; + let isAlreadyConfigured; if (ctx.preset === PRESET_LOCAL) { isAlreadyConfigured = configFile.isGroupExists(ctx.preset); } else { @@ -83,7 +84,6 @@ class SetupCommand extends BaseCommand { task.output = ctx.preset; } - } }, options: { @@ -116,7 +116,9 @@ class SetupCommand extends BaseCommand { const { begoo } = await import('begoo'); const welcomeText = begoo( - chalk`Hello! I'm your {bold.cyanBright Dash} mate!\n\nI will assist you with setting up a Dash node on mainnet or testnet. I can also help you set up a development network on your local system.`, + chalk`Hello! I'm your {bold.cyanBright Dash} mate! + +I will assist you with setting up a Dash node on mainnet or testnet. I can also help you set up a development network on your local system.`, { maxLength: 45 }, ); diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js index 0a1a23ee31f..59cf824067f 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js @@ -51,17 +51,19 @@ function configureNodeTaskFactory() { ctx.config.set('platform.drive.tenderdash.node.key', platformNodeKey); } - const form = await task.prompt(await createIpAndPortsForm({ - isHPMN: ctx.isHP, - skipInitial: ctx.nodeType === NODE_TYPE_MASTERNODE, - })); + if (ctx.nodeType === NODE_TYPE_MASTERNODE) { + const form = await task.prompt(await createIpAndPortsForm({ + isHPMN: ctx.isHP, + skipInitial: true, + })); - ctx.config.set('core.p2p.port', form.coreP2PPort); - ctx.config.set('externalIp', form.ip); + ctx.config.set('core.p2p.port', form.coreP2PPort); + ctx.config.set('externalIp', form.ip); - if (ctx.isHP) { - ctx.config.set('platform.dapi.envoy.http.port', form.platformHTTPPort); - ctx.config.set('platform.drive.tenderdash.p2p.port', form.platformP2PPort); + if (ctx.isHP) { + ctx.config.set('platform.dapi.envoy.http.port', form.platformHTTPPort); + ctx.config.set('platform.drive.tenderdash.p2p.port', form.platformP2PPort); + } } }, }, From c9b0378c168050c50684b004de379d15853e6f07 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 23 Mar 2023 15:00:16 +0800 Subject: [PATCH 17/93] feat: ip and port validation --- packages/dashmate/configs/system/base.js | 2 +- .../src/listr/prompts/createIpAndPortsForm.js | 52 ++++++++++++------- .../setup/regular/configureNodeTaskFactory.js | 17 ++++-- .../registerMasternodeGuideTaskFactory.js | 8 +-- .../setup/setupRegularPresetTaskFactory.js | 10 ++-- 5 files changed, 56 insertions(+), 33 deletions(-) diff --git a/packages/dashmate/configs/system/base.js b/packages/dashmate/configs/system/base.js index d2967c491d4..7d3927f041d 100644 --- a/packages/dashmate/configs/system/base.js +++ b/packages/dashmate/configs/system/base.js @@ -92,7 +92,7 @@ module.exports = { image: 'dashpay/envoy:0.24-dev', }, http: { - port: 3000, + port: 443, }, rateLimiter: { maxTokens: 300, diff --git a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js index 81408b8eb81..74431021a7a 100644 --- a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js +++ b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js @@ -1,32 +1,28 @@ const publicIp = require('public-ip'); -const { base } = require('../../../configs/system'); +const systemConfigs = require('../../../configs/system'); + const validateIPv4 = require('./validators/validateIPv4'); const validatePort = require('./validators/validatePort'); +const { + PRESET_MAINNET, +} = require('../../constants'); + /** * @typedef {createIpAndPortsForm} + * @param {string} network * @param {Object} [options] * @param {Object} [options.skipInitial=false] * @param {Object} [options.isHPMN=false] * @returns {Object} */ -async function createIpAndPortsForm(options = {}) { +async function createIpAndPortsForm(network, options = {}) { let initialIp; if (!options.skipInitial) { initialIp = await publicIp.v4(); } - let initialCoreP2PPort; - if (!options.skipInitial) { - initialCoreP2PPort = base.core.p2p.port.toString(); - } - - // TODO: Ports shouldn't be equal and must not be busy - // TODO: Validate that IP address is available from outside - // TODO: Validate ports according to the current network - // TODO: We should take initial values from corresponding configs not from the base - const fields = [ { name: 'ip', @@ -34,18 +30,26 @@ async function createIpAndPortsForm(options = {}) { initial: initialIp, validate: validateIPv4, }, - { + ]; + + if (network !== PRESET_MAINNET) { + let initialCoreP2PPort; + if (!options.skipInitial) { + initialCoreP2PPort = systemConfigs[network].core.p2p.port.toString(); + } + + fields.push({ name: 'coreP2PPort', message: 'Core P2P Port', initial: initialCoreP2PPort, validate: validatePort, - }, - ]; + }); + } if (options.isHPMN) { let initialPlatformP2PPort; if (!options.skipInitial) { - initialPlatformP2PPort = base.platform.drive.tenderdash.p2p.port.toString(); + initialPlatformP2PPort = systemConfigs[network].platform.drive.tenderdash.p2p.port.toString(); } fields.push({ @@ -57,7 +61,7 @@ async function createIpAndPortsForm(options = {}) { let initialPlatformHTTPPort; if (!options.skipInitial) { - initialPlatformHTTPPort = base.platform.dapi.envoy.http.port.toString(); + initialPlatformHTTPPort = systemConfigs[network].platform.dapi.envoy.http.port.toString(); } fields.push({ @@ -81,8 +85,20 @@ async function createIpAndPortsForm(options = {}) { platformP2PPort, platformHTTPPort, }) => { + if (network === PRESET_MAINNET) { + return validateIPv4(ip); + } + + if (options.isHPMN) { + if (coreP2PPort === platformP2PPort + || coreP2PPort === platformHTTPPort + || platformP2PPort === platformHTTPPort) { + return 'same ports are used'; + } + } + return validateIPv4(ip) && validatePort(coreP2PPort) - && (!options.isHPMN || (validatePort(platformP2PPort) && validatePort(platformHTTPPort))) + && (!options.isHPMN || (validatePort(platformP2PPort) && validatePort(platformHTTPPort))); }, }; } diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js index 59cf824067f..b73f24e4191 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js @@ -6,6 +6,7 @@ const BlsSignatures = require('@dashevo/bls'); const { NODE_TYPE_MASTERNODE, + PRESET_MAINNET, } = require('../../../../constants'); const validateBLSPrivateKeyFactory = require('../../../prompts/validators/validateBLSPrivateKeyFactory'); @@ -30,6 +31,7 @@ function configureNodeTaskFactory() { // eslint-disable-next-line no-param-reassign task.title = `Configure ${ctx.nodeType}`; + // Masternode Operator key if (ctx.nodeType === NODE_TYPE_MASTERNODE) { const masternodeOperatorPrivateKey = await task.prompt({ type: 'input', @@ -42,6 +44,7 @@ function configureNodeTaskFactory() { ctx.config.set('core.masternode.operator.privateKey', masternodeOperatorPrivateKey); } + // Platform Node Key if (ctx.isHP) { const platformNodeKey = await task.prompt(createPlatformNodeKeyInput({ skipInitial: ctx.nodeType === NODE_TYPE_MASTERNODE, @@ -51,20 +54,26 @@ function configureNodeTaskFactory() { ctx.config.set('platform.drive.tenderdash.node.key', platformNodeKey); } + // IP and ports if (ctx.nodeType === NODE_TYPE_MASTERNODE) { const form = await task.prompt(await createIpAndPortsForm({ isHPMN: ctx.isHP, skipInitial: true, })); - ctx.config.set('core.p2p.port', form.coreP2PPort); ctx.config.set('externalIp', form.ip); - if (ctx.isHP) { - ctx.config.set('platform.dapi.envoy.http.port', form.platformHTTPPort); - ctx.config.set('platform.drive.tenderdash.p2p.port', form.platformP2PPort); + if (ctx.preset !== PRESET_MAINNET) { + ctx.config.set('core.p2p.port', form.coreP2PPort); + + if (ctx.isHP) { + ctx.config.set('platform.dapi.envoy.http.port', form.platformHTTPPort); + ctx.config.set('platform.drive.tenderdash.p2p.port', form.platformP2PPort); + } } } + + // TODO: Output configuration }, }, ]); diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index 47d4479964f..c73b627e979 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -66,12 +66,6 @@ function registerMasternodeGuideTaskFactory() { // TODO: We need to add description on how to find key generation form in the // specified wallet - // TODO: Implement additional validations - /* - ipAddress is set and port is not set to the default mainnet port - ipAddress is set and not routable or not an IPv4 mapped address - ipAddress is set and already used in the registered masternodes set - */ const validateAddressHexWithNetwork = (value) => validateAddressHex(value, ctx.preset); @@ -204,6 +198,8 @@ function registerMasternodeGuideTaskFactory() { // config.set('platform.drive.tenderdash.nodeId', nodeId); // ctx.config.set('platform.drive.tenderdash.nodeKey', ctx.platformP2PKey); + + // TODO: Output configuration }, }, ]); diff --git a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js index 8355cebc6d6..6b92fab18fd 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js @@ -74,7 +74,6 @@ function setupRegularPresetTaskFactory( ctx.nodeType = getNodeTypeByName(nodeTypeName); ctx.isHP = isNodeTypeNameHighPerformance(nodeTypeName); - ctx.config = new Config(ctx.preset, systemConfigs[ctx.preset]); if (!ctx.isHP) { @@ -131,7 +130,9 @@ function setupRegularPresetTaskFactory( title: 'Configure SSL certificate', // TODO: We don't need certificates for mainnet since we don't run platform there on // first version - enabled: (ctx) => ctx.isHP && ctx.preset !== PRESET_MAINNET, + enabled: (ctx) => ctx.nodeType === NODE_TYPE_MASTERNODE + && ctx.isHP + && ctx.preset !== PRESET_MAINNET, task: () => configureSSLCertificateTask(), }, { @@ -140,8 +141,9 @@ function setupRegularPresetTaskFactory( configFile.setDefaultConfigName(ctx.preset); // eslint-disable-next-line no-param-reassign - task.output = 'Your node configuration is now complete. You can now run `dashmate start` to start your node, and `dashmate status` for a status\n' - + 'overview of node health. Run `dashmate --help` or `dashmate --help` for quick help on how to use dashmate to manage your node.\n'; + task.output = `Your node configuration is now complete! + You can now run "dashmate start" to start your node, and "dashmate status" for a status overview of node health. + Run "dashmate --help" or "dashmate --help" for quick help on how to use dashmate to manage your node.\n`; }, options: { persistentOutput: true, From 5ffa6ab9d524329275adbeaf5bed961cc1bebb38 Mon Sep 17 00:00:00 2001 From: strophy Date: Thu, 23 Mar 2023 15:12:33 +0800 Subject: [PATCH 18/93] chore: intro text updates and backtick syntax --- packages/dashmate/src/commands/setup.js | 6 +++--- .../src/listr/prompts/createPlatformNodeKeyInput.js | 9 ++++----- .../setup/regular/configureSSLCertificateTaskFactory.js | 3 ++- .../listr/tasks/setup/setupRegularPresetTaskFactory.js | 5 +++-- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/dashmate/src/commands/setup.js b/packages/dashmate/src/commands/setup.js index 68768e2072a..116e44b2f5f 100644 --- a/packages/dashmate/src/commands/setup.js +++ b/packages/dashmate/src/commands/setup.js @@ -75,8 +75,8 @@ class SetupCommand extends BaseCommand { if (isAlreadyConfigured) { task.output = `Preset ${ctx.preset} already configured. - To setup a node with this preset from scratch use "dashmate reset --config ${ctx.preset} --hard". Previous data and configuration for this preset will be lost. - If you want to keep existing data and configuration please use "dashmate config create" command to create a new configuration for this preset`; + To set up a node with this preset from scratch use "dashmate reset --config ${ctx.preset} --hard". Previous data and configuration for this preset will be lost. + If you want to keep existing data and configuration, please use the "dashmate config create" command to create a new configuration for this preset.`; throw new Error(`Preset ${ctx.preset} already configured`); } else { @@ -117,7 +117,7 @@ class SetupCommand extends BaseCommand { const welcomeText = begoo( chalk`Hello! I'm your {bold.cyanBright Dash} mate! - + I will assist you with setting up a Dash node on mainnet or testnet. I can also help you set up a development network on your local system.`, { maxLength: 45 }, ); diff --git a/packages/dashmate/src/listr/prompts/createPlatformNodeKeyInput.js b/packages/dashmate/src/listr/prompts/createPlatformNodeKeyInput.js index a3ce6b09afb..2d30faab577 100644 --- a/packages/dashmate/src/listr/prompts/createPlatformNodeKeyInput.js +++ b/packages/dashmate/src/listr/prompts/createPlatformNodeKeyInput.js @@ -10,11 +10,10 @@ function createPlatformNodeKeyInput(options = {}) { return { type: 'input', name: 'platformNodeKey', - header: 'Dashmate needs to collect details on your Tenderdash node key. This key' - + ' is used to uniquely identify your Dash Platform node. The node key is derived from a standard' - + ' Ed25519 cryptographic' - + ' key pair, presented in a cached format specific to Tenderdash. You can' - + ' provide a key, or a new key will be generated for you.\n', + header: ` Dashmate needs to collect details on your Tenderdash node key. + + This key is used to uniquely identify your Dash Platform node. The node key is derived from a standard Ed25519 cryptographic key pair, + presented in a cached formatd specific to Tenderdash. You can provide a key, or a new key will be automatically generated for you.\n`, message: 'Enter Ed25519 node key', hint: 'Base64 encoded', initial: options.skipInitial ? undefined : generateTenderdashNodeKey(), diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js index 27c94a6caa5..13ba8e49706 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js @@ -37,7 +37,8 @@ function configureSSLCertificateTaskFactory( ctx.certificateProvider = await task.prompt({ type: 'select', - message: 'How do you prefer to configure SSL', + header: ``, + message: 'How do you want to configure SSL', choices, initial: SSL_PROVIDERS.ZEROSSL, }); diff --git a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js index 8355cebc6d6..72dda067f28 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js @@ -140,8 +140,9 @@ function setupRegularPresetTaskFactory( configFile.setDefaultConfigName(ctx.preset); // eslint-disable-next-line no-param-reassign - task.output = 'Your node configuration is now complete. You can now run `dashmate start` to start your node, and `dashmate status` for a status\n' - + 'overview of node health. Run `dashmate --help` or `dashmate --help` for quick help on how to use dashmate to manage your node.\n'; + task.output = `Node configuration completed successfully!\n + You can now run "dashmate start" to start your node, followed by "dashmate status" for a node health status overview.\n + Run "dashmate --help" or "dashmate --help" for quick help on how to use dashmate to manage your node.\n`; }, options: { persistentOutput: true, From 7c321a999ab8b1c14506468838fbddfd1b8b26f8 Mon Sep 17 00:00:00 2001 From: strophy Date: Thu, 23 Mar 2023 15:38:00 +0800 Subject: [PATCH 19/93] chore: adjust max line width to 80 --- packages/dashmate/src/commands/setup.js | 10 +++-- .../src/listr/prompts/createIpAndPortsForm.js | 6 ++- .../prompts/createPlatformNodeKeyInput.js | 6 ++- .../setup/setupRegularPresetTaskFactory.js | 42 ++++++++++--------- 4 files changed, 37 insertions(+), 27 deletions(-) diff --git a/packages/dashmate/src/commands/setup.js b/packages/dashmate/src/commands/setup.js index 116e44b2f5f..d0c72c108eb 100644 --- a/packages/dashmate/src/commands/setup.js +++ b/packages/dashmate/src/commands/setup.js @@ -55,7 +55,7 @@ class SetupCommand extends BaseCommand { type: 'select', header: ` Dashmate provides three default configuration presets: - local - Run a fully functional network environment on your machine for local development + local - Run a full network environment on your machine for local development testnet - Run a node connected to the Dash test network mainnet - Run a node connected to the Dash main network\n`, message: 'Select preset', @@ -75,9 +75,11 @@ class SetupCommand extends BaseCommand { if (isAlreadyConfigured) { task.output = `Preset ${ctx.preset} already configured. - To set up a node with this preset from scratch use "dashmate reset --config ${ctx.preset} --hard". Previous data and configuration for this preset will be lost. - If you want to keep existing data and configuration, please use the "dashmate config create" command to create a new configuration for this preset.`; - + To set up a node with this preset from scratch use "dashmate reset + --config ${ctx.preset} --hard". Previous data and configuration for this + preset will be lost. If you want to keep existing data and configuration, + please use the "dashmate config create" command to create a new configuration + for this preset.`; throw new Error(`Preset ${ctx.preset} already configured`); } else { // eslint-disable-next-line no-param-reassign diff --git a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js index 74431021a7a..a9b14144474 100644 --- a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js +++ b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js @@ -75,8 +75,10 @@ async function createIpAndPortsForm(network, options = {}) { return { type: 'form', name: 'ipAndPorts', - header: 'Dashmate needs to collect your external public static IP address and port information to use in the registration transaction.\n' - + 'You will need to ensure these ports are open and reachable from the public internet at this IP address in order to avoid PoSe bans.\n', + header: ` Dashmate needs to collect your external public static IP address and port + information to use in the registration transaction. You will need to ensure + these ports are open and reachable from the public internet at this IP address + in order to avoid PoSe bans.\n`, message: 'Enter IP address and ports:', choices: fields, validate: ({ diff --git a/packages/dashmate/src/listr/prompts/createPlatformNodeKeyInput.js b/packages/dashmate/src/listr/prompts/createPlatformNodeKeyInput.js index 2d30faab577..45a4634400c 100644 --- a/packages/dashmate/src/listr/prompts/createPlatformNodeKeyInput.js +++ b/packages/dashmate/src/listr/prompts/createPlatformNodeKeyInput.js @@ -12,8 +12,10 @@ function createPlatformNodeKeyInput(options = {}) { name: 'platformNodeKey', header: ` Dashmate needs to collect details on your Tenderdash node key. - This key is used to uniquely identify your Dash Platform node. The node key is derived from a standard Ed25519 cryptographic key pair, - presented in a cached formatd specific to Tenderdash. You can provide a key, or a new key will be automatically generated for you.\n`, + This key is used to uniquely identify your Dash Platform node. The node key is + derived from a standard Ed25519 cryptographic key pair, presented in a cached + format specific to Tenderdash. You can provide a key, or a new key will be + automatically generated for you.\n`, message: 'Enter Ed25519 node key', hint: 'Base64 encoded', initial: options.skipInitial ? undefined : generateTenderdashNodeKey(), diff --git a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js index 9cbc8fc8027..d7ad95e37f8 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js @@ -55,11 +55,14 @@ function setupRegularPresetTaskFactory( const nodeTypeName = await task.prompt([ { type: 'select', - header: ' The Dash network consists of several different node types:' - + ' \n Full node - Host a full copy of the Dash blockchain (no collateral required)' - + ' \n Masternode - Full node features, plus Core services such as ChainLocks and InstantSend (1000 DASH collateral)' - + ' \n High-performance full node - Full node features, plus host a full copy of the Platform blockchain (no collateral required)' - + ' \n High-performance masternode - Masternode features, plus Platform services such as DAPI and Drive (4000 DASH collateral)\n', + header: ` The Dash network consists of several different node types: + Full node - Host the full Dash blockchain (no collateral) + Masternode - Full node features, plus Core services such as + ChainLocks and InstantSend (1000 DASH collateral) + High-performance full node - Full node features, plus host a full copy of the + Platform blockchain (no collateral) + High-performance masternode - Masternode features, plus Platform services such + as DAPI and Drive (4000 DASH collateral)\n`, message: 'Select node type', choices: [ { name: NODE_TYPE_NAMES.FULLNODE }, @@ -94,19 +97,19 @@ function setupRegularPresetTaskFactory( task: async (ctx, task) => { let header; if (ctx.isHP === NODE_TYPE_HPMN) { - header = 'If your HP masternode is already registered, we will import your masternode' - + ' operator and platform node keys to configure an HP masternode.' - + ' Please make sure your IP address has not changed, otherwise you will need' - + ' to create a provider update service transaction.\n\n' - + ' If you are registering a new HP masternode, I will provide more information' - + ' and help you to generate the necessary keys.\n'; + header = ` If your HP masternode is already registered, we will import your masternode + operator and platform node keys to configure an HP masternode. Please make + sure your IP address has not changed, otherwise you will need to create a + provider update service transaction.\n\n + If you are registering a new HP masternode, dashmate will provide more + information and help you to generate the necessary keys.\n`; } else { - header = 'If your masternode is already registered, we will import your masternode' - + ' operator key to configure a masternode.' - + ' Please make sure your IP address has not changed, otherwise you will need' - + ' to create a provider update service transaction.\n\n' - + ' If you are registering a new masternode, I will provide more information' - + ' and help you to generate the necessary keys.\n'; + header = ` If your masternode is already registered, we will import your masternode + operator key to configure a masternode. Please make sure your IP address has + not changed, otherwise you will need to create a provider update service + transaction.\n\n + If you are registering a new masternode, dashmate will provide more + information and help you to generate the necessary keys.\n`; } ctx.isMasternodeRegistered = await task.prompt({ @@ -142,8 +145,9 @@ function setupRegularPresetTaskFactory( // eslint-disable-next-line no-param-reassign task.output = `Node configuration completed successfully!\n - You can now run "dashmate start" to start your node, followed by "dashmate status" for a node health status overview.\n - Run "dashmate --help" or "dashmate --help" for quick help on how to use dashmate to manage your node.\n`; + You can now run "dashmate start" to start your node, followed by "dashmate + status" for a node health status overview. Run "dashmate --help" or "dashmate + --help" for quick help on how to use dashmate to manage your node.\n`; }, options: { persistentOutput: true, From d2478d365680c1c5a96251e9a94a01d464cfdcd3 Mon Sep 17 00:00:00 2001 From: strophy Date: Thu, 23 Mar 2023 15:55:05 +0800 Subject: [PATCH 20/93] chore: more line length changes and new BLS key text --- .../setup/regular/configureNodeTaskFactory.js | 4 +++- .../regular/registerMasternodeGuideTaskFactory.js | 15 +++++++-------- .../tasks/setup/setupRegularPresetTaskFactory.js | 4 ++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js index b73f24e4191..dcc2c3d1b5b 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js @@ -35,7 +35,9 @@ function configureNodeTaskFactory() { if (ctx.nodeType === NODE_TYPE_MASTERNODE) { const masternodeOperatorPrivateKey = await task.prompt({ type: 'input', - header: 'Any suggestions where to get it?\n', + header: ` Your existing BLS private key can be found in the "dash.conf" file of your + masternode, in the DMT configuration tool, or in the safe location in which you + stored it when initially configuring your masternode.\n`, message: 'BLS private key', hint: 'HEX encoded', validate: validateBLSPrivateKey, diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index c73b627e979..716e67e2e79 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -41,13 +41,12 @@ function registerMasternodeGuideTaskFactory() { const registrar = await task.prompt([ { type: 'select', - header: 'For security reasons, Dash masternodes should never store masternode owner' - + ' or collateral private keys. Dashmate therefore cannot register a masternode for' - + ' you directly. Instead, we will generate RPC commands that you can use in' - + ' Dash Core or other external tools where keys are handled securely. During this' - + ' process, dashmate can optionally generate configuration elements as necessary,' - + ' such as the BLS operator key and the node id, since this is the' - + ' only information necessary for dashmate to configure the masternode.\n', + header: ` For security reasons, Dash masternodes should never store masternode owner or + collateral private keys. Dashmate therefore cannot register a masternode for you + directly. Instead, we will generate RPC commands that you can use in Dash Core + or other external tools where keys are handled securely. During this process, + dashmate can optionally generate configuration elements as necessary, such as + the BLS operator key and the node id.\n`, message: 'Which wallet will you use to store keys for your masternode?', choices: [ { name: REGISTRARS.CORE, message: 'Dash Core Wallet' }, @@ -181,7 +180,7 @@ function registerMasternodeGuideTaskFactory() { argument1 argument2 } - + Go with nope to come back to edit command\n`, message: 'Have you registered a masternode successfully?', enabled: 'Yep', diff --git a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js index d7ad95e37f8..a778bafaaf5 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js @@ -100,14 +100,14 @@ function setupRegularPresetTaskFactory( header = ` If your HP masternode is already registered, we will import your masternode operator and platform node keys to configure an HP masternode. Please make sure your IP address has not changed, otherwise you will need to create a - provider update service transaction.\n\n + provider update service transaction.\n If you are registering a new HP masternode, dashmate will provide more information and help you to generate the necessary keys.\n`; } else { header = ` If your masternode is already registered, we will import your masternode operator key to configure a masternode. Please make sure your IP address has not changed, otherwise you will need to create a provider update service - transaction.\n\n + transaction.\n If you are registering a new masternode, dashmate will provide more information and help you to generate the necessary keys.\n`; } From f0a3a1ca33736fd6ec83ce7cc325464e6e5c3bb5 Mon Sep 17 00:00:00 2001 From: strophy Date: Thu, 23 Mar 2023 16:15:25 +0800 Subject: [PATCH 21/93] chore: BLS key header --- .../listr/tasks/setup/regular/configureNodeTaskFactory.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js index dcc2c3d1b5b..008613a084a 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js @@ -35,9 +35,11 @@ function configureNodeTaskFactory() { if (ctx.nodeType === NODE_TYPE_MASTERNODE) { const masternodeOperatorPrivateKey = await task.prompt({ type: 'input', - header: ` Your existing BLS private key can be found in the "dash.conf" file of your - masternode, in the DMT configuration tool, or in the safe location in which you - stored it when initially configuring your masternode.\n`, + header: ` Please enter your existing BLS private key. + + Your BLS private key can be found in the "dash.conf" file of your masternode, + in the DMT configuration tool, or in the safe location in which you stored it + when initially configuring your masternode.\n`, message: 'BLS private key', hint: 'HEX encoded', validate: validateBLSPrivateKey, From 5b21b9048f2cd4fd1213180ed6759b9158c5a393 Mon Sep 17 00:00:00 2001 From: strophy Date: Thu, 23 Mar 2023 16:21:53 +0800 Subject: [PATCH 22/93] fix: Cannot read properties of undefined (reading 'core') --- .../src/listr/tasks/setup/regular/configureNodeTaskFactory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js index 008613a084a..3fc65802172 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js @@ -60,7 +60,7 @@ function configureNodeTaskFactory() { // IP and ports if (ctx.nodeType === NODE_TYPE_MASTERNODE) { - const form = await task.prompt(await createIpAndPortsForm({ + const form = await task.prompt(await createIpAndPortsForm(ctx.preset, { isHPMN: ctx.isHP, skipInitial: true, })); From 23c7dbadee8949cf0b6eecd225bc2faaf8934437 Mon Sep 17 00:00:00 2001 From: strophy Date: Thu, 23 Mar 2023 16:58:42 +0800 Subject: [PATCH 23/93] chore: show dynamic values for collateral funding --- .../registerMasternodeGuideTaskFactory.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index 716e67e2e79..85c664b2890 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -4,6 +4,13 @@ const chalk = require('chalk'); const BlsSignatures = require('@dashevo/bls'); +const { + NODE_TYPE_MASTERNODE, + MASTERNODE_COLLATERAL_AMOUNT, + HPMN_COLLATERAL_AMOUNT, + PRESET_MAINNET, +} = require('../../../../constants'); + const validateAddressHex = require('../../../prompts/validators/validateAddressHex'); const validateTxHex = require('../../../prompts/validators/validateTxHex'); const validatePositiveInteger = require('../../../prompts/validators/validatePositiveInteger'); @@ -68,13 +75,15 @@ function registerMasternodeGuideTaskFactory() { const validateAddressHexWithNetwork = (value) => validateAddressHex(value, ctx.preset); + const collateralAmount = ctx.nodeType === NODE_TYPE_MASTERNODE ? MASTERNODE_COLLATERAL_AMOUNT : HPMN_COLLATERAL_AMOUNT; + const collateralDenomination = ctx.preset === PRESET_MAINNET ? 'DASH' : 'tDASH'; + const prompts = [ { type: 'form', name: 'collateral', - header: 'Dashmate needs to collect details about your collateral funding' - + ' transaction. The funding value must be exactly 1000 DASH (masternode)' - + ' or 4000 DASH (high-performance masternode).\n', + header: ` Dashmate needs to collect your collateral funding transaction hash and index. + The funding value must be exactly ${collateralAmount} ${collateralDenomination}.\n`, message: 'Enter collateral funding transaction information:', choices: [ { @@ -163,7 +172,7 @@ function registerMasternodeGuideTaskFactory() { prompts.push(createPlatformNodeKeyInput()); } - prompts.push(await createIpAndPortsForm({ + prompts.push(await createIpAndPortsForm(ctx.preset, { isHPMN: ctx.isHP, })); From 4491109993f3e119780805ddd8958ba1c824c619 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 23 Mar 2023 17:03:59 +0800 Subject: [PATCH 24/93] fix: transaction hex validation --- packages/dashmate/src/listr/prompts/validators/validateTxHex.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dashmate/src/listr/prompts/validators/validateTxHex.js b/packages/dashmate/src/listr/prompts/validators/validateTxHex.js index 561a33de340..65a555f00bc 100644 --- a/packages/dashmate/src/listr/prompts/validators/validateTxHex.js +++ b/packages/dashmate/src/listr/prompts/validators/validateTxHex.js @@ -1,5 +1,5 @@ function validateTxHex(value) { - return Boolean(value.match(/$[0-9A-Fa-f]{64}^/)); + return Boolean(value.match(/^[0-9A-Fa-f]{64}$/)); } module.exports = validateTxHex; From fdf7ba874f201f77c6040f6b35ad30c2c6dcf4c8 Mon Sep 17 00:00:00 2001 From: strophy Date: Thu, 23 Mar 2023 17:16:45 +0800 Subject: [PATCH 25/93] chore: adjust line width for new masternode registration --- .../registerMasternodeGuideTaskFactory.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index 85c664b2890..2e4c51df8b8 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -103,9 +103,9 @@ function registerMasternodeGuideTaskFactory() { { type: 'form', name: 'keys', - header: 'Dashmate needs to collect details about the owner, voting and payout' - + ' addresses to use in the masternode registration transaction. These are' - + ' regular Dash addresses, encoded in HEX format.\n', + header: ` Dashmate needs to collect details about the owner, voting and payout addresses + to use in the masternode registration transaction. These are regular Dash + addresses, encoded in HEX format.\n`, message: 'Enter DIP3 masternode addresses:', choices: [ { @@ -140,12 +140,12 @@ function registerMasternodeGuideTaskFactory() { { type: 'form', name: 'operator', - header: 'Dashmate needs to collect details on the operator key and operator' - + ' reward share to use in the registration transaction. The operator key is' - + ' a BLS private key, encoded in HEX format. Dashmate will record the private' - + ' key in the masternode configuration, and derive the public key for use in' - + ' the masternode registration transaction. You may optionally also specify a' - + ' percentage share of the masternode reward to pay to the operator.\n', + header: ` Dashmate needs to collect details on the operator key and operator reward share + to use in the registration transaction. The operator key is a BLS private key, + encoded in HEX format. Dashmate will record the private key in the masternode + configuration, and derive the public key for use in the masternode registration + transaction. You may optionally also specify a percentage share of the + masternode reward to pay to the operator.\n`, message: 'Enter masternode operator private key and reward share:', choices: [ { From 7317e2b98d188db39929a34b61e78b92753133e4 Mon Sep 17 00:00:00 2001 From: strophy Date: Thu, 23 Mar 2023 17:44:06 +0800 Subject: [PATCH 26/93] chore: update registration guide address format and steps --- .../tasks/setup/regular/registerMasternodeGuideTaskFactory.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index 2e4c51df8b8..73a4c6b74d5 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -105,7 +105,7 @@ function registerMasternodeGuideTaskFactory() { name: 'keys', header: ` Dashmate needs to collect details about the owner, voting and payout addresses to use in the masternode registration transaction. These are regular Dash - addresses, encoded in HEX format.\n`, + addresses, encoded in base58 format.\n`, message: 'Enter DIP3 masternode addresses:', choices: [ { @@ -184,7 +184,7 @@ function registerMasternodeGuideTaskFactory() { confirmation = await task.prompt({ type: 'toggle', name: 'confirm', - header: chalk` You should run the command: + header: chalk` Now run the following command to create the registration transaction: {bold.green dash-cli ${ctx.isHP ? 'register_hpmn' : 'register'} argument1 argument2 From 3fa67767e06168cedf586961371d9732fd20ee7b Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 23 Mar 2023 17:45:22 +0800 Subject: [PATCH 27/93] fix: invalid addresses encoding format --- .pnp.cjs | 16 ------------ ...base-x-npm-4.0.0-64a1f6fa5e-b25db9e07e.zip | Bin 5124 -> 0 bytes .../bs58-npm-5.0.0-da02537b92-2475cb0684.zip | Bin 4045 -> 0 bytes packages/dashmate/package.json | 1 - .../prompts/validators/validateAddress.js | 13 ++++++++++ .../prompts/validators/validateAddressHex.js | 20 --------------- .../registerMasternodeGuideTaskFactory.js | 24 ++++++++++-------- yarn.lock | 17 ------------- 8 files changed, 26 insertions(+), 65 deletions(-) delete mode 100644 .yarn/cache/base-x-npm-4.0.0-64a1f6fa5e-b25db9e07e.zip delete mode 100644 .yarn/cache/bs58-npm-5.0.0-da02537b92-2475cb0684.zip create mode 100644 packages/dashmate/src/listr/prompts/validators/validateAddress.js delete mode 100644 packages/dashmate/src/listr/prompts/validators/validateAddressHex.js diff --git a/.pnp.cjs b/.pnp.cjs index 425d207a9ef..b3fa102e5ad 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -6156,13 +6156,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["safe-buffer", "npm:5.2.1"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:4.0.0", {\ - "packageLocation": "./.yarn/cache/base-x-npm-4.0.0-64a1f6fa5e-b25db9e07e.zip/node_modules/base-x/",\ - "packageDependencies": [\ - ["base-x", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["base64-js", [\ @@ -6524,14 +6517,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["base-x", "npm:3.0.9"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:5.0.0", {\ - "packageLocation": "./.yarn/cache/bs58-npm-5.0.0-da02537b92-2475cb0684.zip/node_modules/bs58/",\ - "packageDependencies": [\ - ["bs58", "npm:5.0.0"],\ - ["base-x", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["bson", [\ @@ -8035,7 +8020,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["ajv-formats", "virtual:58fb68f2aed20e5e0f2e48520ab903ae9bb3440369bfd5e912034003cf27c5aae368649fc5620dd2acbed578131f3a0975e75b838d77d12335fb0412e24026c6#npm:2.1.1"],\ ["awilix", "npm:4.3.4"],\ ["begoo", "npm:2.0.2"],\ - ["bs58", "npm:5.0.0"],\ ["chai", "npm:4.3.4"],\ ["chai-as-promised", "virtual:58fb68f2aed20e5e0f2e48520ab903ae9bb3440369bfd5e912034003cf27c5aae368649fc5620dd2acbed578131f3a0975e75b838d77d12335fb0412e24026c6#npm:7.1.1"],\ ["chalk", "npm:4.1.2"],\ diff --git a/.yarn/cache/base-x-npm-4.0.0-64a1f6fa5e-b25db9e07e.zip b/.yarn/cache/base-x-npm-4.0.0-64a1f6fa5e-b25db9e07e.zip deleted file mode 100644 index 421971c98eeb081e44d7c5a2aeb5e1a7ab8ee76a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5124 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 diff --git a/.yarn/cache/bs58-npm-5.0.0-da02537b92-2475cb0684.zip b/.yarn/cache/bs58-npm-5.0.0-da02537b92-2475cb0684.zip deleted file mode 100644 index 783d4d4cc61c35d53948932adc351dd5e7036476..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4045 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 diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index e608a95bc70..a740aebdb61 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -64,7 +64,6 @@ "ajv-formats": "^2.1.1", "awilix": "^4.2.6", "begoo": "^2.0.2", - "bs58": "^5.0.0", "chalk": "^4.1.0", "cron": "^2.1.0", "dash": "workspace:*", diff --git a/packages/dashmate/src/listr/prompts/validators/validateAddress.js b/packages/dashmate/src/listr/prompts/validators/validateAddress.js new file mode 100644 index 00000000000..b8f2a007911 --- /dev/null +++ b/packages/dashmate/src/listr/prompts/validators/validateAddress.js @@ -0,0 +1,13 @@ +const { Address } = require('@dashevo/dashcore-lib'); + +function validateAddress(value, network) { + try { + Address(value, network); + } catch (e) { + return false; + } + + return true; +} + +module.exports = validateAddress; diff --git a/packages/dashmate/src/listr/prompts/validators/validateAddressHex.js b/packages/dashmate/src/listr/prompts/validators/validateAddressHex.js deleted file mode 100644 index 21f61b78c84..00000000000 --- a/packages/dashmate/src/listr/prompts/validators/validateAddressHex.js +++ /dev/null @@ -1,20 +0,0 @@ -const { Address } = require('@dashevo/dashcore-lib'); -const bs58 = require('bs58'); - -function validateAddressHex(value, network) { - if (value.length === 0) { - return false; - } - - const base58value = bs58.encode(Buffer.from(value, 'hex')); - - try { - Address(base58value, network); - } catch (e) { - return false; - } - - return true; -} - -module.exports = validateAddressHex; diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index 85c664b2890..5ca70e7f7ea 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -11,7 +11,9 @@ const { PRESET_MAINNET, } = require('../../../../constants'); -const validateAddressHex = require('../../../prompts/validators/validateAddressHex'); +const systemConfigs = require('../../../../../configs/system'); + +const validateAddress = require('../../../prompts/validators/validateAddress'); const validateTxHex = require('../../../prompts/validators/validateTxHex'); const validatePositiveInteger = require('../../../prompts/validators/validatePositiveInteger'); const validatePercentage = require('../../../prompts/validators/validatePercentage'); @@ -73,7 +75,7 @@ function registerMasternodeGuideTaskFactory() { // TODO: We need to add description on how to find key generation form in the // specified wallet - const validateAddressHexWithNetwork = (value) => validateAddressHex(value, ctx.preset); + const validateAddressWithNetwork = (value) => validateAddress(value, ctx.preset); const collateralAmount = ctx.nodeType === NODE_TYPE_MASTERNODE ? MASTERNODE_COLLATERAL_AMOUNT : HPMN_COLLATERAL_AMOUNT; const collateralDenomination = ctx.preset === PRESET_MAINNET ? 'DASH' : 'tDASH'; @@ -110,21 +112,21 @@ function registerMasternodeGuideTaskFactory() { choices: [ { name: 'ownerAddress', - message: chalk` Owner address {gray HEX encoded}`, + message: chalk` Owner address {gray Base58 encoded}`, network: ctx.preset, - validate: validateAddressHexWithNetwork, + validate: validateAddressWithNetwork, }, { name: 'votingAddress', - message: chalk` Voting address {gray HEX encoded}`, + message: chalk` Voting address {gray Base58 encoded}`, network: ctx.preset, - validate: validateAddressHexWithNetwork, + validate: validateAddressWithNetwork, }, { name: 'payoutAddress', - message: chalk` Payout address {gray HEX encoded}`, + message: chalk` Payout address {gray Base58 encoded}`, network: ctx.preset, - validate: validateAddressHexWithNetwork, + validate: validateAddressWithNetwork, }, ], validate: ({ ownerAddress, votingAddress, payoutAddress }) => { @@ -132,9 +134,9 @@ function registerMasternodeGuideTaskFactory() { return 'The payout address may not be the same as the owner or voting address'; } - return validateAddressHexWithNetwork(ownerAddress) - && validateAddressHexWithNetwork(votingAddress) - && validateAddressHexWithNetwork(payoutAddress); + return validateAddressWithNetwork(ownerAddress) + && validateAddressWithNetwork(votingAddress) + && validateAddressWithNetwork(payoutAddress); }, }, { diff --git a/yarn.lock b/yarn.lock index d0cf9d12ef6..1ba804d01aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4318,13 +4318,6 @@ __metadata: languageName: node linkType: hard -"base-x@npm:^4.0.0": - version: 4.0.0 - resolution: "base-x@npm:4.0.0" - checksum: b25db9e07eb1998472a20557c7f00c797dc0595f79df95155ab74274e7fa98b9f2659b3ee547ac8773666b7f69540656793aeb97ad2b1ceccdb6fa5faaf69ac0 - languageName: node - linkType: hard - "base64-js@npm:^1.0.2, base64-js@npm:^1.3.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" @@ -4648,15 +4641,6 @@ __metadata: languageName: node linkType: hard -"bs58@npm:^5.0.0": - version: 5.0.0 - resolution: "bs58@npm:5.0.0" - dependencies: - base-x: ^4.0.0 - checksum: 2475cb0684e07077521aac718e604a13e0f891d58cff923d437a2f7e9e28703ab39fce9f84c7c703ab369815a675f11e3bd394d38643bfe8969fbe42e6833d45 - languageName: node - linkType: hard - "bson@npm:^1.1.4": version: 1.1.6 resolution: "bson@npm:1.1.6" @@ -5992,7 +5976,6 @@ __metadata: ajv-formats: ^2.1.1 awilix: ^4.2.6 begoo: ^2.0.2 - bs58: ^5.0.0 chai: ^4.3.4 chai-as-promised: ^7.1.1 chalk: ^4.1.0 From 52c52b60d0a495cd3b22b8534a0efc3baf0545ca Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 23 Mar 2023 17:55:09 +0800 Subject: [PATCH 28/93] feat: output command and store registered masternode config --- .../src/listr/prompts/createIpAndPortsForm.js | 3 + .../registerMasternodeGuideTaskFactory.js | 71 ++++++++++++++++--- 2 files changed, 63 insertions(+), 11 deletions(-) diff --git a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js index a9b14144474..41353a372ea 100644 --- a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js +++ b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js @@ -23,6 +23,7 @@ async function createIpAndPortsForm(network, options = {}) { initialIp = await publicIp.v4(); } + // TODO User input fo IP only? const fields = [ { name: 'ip', @@ -32,6 +33,8 @@ async function createIpAndPortsForm(network, options = {}) { }, ]; + // TODO: we can't use mainnet ports for other networks + if (network !== PRESET_MAINNET) { let initialCoreP2PPort; if (!options.skipInitial) { diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index 39176a1f247..2fa7431f013 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -22,6 +22,7 @@ const generateBlsKeys = require('../../../../core/generateBlsKeys'); const validateBLSPrivateKeyFactory = require('../../../prompts/validators/validateBLSPrivateKeyFactory'); const createPlatformNodeKeyInput = require('../../../prompts/createPlatformNodeKeyInput'); const createIpAndPortsForm = require('../../../prompts/createIpAndPortsForm'); +const createTenderdashNodeId = require('../../../../tenderdash/createTenderdashNodeId'); /** * @return {registerMasternodeGuideTask} @@ -183,14 +184,54 @@ function registerMasternodeGuideTaskFactory() { do { form = await task.prompt(prompts); + const operatorPrivateKeyBuffer = Buffer.from(form.operator.privateKey, 'hex'); + const operatorPrivateKey = blsSignatures.PrivateKey.fromBytes( + operatorPrivateKeyBuffer, + true, + ); + const operatorPublicKey = operatorPrivateKey.getG1(); + const operatorPublicKeyHex = Buffer.from(operatorPublicKey.serialize()).toString('hex'); + + const coreP2PPort = form.ipAndPorts.coreP2PPort + || systemConfigs[ctx.preset].core.p2p.port; + + const platformP2PPort = form.ipAndPorts.platformP2PPort + || systemConfigs[ctx.preset].platform.drive.tenderdash.p2p.port; + + const platformHTTPPort = form.ipAndPorts.platformHTTPPort + || systemConfigs[ctx.preset].platform.dapi.envoy.http.port; + + let command; + if (ctx.isHP) { + command = `dash-cli register_hpmn + ${form.collateral.txId} + ${form.collateral.outputIndex} + ${form.ipAndPorts.ip}:${coreP2PPort} + ${form.keys.ownerAddress} + ${operatorPublicKeyHex} + ${form.keys.votingAddress} + ${form.operator.rewardShare} + ${form.keys.payoutAddress} + ${createTenderdashNodeId(form.platformNodeKey)} + ${platformP2PPort} + ${platformHTTPPort}`; + } else { + command = `dash-cli register_hpmn + ${form.collateral.txId} + ${form.collateral.outputIndex} + ${form.ipAndPorts.ip}:${coreP2PPort} + ${form.keys.ownerAddress} + ${operatorPublicKeyHex} + ${form.keys.votingAddress} + ${form.operator.rewardShare} + ${form.keys.payoutAddress}`; + } + confirmation = await task.prompt({ type: 'toggle', name: 'confirm', header: chalk` Now run the following command to create the registration transaction: - {bold.green dash-cli ${ctx.isHP ? 'register_hpmn' : 'register'} - argument1 - argument2 - } + {bold.green ${command}} Go with nope to come back to edit command\n`, message: 'Have you registered a masternode successfully?', @@ -199,15 +240,23 @@ function registerMasternodeGuideTaskFactory() { }); } while (!confirmation); - // TODO: Store form information to the config - console.dir(form); + ctx.config.set('core.masternode.operator.privateKey', form.operator.privateKey); - // ctx.config.set('externalIp', form.ip); - // ctx.config.set('core.p2p.port', form.port); - // TODO: Derive node id from key - // config.set('platform.drive.tenderdash.nodeId', nodeId); + ctx.config.set('externalIp', form.ipAndPorts.ip); - // ctx.config.set('platform.drive.tenderdash.nodeKey', ctx.platformP2PKey); + if (ctx.isHP) { + ctx.config.set('platform.drive.tenderdash.node.id', createTenderdashNodeId(form.platformNodeKey)); + ctx.config.set('platform.drive.tenderdash.node.key', form.platformNodeKey); + } + + if (ctx.preset !== PRESET_MAINNET) { + ctx.config.set('core.p2p.port', form.ipAndPorts.coreP2PPort); + + if (ctx.isHP) { + ctx.config.set('platform.dapi.envoy.http.port', form.ipAndPorts.platformHTTPPort); + ctx.config.set('platform.drive.tenderdash.p2p.port', form.ipAndPorts.platformP2PPort); + } + } // TODO: Output configuration }, From 2feb8b71523c0dfafb450edabe37617b23bc9eb1 Mon Sep 17 00:00:00 2001 From: strophy Date: Thu, 23 Mar 2023 17:55:50 +0800 Subject: [PATCH 29/93] chore: adjust text around registration command --- .../setup/regular/registerMasternodeGuideTaskFactory.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index 39176a1f247..753829bfa9c 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -192,10 +192,10 @@ function registerMasternodeGuideTaskFactory() { argument2 } - Go with nope to come back to edit command\n`, - message: 'Have you registered a masternode successfully?', - enabled: 'Yep', - disabled: 'Nope', + Select "No" to modify the transaction by amending your previous input.\n`, + message: 'Was the masternode registration transaction successful?', + enabled: 'Yes', + disabled: 'No', }); } while (!confirmation); From bbd6e57a020c83266cd8a5f62eae9c0d18d31b77 Mon Sep 17 00:00:00 2001 From: strophy Date: Thu, 23 Mar 2023 17:57:22 +0800 Subject: [PATCH 30/93] fix: don't register standard masternode with register_hpmn --- .../tasks/setup/regular/registerMasternodeGuideTaskFactory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index 15ceb5c43e1..c68a8df3fa8 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -216,7 +216,7 @@ function registerMasternodeGuideTaskFactory() { ${platformP2PPort} ${platformHTTPPort}`; } else { - command = `dash-cli register_hpmn + command = `dash-cli register ${form.collateral.txId} ${form.collateral.outputIndex} ${form.ipAndPorts.ip}:${coreP2PPort} From 6b438d0ac92bd857769f077c7c397e5fb6d4cccb Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 23 Mar 2023 18:35:33 +0800 Subject: [PATCH 31/93] fix: config/platform must have required property 'dapi' --- packages/dashmate/configs/system/mainnet.js | 2 -- packages/dashmate/src/commands/setup.js | 1 + .../regular/registerMasternodeGuideTaskFactory.js | 4 +++- .../tasks/setup/setupRegularPresetTaskFactory.js | 12 ++++++++---- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/dashmate/configs/system/mainnet.js b/packages/dashmate/configs/system/mainnet.js index ba97455a5a2..6e69bc4cd6c 100644 --- a/packages/dashmate/configs/system/mainnet.js +++ b/packages/dashmate/configs/system/mainnet.js @@ -28,6 +28,4 @@ const mainnetConfig = lodashMerge({}, baseConfig, { network: NETWORK_MAINNET, }); -delete mainnetConfig.platform; - module.exports = mainnetConfig; diff --git a/packages/dashmate/src/commands/setup.js b/packages/dashmate/src/commands/setup.js index d0c72c108eb..d3f98743514 100644 --- a/packages/dashmate/src/commands/setup.js +++ b/packages/dashmate/src/commands/setup.js @@ -111,6 +111,7 @@ class SetupCommand extends BaseCommand { clearOutput: false, collapse: false, showSubtasks: true, + removeEmptyLines: false, }, }); diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index c68a8df3fa8..17795054ac6 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -76,6 +76,8 @@ function registerMasternodeGuideTaskFactory() { // TODO: We need to add description on how to find key generation form in the // specified wallet + // TODO: Deal with hints in forms + const validateAddressWithNetwork = (value) => validateAddress(value, ctx.preset); const collateralAmount = ctx.nodeType === NODE_TYPE_MASTERNODE ? MASTERNODE_COLLATERAL_AMOUNT : HPMN_COLLATERAL_AMOUNT; @@ -231,7 +233,7 @@ function registerMasternodeGuideTaskFactory() { type: 'toggle', name: 'confirm', header: chalk` Now run the following command to create the registration transaction: - {bold.green ${command}} + {bold.cyanBright ${command}} Select "No" to modify the transaction by amending your previous input.\n`, message: 'Was the masternode registration transaction successful?', diff --git a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js index a778bafaaf5..db4022c6f02 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js @@ -1,5 +1,7 @@ const { Listr } = require('listr2'); +const chalk = require('chalk'); + const { NODE_TYPE_MASTERNODE, PRESET_MAINNET, @@ -144,10 +146,12 @@ function setupRegularPresetTaskFactory( configFile.setDefaultConfigName(ctx.preset); // eslint-disable-next-line no-param-reassign - task.output = `Node configuration completed successfully!\n - You can now run "dashmate start" to start your node, followed by "dashmate - status" for a node health status overview. Run "dashmate --help" or "dashmate - --help" for quick help on how to use dashmate to manage your node.\n`; + task.output = chalk`Node configuration completed successfully! + + You can now run {bold.cyanBright dashmate start} to start your node, followed by {bold.cyanBright dashmate + status} for a node health status overview. + + Run {bold.cyanBright dashmate --help} or {bold.cyanBright dashmate --help} for quick help on how to use dashmate to manage your node.\n`; }, options: { persistentOutput: true, From 4b38f474c29c28e3eb69292a33795e5f458bfc08 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 23 Mar 2023 18:38:39 +0800 Subject: [PATCH 32/93] fix: externalIp option is not set in testnet config --- packages/dashmate/src/listr/tasks/startNodeTaskFactory.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/dashmate/src/listr/tasks/startNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/startNodeTaskFactory.js index bb5cf8c25b4..512d4f833ea 100644 --- a/packages/dashmate/src/listr/tasks/startNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/startNodeTaskFactory.js @@ -36,7 +36,9 @@ function startNodeTaskFactory( } // Check external IP is set - config.get('externalIp', true); + if (config.get('core.masternode.enable')) { + config.get('externalIp', true); + } const isMinerEnabled = config.get('core.miner.enable'); From 0333a9ce3d729286aabfab76742944182333db78 Mon Sep 17 00:00:00 2001 From: strophy Date: Thu, 23 Mar 2023 18:53:07 +0800 Subject: [PATCH 33/93] chore: adjust initial network presentation order --- packages/dashmate/src/commands/setup.js | 4 ++-- packages/dashmate/src/constants.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/dashmate/src/commands/setup.js b/packages/dashmate/src/commands/setup.js index d3f98743514..813aa6c55f8 100644 --- a/packages/dashmate/src/commands/setup.js +++ b/packages/dashmate/src/commands/setup.js @@ -55,9 +55,9 @@ class SetupCommand extends BaseCommand { type: 'select', header: ` Dashmate provides three default configuration presets: - local - Run a full network environment on your machine for local development + mainnet - Run a node connected to the Dash main network testnet - Run a node connected to the Dash test network - mainnet - Run a node connected to the Dash main network\n`, + local - Run a full network environment on your machine for local development\n`, message: 'Select preset', choices: PRESETS, initial: PRESET_MAINNET, diff --git a/packages/dashmate/src/constants.js b/packages/dashmate/src/constants.js index 919cdaac376..6ddadbaa973 100644 --- a/packages/dashmate/src/constants.js +++ b/packages/dashmate/src/constants.js @@ -9,9 +9,9 @@ const networks = { }; const presets = { - PRESET_LOCAL: 'local', - PRESET_TESTNET: 'testnet', PRESET_MAINNET: 'mainnet', + PRESET_TESTNET: 'testnet', + PRESET_LOCAL: 'local', }; const nodeTypes = { From 0d93a2c0a6e8273463eb73fc0962aeb0147aa8c8 Mon Sep 17 00:00:00 2001 From: strophy Date: Thu, 23 Mar 2023 19:21:25 +0800 Subject: [PATCH 34/93] chore: add colour to preset already configured output --- packages/dashmate/src/commands/setup.js | 12 ++++++------ .../tasks/setup/setupRegularPresetTaskFactory.js | 10 ++++++---- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/packages/dashmate/src/commands/setup.js b/packages/dashmate/src/commands/setup.js index 813aa6c55f8..4b35b810382 100644 --- a/packages/dashmate/src/commands/setup.js +++ b/packages/dashmate/src/commands/setup.js @@ -74,12 +74,12 @@ class SetupCommand extends BaseCommand { } if (isAlreadyConfigured) { - task.output = `Preset ${ctx.preset} already configured. - To set up a node with this preset from scratch use "dashmate reset - --config ${ctx.preset} --hard". Previous data and configuration for this - preset will be lost. If you want to keep existing data and configuration, - please use the "dashmate config create" command to create a new configuration - for this preset.`; + task.output = chalk`Preset {bold ${ctx.preset}} already configured. + + To set up a node with this preset from scratch use {bold.cyanBright dashmate reset --config ${ctx.preset} --hard}. + Previous data and configuration for this preset will be lost. If you want to keep existing + data and configuration, please use the {bold.cyanBright dashmate config create} command to create a new + configuration for this preset.`; throw new Error(`Preset ${ctx.preset} already configured`); } else { // eslint-disable-next-line no-param-reassign diff --git a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js index db4022c6f02..6a7691410cb 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js @@ -57,6 +57,7 @@ function setupRegularPresetTaskFactory( const nodeTypeName = await task.prompt([ { type: 'select', + // Keep this order, because each item references the text in the previous item header: ` The Dash network consists of several different node types: Full node - Host the full Dash blockchain (no collateral) Masternode - Full node features, plus Core services such as @@ -148,10 +149,11 @@ function setupRegularPresetTaskFactory( // eslint-disable-next-line no-param-reassign task.output = chalk`Node configuration completed successfully! - You can now run {bold.cyanBright dashmate start} to start your node, followed by {bold.cyanBright dashmate - status} for a node health status overview. - - Run {bold.cyanBright dashmate --help} or {bold.cyanBright dashmate --help} for quick help on how to use dashmate to manage your node.\n`; + You can now run {bold.cyanBright dashmate start} to start your node, followed by + {bold.cyanBright dashmate status} for a node health status overview. + + Run {bold.cyanBright dashmate --help} or {bold.cyanBright dashmate --help} for quick help on how + to use dashmate to manage your node.\n`; }, options: { persistentOutput: true, From a53287c8f1802267e5c362c10b4248c926e67ac4 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 23 Mar 2023 19:43:28 +0800 Subject: [PATCH 35/93] fix: cannot resolve -externalip address: 'null' --- packages/dashmate/templates/core/dash.conf.dot | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/dashmate/templates/core/dash.conf.dot b/packages/dashmate/templates/core/dash.conf.dot index cc81ce4c2b4..92fadfc8110 100644 --- a/packages/dashmate/templates/core/dash.conf.dot +++ b/packages/dashmate/templates/core/dash.conf.dot @@ -22,8 +22,10 @@ rpcthreads=16 listen=1 dnsseed=0 allowprivatenet=0 +{{? it.externalip }} externalip={{=it.externalIp}} -{{? it.network === 'local'}} +{{?}} +{{? it.network === 'local' && it.externalIp }} whitelist={{=it.externalIp}} {{?}} From 89628073426a1cdb1d6534c22065f7a16457dda7 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 23 Mar 2023 20:09:02 +0800 Subject: [PATCH 36/93] feat: show mainnet ports --- .../src/listr/prompts/createIpAndPortsForm.js | 79 +++++++++++++------ .../registerMasternodeGuideTaskFactory.js | 20 ++--- .../src/listr/tasks/startNodeTaskFactory.js | 2 +- 3 files changed, 62 insertions(+), 39 deletions(-) diff --git a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js index 41353a372ea..6ebc434aafe 100644 --- a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js +++ b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js @@ -23,31 +23,56 @@ async function createIpAndPortsForm(network, options = {}) { initialIp = await publicIp.v4(); } - // TODO User input fo IP only? + const mainnetCfg = systemConfigs[PRESET_MAINNET]; + + let initialCoreP2PPort; + if (!options.skipInitial || network === PRESET_MAINNET) { + initialCoreP2PPort = mainnetCfg.core.p2p.port.toString(); + } + + function validateCoreP2PPort(value) { + if (network !== PRESET_MAINNET + && value === mainnetCfg.core.p2p.port.toString()) { + return false; + } + + return validatePort(value); + } + + function validatePlatformP2PPort(value) { + if (network !== PRESET_MAINNET + && value === mainnetCfg.platform.drive.tenderdash.p2p.port.toString()) { + return false; + } + + return validatePort(value); + } + + function validatePlatformHTTPPort(value) { + if (network !== PRESET_MAINNET + && value === mainnetCfg.platform.drive.tenderdash.p2p.port.toString()) { + return false; + } + + return validatePort(value); + } + const fields = [ { name: 'ip', - message: 'External IP address IPv4', + message: 'External IP address', + hint: 'IPv4', initial: initialIp, validate: validateIPv4, }, - ]; - - // TODO: we can't use mainnet ports for other networks - - if (network !== PRESET_MAINNET) { - let initialCoreP2PPort; - if (!options.skipInitial) { - initialCoreP2PPort = systemConfigs[network].core.p2p.port.toString(); - } - - fields.push({ + { name: 'coreP2PPort', - message: 'Core P2P Port', + message: 'Core P2P port', initial: initialCoreP2PPort, - validate: validatePort, - }); - } + validate: validateCoreP2PPort, + disabled: network === PRESET_MAINNET, + }, + ]; if (options.isHPMN) { let initialPlatformP2PPort; @@ -59,7 +84,8 @@ async function createIpAndPortsForm(network, options = {}) { name: 'platformP2PPort', message: 'Platform P2P port', initial: initialPlatformP2PPort, - validate: validatePort, + validate: validatePlatformP2PPort, + disabled: network === PRESET_MAINNET, }); let initialPlatformHTTPPort; @@ -71,7 +97,8 @@ async function createIpAndPortsForm(network, options = {}) { name: 'platformHTTPPort', message: 'Platform HTTP port', initial: initialPlatformHTTPPort, - validate: validatePort, + validate: validatePlatformHTTPPort, + disabled: network === PRESET_MAINNET, }); } @@ -90,10 +117,6 @@ async function createIpAndPortsForm(network, options = {}) { platformP2PPort, platformHTTPPort, }) => { - if (network === PRESET_MAINNET) { - return validateIPv4(ip); - } - if (options.isHPMN) { if (coreP2PPort === platformP2PPort || coreP2PPort === platformHTTPPort @@ -102,8 +125,14 @@ async function createIpAndPortsForm(network, options = {}) { } } - return validateIPv4(ip) && validatePort(coreP2PPort) - && (!options.isHPMN || (validatePort(platformP2PPort) && validatePort(platformHTTPPort))); + return validateIPv4(ip) && validateCoreP2PPort(coreP2PPort) + && ( + !options.isHPMN + || ( + validatePlatformP2PPort(platformP2PPort) + && validatePlatformHTTPPort(platformHTTPPort) + ) + ); }, }; } diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index 17795054ac6..52fc1aee2ee 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -78,6 +78,8 @@ function registerMasternodeGuideTaskFactory() { // TODO: Deal with hints in forms + // TODO: When registering a new masternode, if registration transaction was not successful, then going back through the previous steps should already contain the previously filled in information + const validateAddressWithNetwork = (value) => validateAddress(value, ctx.preset); const collateralAmount = ctx.nodeType === NODE_TYPE_MASTERNODE ? MASTERNODE_COLLATERAL_AMOUNT : HPMN_COLLATERAL_AMOUNT; @@ -194,9 +196,6 @@ function registerMasternodeGuideTaskFactory() { const operatorPublicKey = operatorPrivateKey.getG1(); const operatorPublicKeyHex = Buffer.from(operatorPublicKey.serialize()).toString('hex'); - const coreP2PPort = form.ipAndPorts.coreP2PPort - || systemConfigs[ctx.preset].core.p2p.port; - const platformP2PPort = form.ipAndPorts.platformP2PPort || systemConfigs[ctx.preset].platform.drive.tenderdash.p2p.port; @@ -208,7 +207,7 @@ function registerMasternodeGuideTaskFactory() { command = `dash-cli register_hpmn ${form.collateral.txId} ${form.collateral.outputIndex} - ${form.ipAndPorts.ip}:${coreP2PPort} + ${form.ipAndPorts.ip}:${form.ipAndPorts.coreP2PPort} ${form.keys.ownerAddress} ${operatorPublicKeyHex} ${form.keys.votingAddress} @@ -221,7 +220,7 @@ function registerMasternodeGuideTaskFactory() { command = `dash-cli register ${form.collateral.txId} ${form.collateral.outputIndex} - ${form.ipAndPorts.ip}:${coreP2PPort} + ${form.ipAndPorts.ip}:${form.ipAndPorts.coreP2PPort} ${form.keys.ownerAddress} ${operatorPublicKeyHex} ${form.keys.votingAddress} @@ -245,19 +244,14 @@ function registerMasternodeGuideTaskFactory() { ctx.config.set('core.masternode.operator.privateKey', form.operator.privateKey); ctx.config.set('externalIp', form.ipAndPorts.ip); + ctx.config.set('core.p2p.port', form.ipAndPorts.coreP2PPort); if (ctx.isHP) { ctx.config.set('platform.drive.tenderdash.node.id', createTenderdashNodeId(form.platformNodeKey)); ctx.config.set('platform.drive.tenderdash.node.key', form.platformNodeKey); - } - if (ctx.preset !== PRESET_MAINNET) { - ctx.config.set('core.p2p.port', form.ipAndPorts.coreP2PPort); - - if (ctx.isHP) { - ctx.config.set('platform.dapi.envoy.http.port', form.ipAndPorts.platformHTTPPort); - ctx.config.set('platform.drive.tenderdash.p2p.port', form.ipAndPorts.platformP2PPort); - } + ctx.config.set('platform.dapi.envoy.http.port', form.ipAndPorts.platformHTTPPort); + ctx.config.set('platform.drive.tenderdash.p2p.port', form.ipAndPorts.platformP2PPort); } // TODO: Output configuration diff --git a/packages/dashmate/src/listr/tasks/startNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/startNodeTaskFactory.js index 512d4f833ea..9e112c99721 100644 --- a/packages/dashmate/src/listr/tasks/startNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/startNodeTaskFactory.js @@ -43,7 +43,7 @@ function startNodeTaskFactory( const isMinerEnabled = config.get('core.miner.enable'); if (isMinerEnabled === true && config.get('network') !== NETWORK_LOCAL) { - throw new Error(`'core.miner.enabled' option only works with local network. Your network is ${config.get('network')}.`); + throw new Error(`'core.miner.enable' option only works with local network. Your network is ${config.get('network')}.`); } // Check Drive log files are created From 9aa7dcfd385448e840dd6a88bd758e5cc63a8931 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 23 Mar 2023 20:15:57 +0800 Subject: [PATCH 37/93] feat: use hint for forms --- .../src/listr/prompts/createIpAndPortsForm.js | 4 ++-- .../registerMasternodeGuideTaskFactory.js | 18 ++++++++++-------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js index 6ebc434aafe..3d737756468 100644 --- a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js +++ b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js @@ -42,7 +42,7 @@ async function createIpAndPortsForm(network, options = {}) { function validatePlatformP2PPort(value) { if (network !== PRESET_MAINNET && value === mainnetCfg.platform.drive.tenderdash.p2p.port.toString()) { - return false; + return 'this port is reserved for mainnet'; } return validatePort(value); @@ -51,7 +51,7 @@ async function createIpAndPortsForm(network, options = {}) { function validatePlatformHTTPPort(value) { if (network !== PRESET_MAINNET && value === mainnetCfg.platform.drive.tenderdash.p2p.port.toString()) { - return false; + return 'this port is reserved for mainnet'; } return validatePort(value); diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index 52fc1aee2ee..2dca446fa6e 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -117,20 +117,20 @@ function registerMasternodeGuideTaskFactory() { choices: [ { name: 'ownerAddress', - message: chalk` Owner address {gray Base58 encoded}`, - network: ctx.preset, + message: 'Owner address', + hint: 'Base58 encoded', validate: validateAddressWithNetwork, }, { name: 'votingAddress', - message: chalk` Voting address {gray Base58 encoded}`, - network: ctx.preset, + message: 'Voting address', + hint: 'Base58 encoded', validate: validateAddressWithNetwork, }, { name: 'payoutAddress', - message: chalk` Payout address {gray Base58 encoded}`, - network: ctx.preset, + message: 'Payout address', + hint: 'Base58 encoded', validate: validateAddressWithNetwork, }, ], @@ -157,13 +157,15 @@ function registerMasternodeGuideTaskFactory() { choices: [ { name: 'privateKey', - message: chalk`BLS private key {gray HEX encoded}`, + message: 'BLS private key', + hint: 'HEX encoded', initial: initialOperatorPrivateKey, validate: validateBLSPrivateKey, }, { name: 'rewardShare', - message: chalk`Reward share %`, + message: 'Reward share', + hint: '%', initial: '0.00', validate: validatePercentage, format: formatPercentage, From ad64bc2f5e11cc8f9cbce3f7838e4dec4ff3fe32 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 23 Mar 2023 23:20:21 +0800 Subject: [PATCH 38/93] feat: output configuration --- .../core/getBLSPublicKeyFromPrivateKeyHex.js | 22 ++++++++++++ .../src/listr/prompts/createIpAndPortsForm.js | 20 +++++------ .../setup/regular/configureNodeTaskFactory.js | 20 ++++++----- .../configureSSLCertificateTaskFactory.js | 1 + .../getConfigurationOutputFromContext.js | 36 +++++++++++++++++++ .../registerMasternodeGuideTaskFactory.js | 25 ++++++++----- 6 files changed, 96 insertions(+), 28 deletions(-) create mode 100644 packages/dashmate/src/core/getBLSPublicKeyFromPrivateKeyHex.js create mode 100644 packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js diff --git a/packages/dashmate/src/core/getBLSPublicKeyFromPrivateKeyHex.js b/packages/dashmate/src/core/getBLSPublicKeyFromPrivateKeyHex.js new file mode 100644 index 00000000000..62d02f9f047 --- /dev/null +++ b/packages/dashmate/src/core/getBLSPublicKeyFromPrivateKeyHex.js @@ -0,0 +1,22 @@ +const BlsSignatures = require('@dashevo/bls'); + +/** + * @param {string} privateKeyHex + * @returns {Promise} + */ +async function getBLSPublicKeyFromPrivateKeyHex(privateKeyHex) { + const { PrivateKey } = await BlsSignatures(); + + const operatorPrivateKeyBuffer = Buffer.from(privateKeyHex, 'hex'); + + const operatorPrivateKey = PrivateKey.fromBytes( + operatorPrivateKeyBuffer, + true, + ); + + const operatorPublicKey = operatorPrivateKey.getG1(); + + return Buffer.from(operatorPublicKey.serialize()).toString('hex'); +} + +module.exports = getBLSPublicKeyFromPrivateKeyHex; diff --git a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js index 3d737756468..937f7760813 100644 --- a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js +++ b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js @@ -18,18 +18,8 @@ const { * @returns {Object} */ async function createIpAndPortsForm(network, options = {}) { - let initialIp; - if (!options.skipInitial) { - initialIp = await publicIp.v4(); - } - const mainnetCfg = systemConfigs[PRESET_MAINNET]; - let initialCoreP2PPort; - if (!options.skipInitial || network === PRESET_MAINNET) { - initialCoreP2PPort = mainnetCfg.core.p2p.port.toString(); - } - function validateCoreP2PPort(value) { if (network !== PRESET_MAINNET && value === mainnetCfg.core.p2p.port.toString()) { @@ -57,6 +47,16 @@ async function createIpAndPortsForm(network, options = {}) { return validatePort(value); } + let initialIp; + if (!options.skipInitial) { + initialIp = await publicIp.v4(); + } + + let initialCoreP2PPort; + if (!options.skipInitial || network === PRESET_MAINNET) { + initialCoreP2PPort = mainnetCfg.core.p2p.port.toString(); + } + const fields = [ { name: 'ip', diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js index 3fc65802172..4383350bdbf 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js @@ -13,6 +13,7 @@ const validateBLSPrivateKeyFactory = require('../../../prompts/validators/valida const createPlatformNodeKeyInput = require('../../../prompts/createPlatformNodeKeyInput'); const createIpAndPortsForm = require('../../../prompts/createIpAndPortsForm'); const createTenderdashNodeId = require('../../../../tenderdash/createTenderdashNodeId'); +const getConfigurationOutputFromContext = require('./getConfigurationOutputFromContext'); function configureNodeTaskFactory() { /** @@ -62,22 +63,23 @@ function configureNodeTaskFactory() { if (ctx.nodeType === NODE_TYPE_MASTERNODE) { const form = await task.prompt(await createIpAndPortsForm(ctx.preset, { isHPMN: ctx.isHP, - skipInitial: true, + skipInitial: ctx.preset !== PRESET_MAINNET, })); ctx.config.set('externalIp', form.ip); + ctx.config.set('core.p2p.port', form.coreP2PPort); - if (ctx.preset !== PRESET_MAINNET) { - ctx.config.set('core.p2p.port', form.coreP2PPort); - - if (ctx.isHP) { - ctx.config.set('platform.dapi.envoy.http.port', form.platformHTTPPort); - ctx.config.set('platform.drive.tenderdash.p2p.port', form.platformP2PPort); - } + if (ctx.isHP) { + ctx.config.set('platform.dapi.envoy.http.port', form.platformHTTPPort); + ctx.config.set('platform.drive.tenderdash.p2p.port', form.platformP2PPort); } } - // TODO: Output configuration + // eslint-disable-next-line no-param-reassign + task.output = await getConfigurationOutputFromContext(ctx); + }, + options: { + persistentOutput: true, }, }, ]); diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js index 13ba8e49706..14d59d3451c 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js @@ -26,6 +26,7 @@ function configureSSLCertificateTaskFactory( return new Listr([ { task: async (ctx, task) => { + // TODO Move to upper function to show output in upper task? const choices = [ { name: SSL_PROVIDERS.ZEROSSL, message: 'ZeroSSL' }, { name: SSL_PROVIDERS.FILE, message: 'File on disk' }, diff --git a/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js b/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js new file mode 100644 index 00000000000..6bade9a070c --- /dev/null +++ b/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js @@ -0,0 +1,36 @@ +const chalk = require('chalk'); + +const { NODE_TYPE_MASTERNODE } = require('../../../../constants'); +const getBLSPublicKeyFromPrivateKeyHex = require('../../../../core/getBLSPublicKeyFromPrivateKeyHex'); + +async function getConfigurationOutputFromContext(ctx) { + let output = ''; + if (ctx.nodeType === NODE_TYPE_MASTERNODE) { + const publicKeyHex = await getBLSPublicKeyFromPrivateKeyHex( + ctx.config.get('core.masternode.operator.privateKey'), + ); + + output += chalk`Operator Public key: ${publicKeyHex} + Operator Private key: *** - use {blue.cyanBright dashmate config get core.masternode.operator.privateKey}\n\n`; + } + + if (ctx.isHP) { + if (output === '') { + output += '\n\n'; + } + output += chalk`Platform Node ID: ${ctx.config.get('platform.drive.tenderdash.node.id')} + Platform Node key: *** - use {blue.cyanBright dashmate config get platform.drive.tenderdash.node.key}\n\n`; + } + + output += `External IP: ${ctx.config.get('externalIp') || 'auto'} + Core P2P port: ${ctx.config.get('core.p2p.port')}`; + + if (ctx.isHP) { + output += `\n\nPlatform P2P port: ${ctx.config.get('platform.drive.tenderdash.p2p.port')} + Platform HTTP port: ${ctx.config.get('platform.dapi.envoy.http.port')}`; + } + + return output; +} + +module.exports = getConfigurationOutputFromContext; diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index 2dca446fa6e..9f279d33753 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -23,6 +23,8 @@ const validateBLSPrivateKeyFactory = require('../../../prompts/validators/valida const createPlatformNodeKeyInput = require('../../../prompts/createPlatformNodeKeyInput'); const createIpAndPortsForm = require('../../../prompts/createIpAndPortsForm'); const createTenderdashNodeId = require('../../../../tenderdash/createTenderdashNodeId'); +const getConfigurationOutputFromContext = require('./getConfigurationOutputFromContext'); +const getBLSPublicKeyFromPrivateKeyHex = require('../../../../core/getBLSPublicKeyFromPrivateKeyHex'); /** * @return {registerMasternodeGuideTask} @@ -78,11 +80,16 @@ function registerMasternodeGuideTaskFactory() { // TODO: Deal with hints in forms - // TODO: When registering a new masternode, if registration transaction was not successful, then going back through the previous steps should already contain the previously filled in information + // TODO: When registering a new masternode, if registration transaction was not + // successful,then going back through the previous steps should already contain + // the previously filled in information const validateAddressWithNetwork = (value) => validateAddress(value, ctx.preset); - const collateralAmount = ctx.nodeType === NODE_TYPE_MASTERNODE ? MASTERNODE_COLLATERAL_AMOUNT : HPMN_COLLATERAL_AMOUNT; + const collateralAmount = ctx.nodeType === NODE_TYPE_MASTERNODE + ? MASTERNODE_COLLATERAL_AMOUNT + : HPMN_COLLATERAL_AMOUNT; + const collateralDenomination = ctx.preset === PRESET_MAINNET ? 'DASH' : 'tDASH'; const prompts = [ @@ -190,13 +197,9 @@ function registerMasternodeGuideTaskFactory() { do { form = await task.prompt(prompts); - const operatorPrivateKeyBuffer = Buffer.from(form.operator.privateKey, 'hex'); - const operatorPrivateKey = blsSignatures.PrivateKey.fromBytes( - operatorPrivateKeyBuffer, - true, + const operatorPublicKeyHex = await getBLSPublicKeyFromPrivateKeyHex( + form.operator.privateKey, ); - const operatorPublicKey = operatorPrivateKey.getG1(); - const operatorPublicKeyHex = Buffer.from(operatorPublicKey.serialize()).toString('hex'); const platformP2PPort = form.ipAndPorts.platformP2PPort || systemConfigs[ctx.preset].platform.drive.tenderdash.p2p.port; @@ -256,7 +259,11 @@ function registerMasternodeGuideTaskFactory() { ctx.config.set('platform.drive.tenderdash.p2p.port', form.ipAndPorts.platformP2PPort); } - // TODO: Output configuration + // eslint-disable-next-line no-param-reassign + task.output = await getConfigurationOutputFromContext(ctx); + }, + options: { + persistentOutput: true, }, }, ]); From f9ed02e4b78d7975f37a6379af6adbc8069cc69b Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Thu, 23 Mar 2023 23:24:05 +0800 Subject: [PATCH 39/93] docs: add todo --- .../tasks/setup/regular/configureSSLCertificateTaskFactory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js index 14d59d3451c..ecb72a9315b 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js @@ -38,7 +38,7 @@ function configureSSLCertificateTaskFactory( ctx.certificateProvider = await task.prompt({ type: 'select', - header: ``, + header: 'Something about why do we need SSL', message: 'How do you want to configure SSL', choices, initial: SSL_PROVIDERS.ZEROSSL, From b6ac14308880e497a09957a7fcfe921f6a2920b4 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 24 Mar 2023 13:55:02 +0800 Subject: [PATCH 40/93] fix: invalid testnet ports --- packages/dashmate/configs/system/testnet.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/dashmate/configs/system/testnet.js b/packages/dashmate/configs/system/testnet.js index dc1bc6bf109..ef653e29148 100644 --- a/packages/dashmate/configs/system/testnet.js +++ b/packages/dashmate/configs/system/testnet.js @@ -27,6 +27,13 @@ module.exports = lodashMerge({}, baseConfig, { }, }, platform: { + dapi: { + envoy: { + http: { + port: 1443, + }, + }, + }, drive: { abci: { log: { @@ -44,14 +51,15 @@ module.exports = lodashMerge({}, baseConfig, { { id: '74907790a03b51ac062c8a1453dafd72a08668a3', host: '34.209.100.240', - port: 26656, + port: 36656, }, { id: '2006632eb20e670923d13d4f53abc24468eaad4d', host: '54.213.254.17', - port: 26656, + port: 36656, }, ], + port: 36656, }, genesis: { genesis_time: '2021-07-22T12:57:05.429Z', From df9a452ff0fe1ca3ff96bdc75054c00fec67d062 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 24 Mar 2023 13:55:43 +0800 Subject: [PATCH 41/93] fix: invalid initial form values --- .../src/listr/prompts/createIpAndPortsForm.js | 15 +++++++++------ .../listr/prompts/createPlatformNodeKeyInput.js | 4 ++-- .../listr/prompts/formatters/formatPercentage.js | 2 +- .../setup/regular/configureNodeTaskFactory.js | 7 +++++-- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js index 937f7760813..d77550bac4b 100644 --- a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js +++ b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js @@ -13,7 +13,10 @@ const { * @typedef {createIpAndPortsForm} * @param {string} network * @param {Object} [options] - * @param {Object} [options.skipInitial=false] + * @param {string} [options.initialIp] + * @param {string} [options.initialCoreP2PPort] + * @param {string} [options.initialPlatformP2PPort] + * @param {string} [options.initialPlatformHTTPPort] * @param {Object} [options.isHPMN=false] * @returns {Object} */ @@ -48,13 +51,13 @@ async function createIpAndPortsForm(network, options = {}) { } let initialIp; - if (!options.skipInitial) { + if (options.initialIp !== '' || !options.initialIp) { initialIp = await publicIp.v4(); } let initialCoreP2PPort; - if (!options.skipInitial || network === PRESET_MAINNET) { - initialCoreP2PPort = mainnetCfg.core.p2p.port.toString(); + if (options.initialCoreP2PPort !== '' || !options.initialCoreP2PPort || network === PRESET_MAINNET) { + initialCoreP2PPort = systemConfigs[network].core.p2p.port.toString(); } const fields = [ @@ -76,7 +79,7 @@ async function createIpAndPortsForm(network, options = {}) { if (options.isHPMN) { let initialPlatformP2PPort; - if (!options.skipInitial) { + if (options.initialPlatformP2PPort !== '' || !options.initialPlatformP2PPort || network === PRESET_MAINNET) { initialPlatformP2PPort = systemConfigs[network].platform.drive.tenderdash.p2p.port.toString(); } @@ -89,7 +92,7 @@ async function createIpAndPortsForm(network, options = {}) { }); let initialPlatformHTTPPort; - if (!options.skipInitial) { + if (options.initialPlatformHTTPPort !== '' || !options.initialPlatformHTTPPort || network === PRESET_MAINNET) { initialPlatformHTTPPort = systemConfigs[network].platform.dapi.envoy.http.port.toString(); } diff --git a/packages/dashmate/src/listr/prompts/createPlatformNodeKeyInput.js b/packages/dashmate/src/listr/prompts/createPlatformNodeKeyInput.js index 45a4634400c..3b0905bd2c7 100644 --- a/packages/dashmate/src/listr/prompts/createPlatformNodeKeyInput.js +++ b/packages/dashmate/src/listr/prompts/createPlatformNodeKeyInput.js @@ -3,7 +3,7 @@ const validateTenderdashNodeKey = require('./validators/validateTenderdashNodeKe /** * @param {Object} [options] - * @param {boolean} [options.skipInitial=false] + * @param {string} [options.initial] * @returns {Object} */ function createPlatformNodeKeyInput(options = {}) { @@ -18,7 +18,7 @@ function createPlatformNodeKeyInput(options = {}) { automatically generated for you.\n`, message: 'Enter Ed25519 node key', hint: 'Base64 encoded', - initial: options.skipInitial ? undefined : generateTenderdashNodeKey(), + initial: options.initial === '' || options.initial ? options.initial : generateTenderdashNodeKey(), validate: validateTenderdashNodeKey, }; } diff --git a/packages/dashmate/src/listr/prompts/formatters/formatPercentage.js b/packages/dashmate/src/listr/prompts/formatters/formatPercentage.js index b01482d4f20..3aad4c268dd 100644 --- a/packages/dashmate/src/listr/prompts/formatters/formatPercentage.js +++ b/packages/dashmate/src/listr/prompts/formatters/formatPercentage.js @@ -4,7 +4,7 @@ function formatPercentage(input, choice) { let str; const number = Number(input); - if (Number.isNaN(number) || number.toFixed(2).length < input.length) { + if (input === '' || Number.isNaN(number) || number.toFixed(2).length < input.length) { str = input; } else { str = number.toFixed(2); diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js index 4383350bdbf..3ff72b467c7 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js @@ -36,7 +36,7 @@ function configureNodeTaskFactory() { if (ctx.nodeType === NODE_TYPE_MASTERNODE) { const masternodeOperatorPrivateKey = await task.prompt({ type: 'input', - header: ` Please enter your existing BLS private key. + header: ` Please enter your Masternode Operator BLS Private key. Your BLS private key can be found in the "dash.conf" file of your masternode, in the DMT configuration tool, or in the safe location in which you stored it @@ -63,7 +63,10 @@ function configureNodeTaskFactory() { if (ctx.nodeType === NODE_TYPE_MASTERNODE) { const form = await task.prompt(await createIpAndPortsForm(ctx.preset, { isHPMN: ctx.isHP, - skipInitial: ctx.preset !== PRESET_MAINNET, + initialIp: '', + initialCoreP2PPort: ctx.preset !== PRESET_MAINNET ? '' : undefined, + initialPlatformHTTPPort: ctx.preset !== PRESET_MAINNET ? '' : undefined, + initialPlatformP2PPort: ctx.preset !== PRESET_MAINNET ? '' : undefined, })); ctx.config.set('externalIp', form.ip); From 80e957d5a332d24c35be4427491b8cb742c70fcf Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 24 Mar 2023 13:56:02 +0800 Subject: [PATCH 42/93] feat: show previous input --- .../registerMasternodeGuideTaskFactory.js | 258 ++++++++++-------- 1 file changed, 137 insertions(+), 121 deletions(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index 9f279d33753..78dfa5a8144 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -80,10 +80,6 @@ function registerMasternodeGuideTaskFactory() { // TODO: Deal with hints in forms - // TODO: When registering a new masternode, if registration transaction was not - // successful,then going back through the previous steps should already contain - // the previously filled in information - const validateAddressWithNetwork = (value) => validateAddress(value, ctx.preset); const collateralAmount = ctx.nodeType === NODE_TYPE_MASTERNODE @@ -92,171 +88,191 @@ function registerMasternodeGuideTaskFactory() { const collateralDenomination = ctx.preset === PRESET_MAINNET ? 'DASH' : 'tDASH'; - const prompts = [ - { - type: 'form', - name: 'collateral', - header: ` Dashmate needs to collect your collateral funding transaction hash and index. + let state = { + collateral: {}, + keys: {}, + operator: {}, + ipAndPorts: {}, + }; + + let confirmation; + do { + const prompts = [ + { + type: 'form', + name: 'collateral', + header: ` Dashmate needs to collect your collateral funding transaction hash and index. The funding value must be exactly ${collateralAmount} ${collateralDenomination}.\n`, - message: 'Enter collateral funding transaction information:', - choices: [ - { - name: 'txId', - message: 'Transaction hash', - validate: validateTxHex, - }, - { - name: 'outputIndex', - message: 'Output index', - validate: validatePositiveInteger, - }, - ], - validate: ({ txId, outputIndex }) => validateTxHex(txId) - && validatePositiveInteger(outputIndex), - }, - { - type: 'form', - name: 'keys', - header: ` Dashmate needs to collect details about the owner, voting and payout addresses + message: 'Enter collateral funding transaction information:', + choices: [ + { + name: 'txId', + message: 'Transaction hash', + validate: validateTxHex, + initial: state.collateral.txId, + }, + { + name: 'outputIndex', + message: 'Output index', + validate: validatePositiveInteger, + initial: state.collateral.outputIndex, + }, + ], + validate: ({ txId, outputIndex }) => validateTxHex(txId) + && validatePositiveInteger(outputIndex), + }, + { + type: 'form', + name: 'keys', + header: ` Dashmate needs to collect details about the owner, voting and payout addresses to use in the masternode registration transaction. These are regular Dash addresses, encoded in base58 format.\n`, - message: 'Enter DIP3 masternode addresses:', - choices: [ - { - name: 'ownerAddress', - message: 'Owner address', - hint: 'Base58 encoded', - validate: validateAddressWithNetwork, - }, - { - name: 'votingAddress', - message: 'Voting address', - hint: 'Base58 encoded', - validate: validateAddressWithNetwork, + message: 'Enter DIP3 masternode addresses:', + choices: [ + { + name: 'ownerAddress', + message: 'Owner address', + hint: 'Base58 encoded', + validate: validateAddressWithNetwork, + initial: state.keys.ownerAddress, + }, + { + name: 'votingAddress', + message: 'Voting address', + hint: 'Base58 encoded', + validate: validateAddressWithNetwork, + initial: state.keys.votingAddress, + }, + { + name: 'payoutAddress', + message: 'Payout address', + hint: 'Base58 encoded', + validate: validateAddressWithNetwork, + initial: state.keys.payoutAddress, + }, + ], + validate: ({ ownerAddress, votingAddress, payoutAddress }) => { + if (ownerAddress === payoutAddress || votingAddress === payoutAddress) { + return 'The payout address may not be the same as the owner or voting address'; + } + + return validateAddressWithNetwork(ownerAddress) + && validateAddressWithNetwork(votingAddress) + && validateAddressWithNetwork(payoutAddress); }, - { - name: 'payoutAddress', - message: 'Payout address', - hint: 'Base58 encoded', - validate: validateAddressWithNetwork, - }, - ], - validate: ({ ownerAddress, votingAddress, payoutAddress }) => { - if (ownerAddress === payoutAddress || votingAddress === payoutAddress) { - return 'The payout address may not be the same as the owner or voting address'; - } - - return validateAddressWithNetwork(ownerAddress) - && validateAddressWithNetwork(votingAddress) - && validateAddressWithNetwork(payoutAddress); }, - }, - { - type: 'form', - name: 'operator', - header: ` Dashmate needs to collect details on the operator key and operator reward share + { + type: 'form', + name: 'operator', + header: ` Dashmate needs to collect details on the operator key and operator reward share to use in the registration transaction. The operator key is a BLS private key, encoded in HEX format. Dashmate will record the private key in the masternode configuration, and derive the public key for use in the masternode registration transaction. You may optionally also specify a percentage share of the masternode reward to pay to the operator.\n`, - message: 'Enter masternode operator private key and reward share:', - choices: [ - { - name: 'privateKey', - message: 'BLS private key', - hint: 'HEX encoded', - initial: initialOperatorPrivateKey, - validate: validateBLSPrivateKey, - }, - { - name: 'rewardShare', - message: 'Reward share', - hint: '%', - initial: '0.00', - validate: validatePercentage, - format: formatPercentage, - result: (value) => Number(value).toFixed(2), - }, - ], - validate: ({ privateKey, rewardShare }) => validateBLSPrivateKey(privateKey) - && validatePercentage(rewardShare), - }, - ]; + message: 'Enter masternode operator private key and reward share:', + choices: [ + { + name: 'privateKey', + message: 'BLS private key', + hint: 'HEX encoded', + initial: state.operator.privateKey || initialOperatorPrivateKey, + validate: validateBLSPrivateKey, + }, + { + name: 'rewardShare', + message: 'Reward share', + hint: '%', + initial: state.operator.rewardShare || '0.00', + validate: validatePercentage, + format: formatPercentage, + result: (value) => Number(value).toFixed(2), + }, + ], + validate: ({ privateKey, rewardShare }) => validateBLSPrivateKey(privateKey) + && validatePercentage(rewardShare), + }, + ]; - if (ctx.isHP) { - prompts.push(createPlatformNodeKeyInput()); - } + if (ctx.isHP) { + prompts.push(createPlatformNodeKeyInput({ + initial: state.platformNodeKey, + })); + } - prompts.push(await createIpAndPortsForm(ctx.preset, { - isHPMN: ctx.isHP, - })); + prompts.push(await createIpAndPortsForm(ctx.preset, { + isHPMN: ctx.isHP, + initialIp: state.ipAndPorts.ip, + initialCoreP2PPort: state.ipAndPorts.coreP2PPort, + initialPlatformP2PPort: state.ipAndPorts.platformP2PPort, + initialPlatformHTTPPort: state.ipAndPorts.platformHTTPPort, + })); - let form; - let confirmation; - do { - form = await task.prompt(prompts); + state = await task.prompt(prompts); const operatorPublicKeyHex = await getBLSPublicKeyFromPrivateKeyHex( - form.operator.privateKey, + state.operator.privateKey, ); - const platformP2PPort = form.ipAndPorts.platformP2PPort + const platformP2PPort = state.ipAndPorts.platformP2PPort || systemConfigs[ctx.preset].platform.drive.tenderdash.p2p.port; - const platformHTTPPort = form.ipAndPorts.platformHTTPPort + const platformHTTPPort = state.ipAndPorts.platformHTTPPort || systemConfigs[ctx.preset].platform.dapi.envoy.http.port; let command; if (ctx.isHP) { command = `dash-cli register_hpmn - ${form.collateral.txId} - ${form.collateral.outputIndex} - ${form.ipAndPorts.ip}:${form.ipAndPorts.coreP2PPort} - ${form.keys.ownerAddress} + ${state.collateral.txId} + ${state.collateral.outputIndex} + ${state.ipAndPorts.ip}:${state.ipAndPorts.coreP2PPort} + ${state.keys.ownerAddress} ${operatorPublicKeyHex} - ${form.keys.votingAddress} - ${form.operator.rewardShare} - ${form.keys.payoutAddress} - ${createTenderdashNodeId(form.platformNodeKey)} + ${state.keys.votingAddress} + ${state.operator.rewardShare} + ${state.keys.payoutAddress} + ${createTenderdashNodeId(state.platformNodeKey)} ${platformP2PPort} ${platformHTTPPort}`; } else { command = `dash-cli register - ${form.collateral.txId} - ${form.collateral.outputIndex} - ${form.ipAndPorts.ip}:${form.ipAndPorts.coreP2PPort} - ${form.keys.ownerAddress} + ${state.collateral.txId} + ${state.collateral.outputIndex} + ${state.ipAndPorts.ip}:${state.ipAndPorts.coreP2PPort} + ${state.keys.ownerAddress} ${operatorPublicKeyHex} - ${form.keys.votingAddress} - ${form.operator.rewardShare} - ${form.keys.payoutAddress}`; + ${state.keys.votingAddress} + ${state.operator.rewardShare} + ${state.keys.payoutAddress}`; } + // TODO: We need to give more info on how to run this command + confirmation = await task.prompt({ type: 'toggle', name: 'confirm', header: chalk` Now run the following command to create the registration transaction: + {bold.cyanBright ${command}} - Select "No" to modify the transaction by amending your previous input.\n`, + Select "No" to modify the command by amending your previous input.\n`, message: 'Was the masternode registration transaction successful?', enabled: 'Yes', disabled: 'No', }); } while (!confirmation); - ctx.config.set('core.masternode.operator.privateKey', form.operator.privateKey); + ctx.config.set('core.masternode.operator.privateKey', state.operator.privateKey); - ctx.config.set('externalIp', form.ipAndPorts.ip); - ctx.config.set('core.p2p.port', form.ipAndPorts.coreP2PPort); + ctx.config.set('externalIp', state.ipAndPorts.ip); + ctx.config.set('core.p2p.port', state.ipAndPorts.coreP2PPort); if (ctx.isHP) { - ctx.config.set('platform.drive.tenderdash.node.id', createTenderdashNodeId(form.platformNodeKey)); - ctx.config.set('platform.drive.tenderdash.node.key', form.platformNodeKey); + ctx.config.set('platform.drive.tenderdash.node.id', createTenderdashNodeId(state.platformNodeKey)); + ctx.config.set('platform.drive.tenderdash.node.key', state.platformNodeKey); - ctx.config.set('platform.dapi.envoy.http.port', form.ipAndPorts.platformHTTPPort); - ctx.config.set('platform.drive.tenderdash.p2p.port', form.ipAndPorts.platformP2PPort); + ctx.config.set('platform.dapi.envoy.http.port', state.ipAndPorts.platformHTTPPort); + ctx.config.set('platform.drive.tenderdash.p2p.port', state.ipAndPorts.platformP2PPort); } // eslint-disable-next-line no-param-reassign From e0242e58b9384ec02f7dbb7f0d4521ada9292e57 Mon Sep 17 00:00:00 2001 From: strophy Date: Fri, 24 Mar 2023 15:27:39 +0800 Subject: [PATCH 43/93] fix: incorrect collateral amount when selecting HPMN --- .../setup/regular/registerMasternodeGuideTaskFactory.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index 78dfa5a8144..208d777bef2 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -82,9 +82,9 @@ function registerMasternodeGuideTaskFactory() { const validateAddressWithNetwork = (value) => validateAddress(value, ctx.preset); - const collateralAmount = ctx.nodeType === NODE_TYPE_MASTERNODE - ? MASTERNODE_COLLATERAL_AMOUNT - : HPMN_COLLATERAL_AMOUNT; + const collateralAmount = ctx.isHP === true + ? HPMN_COLLATERAL_AMOUNT + : MASTERNODE_COLLATERAL_AMOUNT; const collateralDenomination = ctx.preset === PRESET_MAINNET ? 'DASH' : 'tDASH'; From 3ab41d56f8f0862ba3cbf5d52f2d34fc481e806a Mon Sep 17 00:00:00 2001 From: strophy Date: Fri, 24 Mar 2023 15:47:45 +0800 Subject: [PATCH 44/93] chore: adjust spaces, line breaks and asterisks --- packages/dashmate/src/commands/setup.js | 6 +++--- .../setup/regular/getConfigurationOutputFromContext.js | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/dashmate/src/commands/setup.js b/packages/dashmate/src/commands/setup.js index 4b35b810382..ea218f69fd4 100644 --- a/packages/dashmate/src/commands/setup.js +++ b/packages/dashmate/src/commands/setup.js @@ -77,9 +77,9 @@ class SetupCommand extends BaseCommand { task.output = chalk`Preset {bold ${ctx.preset}} already configured. To set up a node with this preset from scratch use {bold.cyanBright dashmate reset --config ${ctx.preset} --hard}. - Previous data and configuration for this preset will be lost. If you want to keep existing - data and configuration, please use the {bold.cyanBright dashmate config create} command to create a new - configuration for this preset.`; + Previous data and configuration for this preset will be lost. If you want to + keep existing data and configuration, please use the {bold.cyanBright dashmate config create} + command to create a new configuration for this preset.`; throw new Error(`Preset ${ctx.preset} already configured`); } else { // eslint-disable-next-line no-param-reassign diff --git a/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js b/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js index 6bade9a070c..a7d64e9cb2f 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js @@ -11,7 +11,7 @@ async function getConfigurationOutputFromContext(ctx) { ); output += chalk`Operator Public key: ${publicKeyHex} - Operator Private key: *** - use {blue.cyanBright dashmate config get core.masternode.operator.privateKey}\n\n`; + Operator Private key: ******** - view with {bold.cyanBright dashmate config get core.masternode.operator.privateKey}\n\n`; } if (ctx.isHP) { @@ -19,7 +19,7 @@ async function getConfigurationOutputFromContext(ctx) { output += '\n\n'; } output += chalk`Platform Node ID: ${ctx.config.get('platform.drive.tenderdash.node.id')} - Platform Node key: *** - use {blue.cyanBright dashmate config get platform.drive.tenderdash.node.key}\n\n`; + Platform Node key: ******** - view with {bold.cyanBright dashmate config get platform.drive.tenderdash.node.key}\n\n`; } output += `External IP: ${ctx.config.get('externalIp') || 'auto'} From 7037860cbec8334f8a7ffe9f9ba88e51b35419b6 Mon Sep 17 00:00:00 2001 From: strophy Date: Fri, 24 Mar 2023 15:47:56 +0800 Subject: [PATCH 45/93] chore: write zerossl header text --- .../regular/configureSSLCertificateTaskFactory.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js index ecb72a9315b..f66bec52635 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js @@ -38,7 +38,16 @@ function configureSSLCertificateTaskFactory( ctx.certificateProvider = await task.prompt({ type: 'select', - header: 'Something about why do we need SSL', + header: ` High-performance masternodes are required use TLS encryption on the DAPI + endpoint through which they service the network. This encryption is achieved + by loading an SSL certificate signed against the IP address specified in the + registration transaction. The certificate should be recognized by common web + browsers, and must therefore be issued by a well-known Certificate Authority + (CA). Dashmate offers three options to configure this certificate: + + ZeroSSL - Provide a (free) ZeroSSL API key and let dashmate configure the certificate + File on disk - Provide your own certificate to dashmate + Self-signed - Generate your own self-signed certificate (testnet only)\n`, message: 'How do you want to configure SSL', choices, initial: SSL_PROVIDERS.ZEROSSL, From 3d4806b3fddee18756f2af43613e2f6204dabdde Mon Sep 17 00:00:00 2001 From: strophy Date: Fri, 24 Mar 2023 15:52:14 +0800 Subject: [PATCH 46/93] chore: remove unused variable --- .../tasks/setup/regular/registerMasternodeGuideTaskFactory.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index 208d777bef2..8812817c63a 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -5,7 +5,6 @@ const chalk = require('chalk'); const BlsSignatures = require('@dashevo/bls'); const { - NODE_TYPE_MASTERNODE, MASTERNODE_COLLATERAL_AMOUNT, HPMN_COLLATERAL_AMOUNT, PRESET_MAINNET, @@ -252,7 +251,7 @@ function registerMasternodeGuideTaskFactory() { type: 'toggle', name: 'confirm', header: chalk` Now run the following command to create the registration transaction: - + {bold.cyanBright ${command}} Select "No" to modify the command by amending your previous input.\n`, From 2b7d202a951e7e65777cfa714ed42243a842c401 Mon Sep 17 00:00:00 2001 From: strophy Date: Fri, 24 Mar 2023 18:48:36 +0800 Subject: [PATCH 47/93] chore: change setup to set up --- packages/dashmate/src/listr/tasks/ssl/VerificationServer.js | 2 +- .../tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/dashmate/src/listr/tasks/ssl/VerificationServer.js b/packages/dashmate/src/listr/tasks/ssl/VerificationServer.js index d6e3e47d634..0e27cbac5fd 100644 --- a/packages/dashmate/src/listr/tasks/ssl/VerificationServer.js +++ b/packages/dashmate/src/listr/tasks/ssl/VerificationServer.js @@ -20,7 +20,7 @@ class VerificationServer { } /** - * Setup verification server + * Set up verification server * * @param {Config} config * @param {string} route diff --git a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js index 7f71263d71e..f36cf12516e 100644 --- a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js @@ -45,7 +45,7 @@ function obtainZeroSSLCertificateTaskFactory( }, }, { - title: 'Setup verification server', + title: 'Set up verification server', task: async (ctx) => { const validationResponse = ctx.response.validation.other_methods[config.get('externalIp')]; const route = validationResponse.file_validation_url_http.replace(`http://${config.get('externalIp')}`, ''); From 9d03a43c5ec7f1ae29c3d6084d9391b276f43657 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 24 Mar 2023 19:05:15 +0800 Subject: [PATCH 48/93] feat: prettify ssl steps output --- .../configs/schema/configJsonSchema.js | 2 +- .../prompts/validators/validateFileExists.js | 2 + .../configureSSLCertificateTaskFactory.js | 118 ++++++++++-------- .../getConfigurationOutputFromContext.js | 2 +- .../setup/setupRegularPresetTaskFactory.js | 5 +- 5 files changed, 70 insertions(+), 59 deletions(-) diff --git a/packages/dashmate/configs/schema/configJsonSchema.js b/packages/dashmate/configs/schema/configJsonSchema.js index 3853862705b..7aceb78dde8 100644 --- a/packages/dashmate/configs/schema/configJsonSchema.js +++ b/packages/dashmate/configs/schema/configJsonSchema.js @@ -319,7 +319,7 @@ module.exports = { }, provider: { type: 'string', - enum: ['zerossl', 'selfSigned', 'manual'], + enum: ['zerossl', 'selfSigned', 'file'], }, providerConfigs: { type: 'object', diff --git a/packages/dashmate/src/listr/prompts/validators/validateFileExists.js b/packages/dashmate/src/listr/prompts/validators/validateFileExists.js index aa54e79896f..68222470fef 100644 --- a/packages/dashmate/src/listr/prompts/validators/validateFileExists.js +++ b/packages/dashmate/src/listr/prompts/validators/validateFileExists.js @@ -1,6 +1,8 @@ const fs = require('fs'); function validateFileExists(value) { + // TODO: We should make sure that file is accessable + // TODO: We should make sure it's a file not a directory if (fs.existsSync(value)) { return true; } diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js index f66bec52635..bcb315630cf 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js @@ -23,42 +23,41 @@ function configureSSLCertificateTaskFactory( * @returns {Listr} */ function configureSSLCertificateTask() { - return new Listr([ - { + const providerTasks = { + [SSL_PROVIDERS.FILE]: { + title: 'Set SSL certificate file', + enabled: (ctx) => ctx.certificateProvider === SSL_PROVIDERS.FILE, task: async (ctx, task) => { - // TODO Move to upper function to show output in upper task? - const choices = [ - { name: SSL_PROVIDERS.ZEROSSL, message: 'ZeroSSL' }, - { name: SSL_PROVIDERS.FILE, message: 'File on disk' }, - ]; - - if (ctx.preset !== PRESET_MAINNET) { - choices.push({ name: SSL_PROVIDERS.SELF_SIGNED, message: 'Self-signed' }); - } - ctx.certificateProvider = await task.prompt({ - type: 'select', - header: ` High-performance masternodes are required use TLS encryption on the DAPI - endpoint through which they service the network. This encryption is achieved - by loading an SSL certificate signed against the IP address specified in the - registration transaction. The certificate should be recognized by common web - browsers, and must therefore be issued by a well-known Certificate Authority - (CA). Dashmate offers three options to configure this certificate: - - ZeroSSL - Provide a (free) ZeroSSL API key and let dashmate configure the certificate - File on disk - Provide your own certificate to dashmate - Self-signed - Generate your own self-signed certificate (testnet only)\n`, - message: 'How do you want to configure SSL', - choices, - initial: SSL_PROVIDERS.ZEROSSL, + const form = await task.prompt({ + type: 'form', + message: 'Provide paths to your certificate files', + choices: [ + { + name: 'chainFile', + message: 'Path to certificate chain file', + validate: validateFileExists, + }, + { + name: 'privateFile', + message: 'Path to private file', + validate: validateFileExists, + }, + ], + validate: ({ chainFile, privateFile }) => validateFileExists(chainFile) + && validateFileExists(privateFile), }); - ctx.config.set('platform.dapi.envoy.ssl.provider', ctx.certificateProvider); + ctx.certificate = fs.readFileSync(form.chainFile, 'utf8'); + ctx.keyPair = { + privateKey: fs.readFileSync(form.privateFile, 'utf8'), + }; + + return saveCertificateTask(ctx.config); }, }, - { + [SSL_PROVIDERS.ZEROSSL]: { title: 'Obtain ZeroSSL certificate', - enabled: (ctx) => ctx.certificateProvider === SSL_PROVIDERS.ZEROSSL, task: async (ctx, task) => { const apiKey = await task.prompt({ type: 'input', @@ -81,36 +80,49 @@ function configureSSLCertificateTaskFactory( return obtainZeroSSLCertificateTask(ctx.config); }, }, + }; + + return new Listr([ { - title: 'Set SSL certificate file', - enabled: (ctx) => ctx.certificateProvider === SSL_PROVIDERS.FILE, + title: 'Configure SSL certificate', task: async (ctx, task) => { + // TODO Move to upper function to show output in upper task? + const choices = [ + { name: SSL_PROVIDERS.ZEROSSL, message: 'ZeroSSL' }, + { name: SSL_PROVIDERS.FILE, message: 'File on disk' }, + ]; - const form = await task.prompt({ - type: 'form', - message: 'Provide paths to your certificate files', - choices: [ - { - name: 'chainFile', - message: 'Path to certificate chain file', - validate: validateFileExists, - }, - { - name: 'privateFile', - message: 'Path to private file', - validate: validateFileExists, - }, - ], - validate: ({ chainFile, privateFile }) => validateFileExists(chainFile) - && validateFileExists(privateFile), + if (ctx.preset !== PRESET_MAINNET) { + choices.push({ name: SSL_PROVIDERS.SELF_SIGNED, message: 'Self-signed' }); + } + + ctx.certificateProvider = await task.prompt({ + type: 'select', + header: ` High-performance masternodes are required use TLS encryption on the DAPI + endpoint through which they service the network. This encryption is achieved + by loading an SSL certificate signed against the IP address specified in the + registration transaction. The certificate should be recognized by common web + browsers, and must therefore be issued by a well-known Certificate Authority + (CA). Dashmate offers three options to configure this certificate: + + ZeroSSL - Provide a (free) ZeroSSL API key and let dashmate configure the certificate + File on disk - Provide your own certificate to dashmate + Self-signed - Generate your own self-signed certificate (testnet only)\n`, + message: 'How do you want to configure SSL?', + choices, + initial: SSL_PROVIDERS.ZEROSSL, }); - ctx.certificate = fs.readFileSync(form.chainFile, 'utf8'); - ctx.keyPair = { - privateKey: fs.readFileSync(form.privateFile, 'utf8'), - }; + ctx.config.set('platform.dapi.envoy.ssl.provider', ctx.certificateProvider); - return saveCertificateTask(ctx.config); + // eslint-disable-next-line no-param-reassign + task.output = ctx.certificateProvider; + + return new Listr([providerTasks[ctx.certificateProvider]]); + }, + options: { + persistentOutput: true, + collapse: true, }, }, ]); diff --git a/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js b/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js index a7d64e9cb2f..707e91e8ae7 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js @@ -15,7 +15,7 @@ async function getConfigurationOutputFromContext(ctx) { } if (ctx.isHP) { - if (output === '') { + if (output !== '') { output += '\n\n'; } output += chalk`Platform Node ID: ${ctx.config.get('platform.drive.tenderdash.node.id')} diff --git a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js index 6a7691410cb..c4df5e7c43b 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js @@ -133,12 +133,9 @@ function setupRegularPresetTaskFactory( task: () => configureNodeTask(), }, { - title: 'Configure SSL certificate', // TODO: We don't need certificates for mainnet since we don't run platform there on // first version - enabled: (ctx) => ctx.nodeType === NODE_TYPE_MASTERNODE - && ctx.isHP - && ctx.preset !== PRESET_MAINNET, + enabled: (ctx) => ctx.isHP && ctx.preset !== PRESET_MAINNET, task: () => configureSSLCertificateTask(), }, { From 9b951c20b60905822216f45702388feff3201fa1 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 24 Mar 2023 19:30:51 +0800 Subject: [PATCH 49/93] refactor: use new `isPlatformEnabled` --- packages/dashmate/src/commands/setup.js | 5 +++-- .../setup/regular/configureSSLCertificateTaskFactory.js | 1 - .../src/listr/tasks/setup/setupRegularPresetTaskFactory.js | 4 +--- .../tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js | 1 + 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/dashmate/src/commands/setup.js b/packages/dashmate/src/commands/setup.js index ea218f69fd4..244b52efeab 100644 --- a/packages/dashmate/src/commands/setup.js +++ b/packages/dashmate/src/commands/setup.js @@ -77,8 +77,9 @@ class SetupCommand extends BaseCommand { task.output = chalk`Preset {bold ${ctx.preset}} already configured. To set up a node with this preset from scratch use {bold.cyanBright dashmate reset --config ${ctx.preset} --hard}. - Previous data and configuration for this preset will be lost. If you want to - keep existing data and configuration, please use the {bold.cyanBright dashmate config create} + Previous data and configuration for this preset will be lost. + + If you want to keep existing data and configuration, please use the {bold.cyanBright dashmate config create} command to create a new configuration for this preset.`; throw new Error(`Preset ${ctx.preset} already configured`); } else { diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js index bcb315630cf..28416473fbf 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js @@ -28,7 +28,6 @@ function configureSSLCertificateTaskFactory( title: 'Set SSL certificate file', enabled: (ctx) => ctx.certificateProvider === SSL_PROVIDERS.FILE, task: async (ctx, task) => { - const form = await task.prompt({ type: 'form', message: 'Provide paths to your certificate files', diff --git a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js index c4df5e7c43b..4c33bf2536e 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js @@ -133,9 +133,7 @@ function setupRegularPresetTaskFactory( task: () => configureNodeTask(), }, { - // TODO: We don't need certificates for mainnet since we don't run platform there on - // first version - enabled: (ctx) => ctx.isHP && ctx.preset !== PRESET_MAINNET, + enabled: (ctx) => ctx.config.isPlatformEnabled(), task: () => configureSSLCertificateTask(), }, { diff --git a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js index f36cf12516e..47e727fef4b 100644 --- a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js @@ -60,6 +60,7 @@ function obtainZeroSSLCertificateTaskFactory( }, { title: 'Verify IP', + // TODO: If it doesn't work we should ask to open 80 port and retry task: async (ctx) => verifyDomain(ctx.response.id, config.get('platform.dapi.envoy.ssl.providerConfigs.zerossl.apiKey')), }, { From 78dff6c8a32da658901a7a78174415e2e6f639b8 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 24 Mar 2023 20:29:48 +0800 Subject: [PATCH 50/93] feat: retry ip address validation --- .../obtainZeroSSLCertificateTaskFactory.js | 27 +++++++++++++++++-- packages/dashmate/src/ssl/generateKeyPair.js | 2 +- .../dashmate/src/ssl/zerossl/verifyDomain.js | 2 +- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js index 47e727fef4b..55905e1fe94 100644 --- a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js @@ -1,5 +1,7 @@ const { Listr } = require('listr2'); +const chalk = require('chalk'); + /** * @param {generateCsr} generateCsr * @param {generateKeyPair} generateKeyPair @@ -60,8 +62,29 @@ function obtainZeroSSLCertificateTaskFactory( }, { title: 'Verify IP', - // TODO: If it doesn't work we should ask to open 80 port and retry - task: async (ctx) => verifyDomain(ctx.response.id, config.get('platform.dapi.envoy.ssl.providerConfigs.zerossl.apiKey')), + task: async (ctx, task) => { + let retry; + do { + try { + await verifyDomain(ctx.response.id, config.get('platform.dapi.envoy.ssl.providerConfigs.zerossl.apiKey')); + } catch (e) { + retry = await task.prompt({ + type: 'toggle', + header: chalk`An error occurred during verification: {red ${e.message}} + + Please make sure that your IP address ${config.get('externalIp')} and port 80 are accessible from internet`, + message: 'Try again?', + enabled: 'Yes', + disabled: 'No', + initial: true, + }); + + if (!retry) { + throw e; + } + } + } while (retry); + }, }, { title: 'Download certificate', diff --git a/packages/dashmate/src/ssl/generateKeyPair.js b/packages/dashmate/src/ssl/generateKeyPair.js index 832c4072005..3969402f0d3 100644 --- a/packages/dashmate/src/ssl/generateKeyPair.js +++ b/packages/dashmate/src/ssl/generateKeyPair.js @@ -2,7 +2,7 @@ const forge = require('node-forge'); /** * @typedef {generateKeyPair} - * @param {number} bits + * @param {number} [bits=2048] * @return {Promise<{privateKey: string, publicKey: string}>} */ async function generateKeyPair(bits = 2048) { diff --git a/packages/dashmate/src/ssl/zerossl/verifyDomain.js b/packages/dashmate/src/ssl/zerossl/verifyDomain.js index 2a1d79a877a..87f192706e9 100644 --- a/packages/dashmate/src/ssl/zerossl/verifyDomain.js +++ b/packages/dashmate/src/ssl/zerossl/verifyDomain.js @@ -30,7 +30,7 @@ async function verifyDomain(id, apiKey) { const data = await response.json(); if (data.error) { - throw new Error(data.error.type); + throw new Error(data.error.message); } return data; From 5009738a695f6c73984fe113b968978d003fa1ab Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 24 Mar 2023 20:30:21 +0800 Subject: [PATCH 51/93] feat: validate file and access for certificate files --- .../prompts/validators/validateFileExists.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/dashmate/src/listr/prompts/validators/validateFileExists.js b/packages/dashmate/src/listr/prompts/validators/validateFileExists.js index 68222470fef..0d07109e598 100644 --- a/packages/dashmate/src/listr/prompts/validators/validateFileExists.js +++ b/packages/dashmate/src/listr/prompts/validators/validateFileExists.js @@ -1,13 +1,18 @@ const fs = require('fs'); +/** + * @param {string} value + * @returns {boolean} + */ function validateFileExists(value) { - // TODO: We should make sure that file is accessable - // TODO: We should make sure it's a file not a directory - if (fs.existsSync(value)) { + try { + // eslint-disable-next-line no-bitwise + fs.accessSync(value, fs.constants.R_OK | fs.constants.W_OK); + return true; + } catch (e) { + return false; } - - return 'File doesn\'t exist'; } module.exports = validateFileExists; From 1355e39a5d5152923164e4b376fe5bd0059febba Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 24 Mar 2023 21:19:08 +0800 Subject: [PATCH 52/93] fix: duplicate hint in forms --- .pnp.cjs | 12 ++++++++++-- .../enquirer-https-9a17ef3ad5-2262f9819b.zip | Bin 0 -> 67192 bytes packages/dashmate/package.json | 2 +- .../registerMasternodeGuideTaskFactory.js | 5 ----- .../setup/setupRegularPresetTaskFactory.js | 3 +-- yarn.lock | 13 +++++++++++-- 6 files changed, 23 insertions(+), 12 deletions(-) create mode 100644 .yarn/cache/enquirer-https-9a17ef3ad5-2262f9819b.zip diff --git a/.pnp.cjs b/.pnp.cjs index b3fa102e5ad..9cecf15c896 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -8029,7 +8029,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["dockerode", "npm:3.3.1"],\ ["dot", "npm:1.1.3"],\ ["dotenv", "npm:8.6.0"],\ - ["enquirer", "npm:2.3.6"],\ + ["enquirer", "https://github.com/dashpay/enquirer.git#commit=86aaef0b1c82dfaa3436775e6b37de310eeb94f5"],\ ["eslint", "npm:7.32.0"],\ ["eslint-config-airbnb-base", "virtual:12a596dc9572e25ce715d3736dc74b317c5ca5cfb3b4f67864b1e76b3a401006f84d381aaf975bb5b4da9cafac5125e6869fc78d5202f4c95780c81479112f32#npm:14.2.1"],\ ["eslint-plugin-import", "virtual:12a596dc9572e25ce715d3736dc74b317c5ca5cfb3b4f67864b1e76b3a401006f84d381aaf975bb5b4da9cafac5125e6869fc78d5202f4c95780c81479112f32#npm:2.25.3"],\ @@ -8825,6 +8825,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["enquirer", [\ + ["https://github.com/dashpay/enquirer.git#commit=86aaef0b1c82dfaa3436775e6b37de310eeb94f5", {\ + "packageLocation": "./.yarn/cache/enquirer-https-9a17ef3ad5-2262f9819b.zip/node_modules/enquirer/",\ + "packageDependencies": [\ + ["enquirer", "https://github.com/dashpay/enquirer.git#commit=86aaef0b1c82dfaa3436775e6b37de310eeb94f5"],\ + ["ansi-colors", "npm:4.1.1"]\ + ],\ + "linkType": "HARD"\ + }],\ ["npm:2.3.6", {\ "packageLocation": "./.yarn/cache/enquirer-npm-2.3.6-7899175762-1c0911e14a.zip/node_modules/enquirer/",\ "packageDependencies": [\ @@ -12599,7 +12607,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@types/enquirer", null],\ ["cli-truncate", "npm:2.1.0"],\ ["colorette", "npm:2.0.19"],\ - ["enquirer", "npm:2.3.6"],\ + ["enquirer", "https://github.com/dashpay/enquirer.git#commit=86aaef0b1c82dfaa3436775e6b37de310eeb94f5"],\ ["log-update", "npm:4.0.0"],\ ["p-map", "npm:4.0.0"],\ ["rfdc", "npm:1.3.0"],\ diff --git a/.yarn/cache/enquirer-https-9a17ef3ad5-2262f9819b.zip b/.yarn/cache/enquirer-https-9a17ef3ad5-2262f9819b.zip new file mode 100644 index 0000000000000000000000000000000000000000..54d3af8e50066a072ff53b56adf65ee1277d011b GIT binary patch literal 67192 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 validateAddress(value, ctx.preset); const collateralAmount = ctx.isHP === true @@ -131,21 +129,18 @@ function registerMasternodeGuideTaskFactory() { { name: 'ownerAddress', message: 'Owner address', - hint: 'Base58 encoded', validate: validateAddressWithNetwork, initial: state.keys.ownerAddress, }, { name: 'votingAddress', message: 'Voting address', - hint: 'Base58 encoded', validate: validateAddressWithNetwork, initial: state.keys.votingAddress, }, { name: 'payoutAddress', message: 'Payout address', - hint: 'Base58 encoded', validate: validateAddressWithNetwork, initial: state.keys.payoutAddress, }, diff --git a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js index 4c33bf2536e..267624d2841 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js @@ -4,7 +4,6 @@ const chalk = require('chalk'); const { NODE_TYPE_MASTERNODE, - PRESET_MAINNET, NODE_TYPE_HPMN, NODE_TYPE_FULLNODE, } = require('../../../constants'); @@ -133,7 +132,7 @@ function setupRegularPresetTaskFactory( task: () => configureNodeTask(), }, { - enabled: (ctx) => ctx.config.isPlatformEnabled(), + enabled: (ctx) => ctx.config && ctx.config.isPlatformEnabled(), task: () => configureSSLCertificateTask(), }, { diff --git a/yarn.lock b/yarn.lock index 1ba804d01aa..bfcd8c52933 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5985,7 +5985,7 @@ __metadata: dockerode: ^3.2.0 dot: ^1.1.3 dotenv: ^8.6.0 - enquirer: ^2.3.6 + enquirer: "github:dashpay/enquirer#patch-1" eslint: ^7.32.0 eslint-config-airbnb-base: ^14.2.1 eslint-plugin-import: ^2.24.2 @@ -6607,7 +6607,16 @@ __metadata: languageName: node linkType: hard -"enquirer@npm:^2.3.5, enquirer@npm:^2.3.6": +"enquirer@github:dashpay/enquirer#patch-1": + version: 2.3.6 + resolution: "enquirer@https://github.com/dashpay/enquirer.git#commit=86aaef0b1c82dfaa3436775e6b37de310eeb94f5" + dependencies: + ansi-colors: ^4.1.1 + checksum: 2262f9819ba08a6090f4b2b32c7061b65f8ca7e5df414a45d807dd3e0e740dc4019bd8f749dbaafc8e9bfd97f595816e5a27e1666bb045ca31a495331eadf9ff + languageName: node + linkType: hard + +"enquirer@npm:^2.3.5": version: 2.3.6 resolution: "enquirer@npm:2.3.6" dependencies: From e830222998b6985843a1377603bd3a7aad681f2d Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Fri, 24 Mar 2023 22:28:09 +0800 Subject: [PATCH 53/93] feat: enhanced tenderdash node key validation --- .../validators/validateTenderdashNodeKey.js | 56 ++++++++----------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/packages/dashmate/src/listr/prompts/validators/validateTenderdashNodeKey.js b/packages/dashmate/src/listr/prompts/validators/validateTenderdashNodeKey.js index 44347d01b46..faa82bf71ce 100644 --- a/packages/dashmate/src/listr/prompts/validators/validateTenderdashNodeKey.js +++ b/packages/dashmate/src/listr/prompts/validators/validateTenderdashNodeKey.js @@ -15,38 +15,30 @@ function validateTenderdashNodeKey(value) { return 'invalid format'; } - // TODO: Make it work - // const privateKey = nodeKey.slice(0, 32); - // const privateKeyDer = Buffer.concat([ - // Buffer.from('302e020100300506032b657004220420', 'hex'), // Static value - // privateKey, - // ]); - // const privateKeyObject = crypto.createPrivateKey({ - // format: 'der', - // type: 'pkcs8', - // key: privateKeyDer, - // }); - // - // const publicKey = nodeKey.slice(32); - // const publicKeyDer = Buffer.concat([ - // Buffer.from('302a300506032b6570032100', 'hex'), // Static value - // publicKey, - // ]); - // const publicKeyObject = crypto.createPublicKey({ - // format: 'der', - // type: 'spki', - // key: publicKeyDer, - // }); - // - // const data = Buffer.from('Hello, world!'); - // - // const signature = crypto.sign('sha256', data, privateKeyObject); - // - // const verify = crypto.verify('sha256', data, publicKeyObject, signature); - // - // if (!verify) { - // return 'malformed key'; - // } + const privateKey = nodeKey.slice(0, 32); + const privateKeyDer = Buffer.concat([ + Buffer.from('302e020100300506032b657004220420', 'hex'), // Static value + privateKey, + ]); + + const derivedPublicKeyDer = crypto.createPublicKey({ + format: 'der', + type: 'pkcs8', + key: privateKeyDer, + }).export({ + format: 'der', + type: 'spki', + }); + + const publicKey = nodeKey.slice(32); + const publicKeyDer = Buffer.concat([ + Buffer.from('302a300506032b6570032100', 'hex'), // Static value + publicKey, + ]); + + if (!derivedPublicKeyDer.equals(publicKeyDer)) { + return 'malformed key'; + } return true; } From fbb3cf5cea80151024d75e675d93f3510ebe783d Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 25 Mar 2023 12:51:23 +0800 Subject: [PATCH 54/93] fix: broken local network setup --- packages/dashmate/src/createDIContainer.js | 2 -- .../tasks/setup/regular/configureNodeTaskFactory.js | 4 ++-- .../regular/registerMasternodeGuideTaskFactory.js | 6 +++--- .../listr/tasks/setup/setupLocalPresetTaskFactory.js | 12 +++++------- ...TenderdashNodeId.js => deriveTenderdashNodeId.js} | 6 +++--- packages/dashmate/templates/core/dash.conf.dot | 2 +- 6 files changed, 14 insertions(+), 18 deletions(-) rename packages/dashmate/src/tenderdash/{createTenderdashNodeId.js => deriveTenderdashNodeId.js} (71%) diff --git a/packages/dashmate/src/createDIContainer.js b/packages/dashmate/src/createDIContainer.js index dd6a4658098..8f2207521f4 100644 --- a/packages/dashmate/src/createDIContainer.js +++ b/packages/dashmate/src/createDIContainer.js @@ -89,7 +89,6 @@ const generateKeyPair = require('./ssl/generateKeyPair'); const createSelfSignedCertificate = require('./ssl/selfSigned/createCertificate'); const scheduleRenewZeroSslCertificateFactory = require('./helper/scheduleRenewZeroSslCertificateFactory'); -const generateTenderdashNodeKeyAndId = require('./tenderdash/createTenderdashNodeId'); const registerMasternodeGuideTaskFactory = require('./listr/tasks/setup/regular/registerMasternodeGuideTaskFactory'); const configureNodeTaskFactory = require('./listr/tasks/setup/regular/configureNodeTaskFactory'); const configureSSLCertificateTaskFactory = require('./listr/tasks/setup/regular/configureSSLCertificateTaskFactory'); @@ -195,7 +194,6 @@ async function createDIContainer() { */ container.register({ createTenderdashRpcClient: asValue(createTenderdashRpcClient), - generateTenderdashNodeKeyAndId: asValue(generateTenderdashNodeKeyAndId), }); /** diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js index 3ff72b467c7..eaf3e23184f 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js @@ -12,7 +12,7 @@ const { const validateBLSPrivateKeyFactory = require('../../../prompts/validators/validateBLSPrivateKeyFactory'); const createPlatformNodeKeyInput = require('../../../prompts/createPlatformNodeKeyInput'); const createIpAndPortsForm = require('../../../prompts/createIpAndPortsForm'); -const createTenderdashNodeId = require('../../../../tenderdash/createTenderdashNodeId'); +const deriveTenderdashNodeId = require('../../../../tenderdash/deriveTenderdashNodeId'); const getConfigurationOutputFromContext = require('./getConfigurationOutputFromContext'); function configureNodeTaskFactory() { @@ -55,7 +55,7 @@ function configureNodeTaskFactory() { skipInitial: ctx.nodeType === NODE_TYPE_MASTERNODE, })); - ctx.config.set('platform.drive.tenderdash.node.id', createTenderdashNodeId(platformNodeKey)); + ctx.config.set('platform.drive.tenderdash.node.id', deriveTenderdashNodeId(platformNodeKey)); ctx.config.set('platform.drive.tenderdash.node.key', platformNodeKey); } diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index a956302db4e..21d5d248704 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -21,7 +21,7 @@ const generateBlsKeys = require('../../../../core/generateBlsKeys'); const validateBLSPrivateKeyFactory = require('../../../prompts/validators/validateBLSPrivateKeyFactory'); const createPlatformNodeKeyInput = require('../../../prompts/createPlatformNodeKeyInput'); const createIpAndPortsForm = require('../../../prompts/createIpAndPortsForm'); -const createTenderdashNodeId = require('../../../../tenderdash/createTenderdashNodeId'); +const deriveTenderdashNodeId = require('../../../../tenderdash/deriveTenderdashNodeId'); const getConfigurationOutputFromContext = require('./getConfigurationOutputFromContext'); const getBLSPublicKeyFromPrivateKeyHex = require('../../../../core/getBLSPublicKeyFromPrivateKeyHex'); @@ -225,7 +225,7 @@ function registerMasternodeGuideTaskFactory() { ${state.keys.votingAddress} ${state.operator.rewardShare} ${state.keys.payoutAddress} - ${createTenderdashNodeId(state.platformNodeKey)} + ${deriveTenderdashNodeId(state.platformNodeKey)} ${platformP2PPort} ${platformHTTPPort}`; } else { @@ -262,7 +262,7 @@ function registerMasternodeGuideTaskFactory() { ctx.config.set('core.p2p.port', state.ipAndPorts.coreP2PPort); if (ctx.isHP) { - ctx.config.set('platform.drive.tenderdash.node.id', createTenderdashNodeId(state.platformNodeKey)); + ctx.config.set('platform.drive.tenderdash.node.id', deriveTenderdashNodeId(state.platformNodeKey)); ctx.config.set('platform.drive.tenderdash.node.key', state.platformNodeKey); ctx.config.set('platform.dapi.envoy.http.port', state.ipAndPorts.platformHTTPPort); diff --git a/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js index 5784a8e6567..af3ae40ed77 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js @@ -6,6 +6,8 @@ const { PRESET_LOCAL, HOME_DIR_PATH, } = require('../../../constants'); +const generateTenderdashNodeKey = require('../../../tenderdash/generateTenderdashNodeKey'); +const deriveTenderdashNodeId = require('../../../tenderdash/deriveTenderdashNodeId'); /** * @param {ConfigFile} configFile @@ -15,7 +17,6 @@ const { * @param {resolveDockerHostIp} resolveDockerHostIp * @param {configFileRepository} configFileRepository * @param {generateHDPrivateKeys} generateHDPrivateKeys - * @param {generateTenderdashNodeKeyAndId} generateTenderdashNodeKeyAndId */ function setupLocalPresetTaskFactory( configFile, @@ -25,7 +26,6 @@ function setupLocalPresetTaskFactory( resolveDockerHostIp, configFileRepository, generateHDPrivateKeys, - generateTenderdashNodeKeyAndId, ) { /** * @typedef {setupLocalPresetTask} @@ -189,14 +189,12 @@ function setupLocalPresetTaskFactory( config.set('core.miner.enable', true); // Disable platform for the seed node - config.set('platform', undefined); + config.remove('platform'); } else { config.set('description', `local node #${nodeIndex}`); - const { - id, - key, - } = generateTenderdashNodeKeyAndId(); + const key = generateTenderdashNodeKey(); + const id = deriveTenderdashNodeId(key); config.set('platform.drive.tenderdash.node.id', id); config.set('platform.drive.tenderdash.node.key', key); diff --git a/packages/dashmate/src/tenderdash/createTenderdashNodeId.js b/packages/dashmate/src/tenderdash/deriveTenderdashNodeId.js similarity index 71% rename from packages/dashmate/src/tenderdash/createTenderdashNodeId.js rename to packages/dashmate/src/tenderdash/deriveTenderdashNodeId.js index 293831a297f..7f63023c6fd 100644 --- a/packages/dashmate/src/tenderdash/createTenderdashNodeId.js +++ b/packages/dashmate/src/tenderdash/deriveTenderdashNodeId.js @@ -1,11 +1,11 @@ const crypto = require('crypto'); /** - * @typedef createTenderdashNodeId + * @typedef deriveTenderdashNodeId * @param {string} nodeKey * @returns {string} */ -function createTenderdashNodeId(nodeKey) { +function deriveTenderdashNodeId(nodeKey) { const nodeKeyBuffer = Buffer.from(nodeKey, 'base64'); const publicKey = nodeKeyBuffer.slice(32); @@ -16,4 +16,4 @@ function createTenderdashNodeId(nodeKey) { .slice(0, 40); } -module.exports = createTenderdashNodeId; +module.exports = deriveTenderdashNodeId; diff --git a/packages/dashmate/templates/core/dash.conf.dot b/packages/dashmate/templates/core/dash.conf.dot index 92fadfc8110..c337128264b 100644 --- a/packages/dashmate/templates/core/dash.conf.dot +++ b/packages/dashmate/templates/core/dash.conf.dot @@ -22,7 +22,7 @@ rpcthreads=16 listen=1 dnsseed=0 allowprivatenet=0 -{{? it.externalip }} +{{?it.externalIp }} externalip={{=it.externalIp}} {{?}} {{? it.network === 'local' && it.externalIp }} From fdbcc596ab2eca121f6179fec0f0515dce78e5a2 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 25 Mar 2023 12:55:35 +0800 Subject: [PATCH 55/93] fix: empty error message on IP verification failure --- .../obtainZeroSSLCertificateTaskFactory.js | 2 +- .../renewZeroSSLCertificateTaskFactory.js | 26 ++++++++++++++++++- .../dashmate/src/ssl/zerossl/verifyDomain.js | 2 +- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js index 55905e1fe94..d8d67ef2100 100644 --- a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js @@ -70,7 +70,7 @@ function obtainZeroSSLCertificateTaskFactory( } catch (e) { retry = await task.prompt({ type: 'toggle', - header: chalk`An error occurred during verification: {red ${e.message}} + header: chalk`An error occurred during IP address verification: ${e.message} Please make sure that your IP address ${config.get('externalIp')} and port 80 are accessible from internet`, message: 'Try again?', diff --git a/packages/dashmate/src/listr/tasks/ssl/zerossl/renewZeroSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/ssl/zerossl/renewZeroSSLCertificateTaskFactory.js index 33b33a2af01..d582e2349d3 100644 --- a/packages/dashmate/src/listr/tasks/ssl/zerossl/renewZeroSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/ssl/zerossl/renewZeroSSLCertificateTaskFactory.js @@ -1,5 +1,7 @@ const { Listr } = require('listr2'); +const chalk = require('chalk'); + /** * * @param {createZeroSSLCertificate} createZeroSSLCertificate @@ -63,7 +65,29 @@ function renewZeroSSLCertificateTaskFactory( }, { title: 'Verify IP', - task: async (ctx) => verifyDomain(ctx.response.id, config.get('platform.dapi.envoy.ssl.providerConfigs.zerossl.apiKey')), + task: async (ctx, task) => { + let retry; + do { + try { + await verifyDomain(ctx.response.id, config.get('platform.dapi.envoy.ssl.providerConfigs.zerossl.apiKey')); + } catch (e) { + retry = await task.prompt({ + type: 'toggle', + header: chalk`An error occurred during IP address verification: ${e.message} + + Please make sure that your IP address ${config.get('externalIp')} and port 80 are accessible from internet`, + message: 'Try again?', + enabled: 'Yes', + disabled: 'No', + initial: true, + }); + + if (!retry) { + throw e; + } + } + } while (retry); + }, }, { title: 'Download certificate', diff --git a/packages/dashmate/src/ssl/zerossl/verifyDomain.js b/packages/dashmate/src/ssl/zerossl/verifyDomain.js index 87f192706e9..2a1d79a877a 100644 --- a/packages/dashmate/src/ssl/zerossl/verifyDomain.js +++ b/packages/dashmate/src/ssl/zerossl/verifyDomain.js @@ -30,7 +30,7 @@ async function verifyDomain(id, apiKey) { const data = await response.json(); if (data.error) { - throw new Error(data.error.message); + throw new Error(data.error.type); } return data; From 22f1b392c4d223f8c32bf407dee6a1a8df66ee4c Mon Sep 17 00:00:00 2001 From: strophy Date: Sat, 25 Mar 2023 12:57:31 +0800 Subject: [PATCH 56/93] chore: zerossl and ssl file headers and remove newlines --- .../regular/configureSSLCertificateTaskFactory.js | 4 ++-- .../regular/getConfigurationOutputFromContext.js | 7 ++++--- .../zerossl/obtainZeroSSLCertificateTaskFactory.js | 12 ++++++++---- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js index 28416473fbf..79029969644 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js @@ -30,7 +30,7 @@ function configureSSLCertificateTaskFactory( task: async (ctx, task) => { const form = await task.prompt({ type: 'form', - message: 'Provide paths to your certificate files', + message: 'Specify paths to your certificate files', choices: [ { name: 'chainFile', @@ -39,7 +39,7 @@ function configureSSLCertificateTaskFactory( }, { name: 'privateFile', - message: 'Path to private file', + message: 'Path to certificate key file', validate: validateFileExists, }, ], diff --git a/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js b/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js index 707e91e8ae7..200b71182ae 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js @@ -15,9 +15,10 @@ async function getConfigurationOutputFromContext(ctx) { } if (ctx.isHP) { - if (output !== '') { - output += '\n\n'; - } + // TODO: Pretty sure we don't need this, because we are adding \n\n above already + // if (output !== '') { + // output += '\n\n'; + // } output += chalk`Platform Node ID: ${ctx.config.get('platform.drive.tenderdash.node.id')} Platform Node key: ******** - view with {bold.cyanBright dashmate config get platform.drive.tenderdash.node.key}\n\n`; } diff --git a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js index 55905e1fe94..9c2ac2529a5 100644 --- a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js @@ -70,10 +70,14 @@ function obtainZeroSSLCertificateTaskFactory( } catch (e) { retry = await task.prompt({ type: 'toggle', - header: chalk`An error occurred during verification: {red ${e.message}} - - Please make sure that your IP address ${config.get('externalIp')} and port 80 are accessible from internet`, - message: 'Try again?', + header: chalk` An error occurred during verification: {red ${e.message}} + + Please ensure that port 80 on your public IP address ${config.get('externalIp')} is open + for incoming HTTP connections. You may need to configure your firewall to + ensure this port is accessible from the public internet. If you are using + Network Address Translation (NAT), please enable port forwarding for port 80 + and all Dash service ports listed above.`, + message: 'Retry?', enabled: 'Yes', disabled: 'No', initial: true, From 87e8ec9e21b4a18c28ea89c476b2acba24ba8c4d Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 25 Mar 2023 13:23:53 +0800 Subject: [PATCH 57/93] chore: remove unnecessary hints --- .../src/listr/tasks/setup/regular/configureNodeTaskFactory.js | 1 - .../tasks/setup/regular/registerMasternodeGuideTaskFactory.js | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js index eaf3e23184f..9f4aabfba21 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js @@ -42,7 +42,6 @@ function configureNodeTaskFactory() { in the DMT configuration tool, or in the safe location in which you stored it when initially configuring your masternode.\n`, message: 'BLS private key', - hint: 'HEX encoded', validate: validateBLSPrivateKey, }); diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index 21d5d248704..c25cb41e752 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -169,7 +169,6 @@ function registerMasternodeGuideTaskFactory() { { name: 'privateKey', message: 'BLS private key', - hint: 'HEX encoded', initial: state.operator.privateKey || initialOperatorPrivateKey, validate: validateBLSPrivateKey, }, From de583c505f86dd7f20c2bb3bb9f3a7817f6f8a23 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 25 Mar 2023 13:40:29 +0800 Subject: [PATCH 58/93] fix: status command fails in some cases --- packages/dashmate/src/commands/status/platform.js | 4 ++-- packages/dashmate/src/status/scopes/overview.js | 5 ++--- packages/dashmate/src/status/scopes/services.js | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/dashmate/src/commands/status/platform.js b/packages/dashmate/src/commands/status/platform.js index d133a2b878c..849fc9a3341 100644 --- a/packages/dashmate/src/commands/status/platform.js +++ b/packages/dashmate/src/commands/status/platform.js @@ -27,8 +27,8 @@ class PlatformStatusCommand extends ConfigBaseCommand { config, getPlatformScope, ) { - if (config.get('network') === 'mainnet') { - throw new Error('Platform is not supported on mainnet yet!'); + if (!config.isPlatformEnabled()) { + throw new Error('Platform is not supported for this node type and network'); } if (!(await dockerCompose.isServiceRunning(config.toEnvs(), 'drive_tenderdash'))) { diff --git a/packages/dashmate/src/status/scopes/overview.js b/packages/dashmate/src/status/scopes/overview.js index f9f85a835f2..ae45a7202a3 100644 --- a/packages/dashmate/src/status/scopes/overview.js +++ b/packages/dashmate/src/status/scopes/overview.js @@ -16,7 +16,6 @@ function getOverviewScopeFactory(getCoreScope, */ async function getOverviewScope(config) { const masternodeEnabled = config.get('core.masternode.enable'); - const platformEnabled = config.get('network') !== 'mainnet' && config.name !== 'local_seed'; const { serviceStatus, dockerStatus, verificationProgress, @@ -45,7 +44,7 @@ function getOverviewScopeFactory(getCoreScope, }; const platform = { - enabled: platformEnabled, + enabled: config.isPlatformEnabled(), tenderdash: null, }; @@ -60,7 +59,7 @@ function getOverviewScopeFactory(getCoreScope, masternode.nodeState = nodeState; } - if (platformEnabled) { + if (config.isPlatformEnabled()) { const { tenderdash } = await getPlatformScope(config); platform.tenderdash = tenderdash; diff --git a/packages/dashmate/src/status/scopes/services.js b/packages/dashmate/src/status/scopes/services.js index 06ee9b6a0eb..ff1d1625054 100644 --- a/packages/dashmate/src/status/scopes/services.js +++ b/packages/dashmate/src/status/scopes/services.js @@ -25,7 +25,7 @@ function getServicesScopeFactory(dockerCompose) { }); } - if (config.get('network') !== 'mainnet') { + if (config.isPlatformEnabled()) { Object.assign(serviceHumanNames, { drive_abci: 'Drive ABCI', drive_tenderdash: 'Drive Tenderdash', From 9340fef676b6bd46f3c589ebc89f17caddecfce3 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 25 Mar 2023 13:43:56 +0800 Subject: [PATCH 59/93] fix: node is not starting without withdrawal keys --- packages/dashmate/configs/system/testnet.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/dashmate/configs/system/testnet.js b/packages/dashmate/configs/system/testnet.js index ef653e29148..244987db59e 100644 --- a/packages/dashmate/configs/system/testnet.js +++ b/packages/dashmate/configs/system/testnet.js @@ -136,6 +136,10 @@ module.exports = lodashMerge({}, baseConfig, { masterPublicKey: '0211234327aed200b2771788aec1c7d6a799f534d02dd6766c6de53e3fd7152dfc', secondPublicKey: '035655d53d061275314535b74bfbbfb74cf640023a5cc466283e83881876cb9a3f', }, + withdrawals: { + masterPublicKey: '0211234327aed200b2771788aec1c7d6a799f5343a5cfab7b7ca8135d6e06b5ec2', + secondPublicKey: '03aff4e943e005a2549757fdd3fbbfb74cf640023a5cc466283e83881876cb9a3f', + }, }, network: NETWORK_TESTNET, }); From a72beeea46ef48f5357d17bff3200cf80ab499c6 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 25 Mar 2023 13:54:38 +0800 Subject: [PATCH 60/93] fix: error reading GenesisDoc for testnet node --- packages/dashmate/configs/system/testnet.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dashmate/configs/system/testnet.js b/packages/dashmate/configs/system/testnet.js index 244987db59e..77e3ea7e811 100644 --- a/packages/dashmate/configs/system/testnet.js +++ b/packages/dashmate/configs/system/testnet.js @@ -110,7 +110,7 @@ module.exports = lodashMerge({}, baseConfig, { pro_tx_hash: 'F3D506822A24E7E4BE318A6ED7371CC1E1527880A594FE04629F50A1618DB8E7', }, ], - threshold_public_key: { + validator_quorum_threshold_public_key: { type: 'tendermint/PubKeyBLS12381', value: 'imxjukh5hRY91Mvm/sfhQp6iSnICyvKMMdhY5Sq6Ej0QJyB3vtN4UfYwvmxdzOVM', }, From 19d44701b627552d25fec5aeabf1f551fa3c655c Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 25 Mar 2023 14:58:19 +0800 Subject: [PATCH 61/93] style: fix linter issues --- packages/dashmate/.eslintrc | 4 ++++ packages/dashmate/src/commands/setup.js | 2 ++ .../src/listr/tasks/setup/regular/configureNodeTaskFactory.js | 2 -- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/dashmate/.eslintrc b/packages/dashmate/.eslintrc index 3f0b0609ee2..be5eb80fc04 100644 --- a/packages/dashmate/.eslintrc +++ b/packages/dashmate/.eslintrc @@ -1,5 +1,9 @@ { "extends": "airbnb-base", + "parserOptions": { + // Required for certain syntax usages + "ecmaVersion": 2020 + }, "env": { "commonjs": true, "node": true diff --git a/packages/dashmate/src/commands/setup.js b/packages/dashmate/src/commands/setup.js index 244b52efeab..00f5ebbbd31 100644 --- a/packages/dashmate/src/commands/setup.js +++ b/packages/dashmate/src/commands/setup.js @@ -74,6 +74,7 @@ class SetupCommand extends BaseCommand { } if (isAlreadyConfigured) { + // eslint-disable-next-line no-param-reassign task.output = chalk`Preset {bold ${ctx.preset}} already configured. To set up a node with this preset from scratch use {bold.cyanBright dashmate reset --config ${ctx.preset} --hard}. @@ -85,6 +86,7 @@ class SetupCommand extends BaseCommand { } else { // eslint-disable-next-line no-param-reassign + // eslint-disable-next-line no-param-reassign task.output = ctx.preset; } } diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js index 9f4aabfba21..5f35777e196 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureNodeTaskFactory.js @@ -1,7 +1,5 @@ const { Listr } = require('listr2'); -const chalk = require('chalk'); - const BlsSignatures = require('@dashevo/bls'); const { From f659ac542f341cccd859f975052757b5aac6117d Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 25 Mar 2023 15:01:49 +0800 Subject: [PATCH 62/93] chore: update migrations --- packages/dashmate/configs/migrations.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/dashmate/configs/migrations.js b/packages/dashmate/configs/migrations.js index d652da2e898..54606b0cafe 100644 --- a/packages/dashmate/configs/migrations.js +++ b/packages/dashmate/configs/migrations.js @@ -473,12 +473,23 @@ module.exports = { }, '0.24.0-dev.17': (configFile) => { Object.entries(configFile.configs) - .forEach(([, config]) => { + .forEach(([name , config]) => { if (config.platform) { - config.platform.enable = true; + config.platform.enable = name !== 'mainnet'; } }); + if (configFile.configs.testnet.platform) { + configFile.configs.testnet.platform.dapi.envoy.http.port = systemConfigs.testnet + .platform.dapi.envoy.http.port; + + configFile.configs.testnet.platform.drive.tenderdash.p2p.port = systemConfigs.testnet + .platform.drive.tenderdash.p2p.port; + } + + configFile.configs.base.platform.dapi.envoy.http.port = systemConfigs.base + .platform.dapi.envoy.http.port; + return configFile; }, }; From 74c3f48b81357ead2abe2883a8efd3c0a4638220 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 25 Mar 2023 15:02:53 +0800 Subject: [PATCH 63/93] style: linter warnings --- packages/dashmate/configs/migrations.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dashmate/configs/migrations.js b/packages/dashmate/configs/migrations.js index 54606b0cafe..1450e0f76aa 100644 --- a/packages/dashmate/configs/migrations.js +++ b/packages/dashmate/configs/migrations.js @@ -473,7 +473,7 @@ module.exports = { }, '0.24.0-dev.17': (configFile) => { Object.entries(configFile.configs) - .forEach(([name , config]) => { + .forEach(([name, config]) => { if (config.platform) { config.platform.enable = name !== 'mainnet'; } From feec30a752feff0d0f79d8a1ca7ed04832741974 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 25 Mar 2023 15:19:10 +0800 Subject: [PATCH 64/93] feat: check files have different paths --- .../src/listr/prompts/createIpAndPortsForm.js | 34 +++++++++++++------ .../configureSSLCertificateTaskFactory.js | 21 ++++++++---- .../registerMasternodeGuideTaskFactory.js | 10 ++++-- 3 files changed, 46 insertions(+), 19 deletions(-) diff --git a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js index d77550bac4b..9b63784bc4b 100644 --- a/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js +++ b/packages/dashmate/src/listr/prompts/createIpAndPortsForm.js @@ -24,21 +24,29 @@ async function createIpAndPortsForm(network, options = {}) { const mainnetCfg = systemConfigs[PRESET_MAINNET]; function validateCoreP2PPort(value) { + if (!validatePort(value)) { + return false; + } + if (network !== PRESET_MAINNET && value === mainnetCfg.core.p2p.port.toString()) { return false; } - return validatePort(value); + return true; } function validatePlatformP2PPort(value) { + if (!validatePort(value)) { + return false; + } + if (network !== PRESET_MAINNET && value === mainnetCfg.platform.drive.tenderdash.p2p.port.toString()) { return 'this port is reserved for mainnet'; } - return validatePort(value); + return true; } function validatePlatformHTTPPort(value) { @@ -120,6 +128,19 @@ async function createIpAndPortsForm(network, options = {}) { platformP2PPort, platformHTTPPort, }) => { + const areAllFieldsValid = validateIPv4(ip) && validateCoreP2PPort(coreP2PPort) + && ( + !options.isHPMN + || ( + validatePlatformP2PPort(platformP2PPort) + && validatePlatformHTTPPort(platformHTTPPort) + ) + ); + + if (!areAllFieldsValid) { + return false; + } + if (options.isHPMN) { if (coreP2PPort === platformP2PPort || coreP2PPort === platformHTTPPort @@ -128,14 +149,7 @@ async function createIpAndPortsForm(network, options = {}) { } } - return validateIPv4(ip) && validateCoreP2PPort(coreP2PPort) - && ( - !options.isHPMN - || ( - validatePlatformP2PPort(platformP2PPort) - && validatePlatformHTTPPort(platformHTTPPort) - ) - ); + return true; }, }; } diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js index 79029969644..170aea7dc83 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js @@ -33,23 +33,32 @@ function configureSSLCertificateTaskFactory( message: 'Specify paths to your certificate files', choices: [ { - name: 'chainFile', + name: 'chainFilePath', message: 'Path to certificate chain file', validate: validateFileExists, }, { - name: 'privateFile', + name: 'privateFilePath', message: 'Path to certificate key file', validate: validateFileExists, }, ], - validate: ({ chainFile, privateFile }) => validateFileExists(chainFile) - && validateFileExists(privateFile), + validate: ({ chainFilePath, privateFilePath }) => () => { + if (!validateFileExists(chainFilePath) || !validateFileExists(privateFilePath)) { + return false; + } + + if (chainFilePath === privateFilePath) { + return 'the same path for both files'; + } + + return true; + }, }); - ctx.certificate = fs.readFileSync(form.chainFile, 'utf8'); + ctx.certificate = fs.readFileSync(form.chainFilePath, 'utf8'); ctx.keyPair = { - privateKey: fs.readFileSync(form.privateFile, 'utf8'), + privateKey: fs.readFileSync(form.privateFilePath, 'utf8'), }; return saveCertificateTask(ctx.config); diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index c25cb41e752..2d4aab64df8 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -146,13 +146,17 @@ function registerMasternodeGuideTaskFactory() { }, ], validate: ({ ownerAddress, votingAddress, payoutAddress }) => { + if (!validateAddressWithNetwork(ownerAddress) + || !validateAddressWithNetwork(votingAddress) + || !validateAddressWithNetwork(payoutAddress)) { + return false; + } + if (ownerAddress === payoutAddress || votingAddress === payoutAddress) { return 'The payout address may not be the same as the owner or voting address'; } - return validateAddressWithNetwork(ownerAddress) - && validateAddressWithNetwork(votingAddress) - && validateAddressWithNetwork(payoutAddress); + return true; }, }, { From adbc73204fe6a7586bb09189b84e61357fce8daa Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 25 Mar 2023 15:22:02 +0800 Subject: [PATCH 65/93] docs: update setup command in readme --- packages/dashmate/README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/dashmate/README.md b/packages/dashmate/README.md index dc742e13233..8c7c4b0bba9 100644 --- a/packages/dashmate/README.md +++ b/packages/dashmate/README.md @@ -82,7 +82,22 @@ The CLI can be used to perform routine tasks. Invoke the CLI with `dashmate` if The `setup` command is used to quickly configure common node configurations. Arguments may be provided as options, otherwise they will be queried interactively with sensible values suggested. ``` +Setup a new Dash node +USAGE + $ dashmate setup [PRESET] [-v] [-d] [-c ] [-m ] + +ARGUMENTS + PRESET (mainnet|testnet|local) Node configuration preset + +FLAGS + -c, --node-count= number of nodes to setup + -d, --[no-]debug-logs enable debug logs + -m, --miner-interval= interval between blocks + -v, --verbose use verbose mode for output + +DESCRIPTION + Setup a new Dash node ``` Supported presets: From 5d0dea46ad53dfdece01bd4ad3a8e78d8d296db6 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 25 Mar 2023 15:47:24 +0800 Subject: [PATCH 66/93] style: remove commented code --- .../tasks/setup/regular/getConfigurationOutputFromContext.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js b/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js index 200b71182ae..4cb4dd2a27b 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/getConfigurationOutputFromContext.js @@ -15,10 +15,6 @@ async function getConfigurationOutputFromContext(ctx) { } if (ctx.isHP) { - // TODO: Pretty sure we don't need this, because we are adding \n\n above already - // if (output !== '') { - // output += '\n\n'; - // } output += chalk`Platform Node ID: ${ctx.config.get('platform.drive.tenderdash.node.id')} Platform Node key: ******** - view with {bold.cyanBright dashmate config get platform.drive.tenderdash.node.key}\n\n`; } From 7b6cda9c2f579d937aad67957a192821ddc60752 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 25 Mar 2023 15:58:06 +0800 Subject: [PATCH 67/93] chore: update both prompts --- .../zerossl/obtainZeroSSLCertificateTaskFactory.js | 1 + .../ssl/zerossl/renewZeroSSLCertificateTaskFactory.js | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js index 9c2ac2529a5..bdbd050035a 100644 --- a/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/ssl/zerossl/obtainZeroSSLCertificateTaskFactory.js @@ -60,6 +60,7 @@ function obtainZeroSSLCertificateTaskFactory( title: 'Start verification server', task: async () => verificationServer.start(), }, + // TODO: Duplicate tasks { title: 'Verify IP', task: async (ctx, task) => { diff --git a/packages/dashmate/src/listr/tasks/ssl/zerossl/renewZeroSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/ssl/zerossl/renewZeroSSLCertificateTaskFactory.js index d582e2349d3..b7eea113b37 100644 --- a/packages/dashmate/src/listr/tasks/ssl/zerossl/renewZeroSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/ssl/zerossl/renewZeroSSLCertificateTaskFactory.js @@ -63,6 +63,7 @@ function renewZeroSSLCertificateTaskFactory( title: 'Start verification server', task: async () => verificationServer.start(), }, + // TODO: Duplicate tasks { title: 'Verify IP', task: async (ctx, task) => { @@ -73,9 +74,13 @@ function renewZeroSSLCertificateTaskFactory( } catch (e) { retry = await task.prompt({ type: 'toggle', - header: chalk`An error occurred during IP address verification: ${e.message} - - Please make sure that your IP address ${config.get('externalIp')} and port 80 are accessible from internet`, + header: chalk` An error occurred during verification: {red ${e.message}} + + Please ensure that port 80 on your public IP address ${config.get('externalIp')} is open + for incoming HTTP connections. You may need to configure your firewall to + ensure this port is accessible from the public internet. If you are using + Network Address Translation (NAT), please enable port forwarding for port 80 + and all Dash service ports listed above.`, message: 'Try again?', enabled: 'Yes', disabled: 'No', From 74ed7274bf092ea1bbaee409dcf4801d22dbc121 Mon Sep 17 00:00:00 2001 From: strophy Date: Sat, 25 Mar 2023 16:12:56 +0800 Subject: [PATCH 68/93] chore: fix setup vs. set up --- packages/dashmate/README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/dashmate/README.md b/packages/dashmate/README.md index 8c7c4b0bba9..c3fd890b0aa 100644 --- a/packages/dashmate/README.md +++ b/packages/dashmate/README.md @@ -12,7 +12,7 @@ Distribution package for Dash Masternode installation - [Update](#update) - [Usage](#usage) - [Command line interface](#cli) - - [Setup node](#setup-node) + - [Set up node](#set-up-node) - [Configure node](#configure-node) - [Start node](#start-node) - [Stop node](#stop-node) @@ -77,12 +77,12 @@ The package contains a CLI, Docker Compose and configuration files. The CLI can be used to perform routine tasks. Invoke the CLI with `dashmate` if linked during installation, or with `node bin/dashmate` if not linked. To list available commands, either run `dashmate` with no parameters or execute `dashmate help`. To list the help on any command just execute the command, followed by the `--help` option. -### Setup node +### Set up node The `setup` command is used to quickly configure common node configurations. Arguments may be provided as options, otherwise they will be queried interactively with sensible values suggested. ``` -Setup a new Dash node +Set up a new Dash node USAGE $ dashmate setup [PRESET] [-v] [-d] [-c ] [-m ] @@ -91,20 +91,20 @@ ARGUMENTS PRESET (mainnet|testnet|local) Node configuration preset FLAGS - -c, --node-count= number of nodes to setup + -c, --node-count= number of nodes to set up -d, --[no-]debug-logs enable debug logs -m, --miner-interval= interval between blocks -v, --verbose use verbose mode for output DESCRIPTION - Setup a new Dash node + Set up a new Dash node ``` Supported presets: * `testnet` - a masternode or full node for testnet * `local` - a node group to run a local dash network with the specified number of masternodes. To operate a group of nodes, use the [group commands](#node-groups) -To setup a testnet masternode: +To set up a testnet masternode: ```bash $ dashmate setup testnet masternode ``` @@ -243,7 +243,7 @@ $ dashmate reset ``` #### Hard reset -With the hard reset mode enabled, the corresponding config will be reset in addition to the platform data. After a hard reset, it is necessary to run the node [setup](#setup-node) to proceed. +With the hard reset mode enabled, the corresponding config will be reset in addition to the platform data. After a hard reset, it is necessary to run the node [setup](#set-up-node) to proceed. ```bash $ dashmate reset --hard ``` @@ -289,11 +289,11 @@ dashmate config set core.masternode.enable false ### Node groups -CLI allows to [setup](#setup-node) and operate multiple nodes. Only the `local` preset is supported at the moment. +CLI allows to [setup](#set-up-node) and operate multiple nodes. Only the `local` preset is supported at the moment. #### Default group -The [setup](#setup-node) command set corresponding group as default. To output the current default group or set another one as default use `group:default` command. +The [setup](#set-up-node) command set corresponding group as default. To output the current default group or set another one as default use `group:default` command. ``` USAGE @@ -392,7 +392,7 @@ DESCRIPTION Reset group nodes ``` -With the hard reset mode enabled, corresponding configs will be reset as well. To proceed, running the node [setup](#setup-node) is required. +With the hard reset mode enabled, corresponding configs will be reset as well. To proceed, running the node [setup](#set-up-node) is required. #### Create config group From 50164f1e8714b9cdb212ec9acd0bff91c21b7211 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 25 Mar 2023 16:18:19 +0800 Subject: [PATCH 69/93] tests: fix tests --- packages/dashmate/src/status/scopes/platform.js | 3 --- .../dashmate/test/unit/status/scopes/overview.spec.js | 7 ++++++- .../dashmate/test/unit/status/scopes/platform.spec.js | 9 +++++++-- .../dashmate/test/unit/status/scopes/services.spec.js | 7 ++++++- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/dashmate/src/status/scopes/platform.js b/packages/dashmate/src/status/scopes/platform.js index 35365ae18ea..7ffe430cfef 100644 --- a/packages/dashmate/src/status/scopes/platform.js +++ b/packages/dashmate/src/status/scopes/platform.js @@ -128,9 +128,6 @@ function getPlatformScopeFactory(dockerCompose, } catch (e) { if (e.name === 'FetchError') { platform.tenderdash.serviceStatus = ServiceStatusEnum.error; - - // eslint-disable-next-line no-console - console.error(e); } else { throw e; } diff --git a/packages/dashmate/test/unit/status/scopes/overview.spec.js b/packages/dashmate/test/unit/status/scopes/overview.spec.js index 6ab496027d1..45911fbbaca 100644 --- a/packages/dashmate/test/unit/status/scopes/overview.spec.js +++ b/packages/dashmate/test/unit/status/scopes/overview.spec.js @@ -17,7 +17,11 @@ describe('getOverviewScopeFactory', () => { mockGetMasternodeScope = this.sinon.stub(); mockGetPlatformScope = this.sinon.stub(); - config = { get: this.sinon.stub(), toEnvs: this.sinon.stub() }; + config = { + get: this.sinon.stub(), + toEnvs: this.sinon.stub(), + isPlatformEnabled: this.sinon.stub() + }; getOverviewScope = getOverviewScopeFactory(mockGetCoreScope, mockGetMasternodeScope, mockGetPlatformScope); @@ -70,6 +74,7 @@ describe('getOverviewScopeFactory', () => { }); it('should not load if masternode or platform disabled ', async () => { + config.isPlatformEnabled.returns(false); config.get.withArgs('core.masternode.enable').returns(false); config.get.withArgs('network').returns('mainnet'); diff --git a/packages/dashmate/test/unit/status/scopes/platform.spec.js b/packages/dashmate/test/unit/status/scopes/platform.spec.js index d3a272292ed..c27da4e905b 100644 --- a/packages/dashmate/test/unit/status/scopes/platform.spec.js +++ b/packages/dashmate/test/unit/status/scopes/platform.spec.js @@ -37,7 +37,12 @@ describe('getPlatformScopeFactory', () => { mockFetch = this.sinon.stub(fetch, 'Promise'); mockGetConnectionHost = this.sinon.stub(); - config = { get: this.sinon.stub(), toEnvs: this.sinon.stub() }; + config = { + get: this.sinon.stub(), + toEnvs: this.sinon.stub(), + isPlatformEnabled: this.sinon.stub() + }; + getPlatformScope = getPlatformScopeFactory(mockDockerCompose, mockCreateRpcClient, mockGetConnectionHost); }); @@ -112,7 +117,7 @@ describe('getPlatformScopeFactory', () => { mockDetermineDockerStatus.returns(DockerStatusEnum.running); mockRpcClient.mnsync.returns({ result: { IsSynced: true } }); mockMNOWatchProvider.returns(Promise.resolve('OPEN')); - mockFetch.returns(Promise.reject(new FetchError())); + mockFetch.returns(Promise.reject(new FetchError('test'))); mockDockerCompose.execCommand.returns({ exitCode: 0, out: '' }); const scope = await getPlatformScope(config); diff --git a/packages/dashmate/test/unit/status/scopes/services.spec.js b/packages/dashmate/test/unit/status/scopes/services.spec.js index 2f4280472d7..108362d0039 100644 --- a/packages/dashmate/test/unit/status/scopes/services.spec.js +++ b/packages/dashmate/test/unit/status/scopes/services.spec.js @@ -10,7 +10,12 @@ describe('getServicesScopeFactory', () => { beforeEach(async function it() { mockDockerCompose = { inspectService: this.sinon.stub() }; - config = { get: this.sinon.stub(), toEnvs: this.sinon.stub() }; + config = { + get: this.sinon.stub(), + toEnvs: this.sinon.stub(), + isPlatformEnabled: this.sinon.stub() + }; + getServicesScope = getServicesScopeFactory(mockDockerCompose); }); From 00b5309fc8da818627586eaaf5cb318af986c5a6 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Sat, 25 Mar 2023 16:22:07 +0800 Subject: [PATCH 70/93] style: fix linter erros --- packages/dashmate/test/unit/status/scopes/overview.spec.js | 2 +- packages/dashmate/test/unit/status/scopes/platform.spec.js | 2 +- packages/dashmate/test/unit/status/scopes/services.spec.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/dashmate/test/unit/status/scopes/overview.spec.js b/packages/dashmate/test/unit/status/scopes/overview.spec.js index 45911fbbaca..81c5bbe1c0a 100644 --- a/packages/dashmate/test/unit/status/scopes/overview.spec.js +++ b/packages/dashmate/test/unit/status/scopes/overview.spec.js @@ -20,7 +20,7 @@ describe('getOverviewScopeFactory', () => { config = { get: this.sinon.stub(), toEnvs: this.sinon.stub(), - isPlatformEnabled: this.sinon.stub() + isPlatformEnabled: this.sinon.stub(), }; getOverviewScope = getOverviewScopeFactory(mockGetCoreScope, diff --git a/packages/dashmate/test/unit/status/scopes/platform.spec.js b/packages/dashmate/test/unit/status/scopes/platform.spec.js index c27da4e905b..3e9be784b23 100644 --- a/packages/dashmate/test/unit/status/scopes/platform.spec.js +++ b/packages/dashmate/test/unit/status/scopes/platform.spec.js @@ -40,7 +40,7 @@ describe('getPlatformScopeFactory', () => { config = { get: this.sinon.stub(), toEnvs: this.sinon.stub(), - isPlatformEnabled: this.sinon.stub() + isPlatformEnabled: this.sinon.stub(), }; getPlatformScope = getPlatformScopeFactory(mockDockerCompose, diff --git a/packages/dashmate/test/unit/status/scopes/services.spec.js b/packages/dashmate/test/unit/status/scopes/services.spec.js index 108362d0039..7dada5436b3 100644 --- a/packages/dashmate/test/unit/status/scopes/services.spec.js +++ b/packages/dashmate/test/unit/status/scopes/services.spec.js @@ -13,7 +13,7 @@ describe('getServicesScopeFactory', () => { config = { get: this.sinon.stub(), toEnvs: this.sinon.stub(), - isPlatformEnabled: this.sinon.stub() + isPlatformEnabled: this.sinon.stub(), }; getServicesScope = getServicesScopeFactory(mockDockerCompose); From 5792ba6c7362e3a165a8b76e2c826c7fd621b48b Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Mon, 27 Mar 2023 13:10:41 +0800 Subject: [PATCH 71/93] docs: update readme --- packages/dashmate/README.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/dashmate/README.md b/packages/dashmate/README.md index c3fd890b0aa..96656a31464 100644 --- a/packages/dashmate/README.md +++ b/packages/dashmate/README.md @@ -101,18 +101,15 @@ DESCRIPTION ``` Supported presets: - * `testnet` - a masternode or full node for testnet - * `local` - a node group to run a local dash network with the specified number of masternodes. To operate a group of nodes, use the [group commands](#node-groups) + * `mainnet` - a node connected to Dash main network + * `testnet` - a node connected to the Dash test network + * `local` - a full network environment on your machine for local development. To operate a group of nodes, use the [group commands](#node-groups) -To set up a testnet masternode: +To set up a testnet node: ```bash -$ dashmate setup testnet masternode +$ dashmate setup testnet ``` -#### Masternode registration - -If a funding private key is provided with the `--funding-private-key` option, the tool will automatically register your node on the network as a masternode. This functionality is only available when using the `testnet` preset. - ### Configure node The `config` command is used to manage your node configuration before starting the node. Several system configurations are provided as a starting point: @@ -120,6 +117,7 @@ The `config` command is used to manage your node configuration before starting t - base - basic config for use as template - local - template for local node configs - testnet - testnet node configuration + - mainnet - mainnet node configuration You can modify and use the system configs directly, or create your own. You can base your own configs on one of the system configs using the `dashmate config create CONFIG [FROM]` command. You must set a default config with `dashmate config default CONFIG` or specify a config with the `--config=` option when running commands. The `base` config is initially set as default. From c9fc0bf4bf7aafd20925a2488341ffbacda8f81d Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Mon, 27 Mar 2023 13:14:56 +0800 Subject: [PATCH 72/93] Update packages/dashmate/README.md Co-authored-by: thephez --- packages/dashmate/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dashmate/README.md b/packages/dashmate/README.md index 96656a31464..766ae6d85a4 100644 --- a/packages/dashmate/README.md +++ b/packages/dashmate/README.md @@ -287,7 +287,7 @@ dashmate config set core.masternode.enable false ### Node groups -CLI allows to [setup](#set-up-node) and operate multiple nodes. Only the `local` preset is supported at the moment. +CLI allows [setup](#set-up-node) and operation of multiple nodes. Only the `local` preset is supported at the moment. #### Default group From ff2d5a7df60e890a84133877424582c9b69c942c Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Mon, 27 Mar 2023 13:15:24 +0800 Subject: [PATCH 73/93] Update packages/dashmate/README.md Co-authored-by: thephez --- packages/dashmate/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dashmate/README.md b/packages/dashmate/README.md index 766ae6d85a4..37b4a23b16a 100644 --- a/packages/dashmate/README.md +++ b/packages/dashmate/README.md @@ -291,7 +291,7 @@ CLI allows [setup](#set-up-node) and operation of multiple nodes. Only the `loca #### Default group -The [setup](#set-up-node) command set corresponding group as default. To output the current default group or set another one as default use `group:default` command. +The [setup](#set-up-node) command sets the corresponding group as default. To output the current default group or set another one as default use the `group:default` command. ``` USAGE From a26d108494a515acf9f1456e749968a7472ff6ff Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Mon, 27 Mar 2023 13:16:15 +0800 Subject: [PATCH 74/93] Update packages/dashmate/src/commands/setup.js Co-authored-by: thephez --- packages/dashmate/src/commands/setup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dashmate/src/commands/setup.js b/packages/dashmate/src/commands/setup.js index 00f5ebbbd31..b3dfd31bd01 100644 --- a/packages/dashmate/src/commands/setup.js +++ b/packages/dashmate/src/commands/setup.js @@ -80,7 +80,7 @@ class SetupCommand extends BaseCommand { To set up a node with this preset from scratch use {bold.cyanBright dashmate reset --config ${ctx.preset} --hard}. Previous data and configuration for this preset will be lost. - If you want to keep existing data and configuration, please use the {bold.cyanBright dashmate config create} + If you want to keep the existing data and configuration, please use the {bold.cyanBright dashmate config create} command to create a new configuration for this preset.`; throw new Error(`Preset ${ctx.preset} already configured`); } else { From e0349eb3e16305084e2ee18e84b5c8d9f036737f Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Mon, 27 Mar 2023 13:18:05 +0800 Subject: [PATCH 75/93] docs: add zero ssl url --- .../tasks/setup/regular/configureSSLCertificateTaskFactory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js index 170aea7dc83..f513c2daf30 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/configureSSLCertificateTaskFactory.js @@ -113,7 +113,7 @@ function configureSSLCertificateTaskFactory( browsers, and must therefore be issued by a well-known Certificate Authority (CA). Dashmate offers three options to configure this certificate: - ZeroSSL - Provide a (free) ZeroSSL API key and let dashmate configure the certificate + ZeroSSL - Provide a (free) ZeroSSL API key and let dashmate configure the certificate (https://zerossl.com) File on disk - Provide your own certificate to dashmate Self-signed - Generate your own self-signed certificate (testnet only)\n`, message: 'How do you want to configure SSL?', From 8155cd5daa4538eb20dfeabc639233a3034441cb Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Mon, 27 Mar 2023 13:18:27 +0800 Subject: [PATCH 76/93] Update packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js Co-authored-by: thephez --- .../tasks/setup/regular/registerMasternodeGuideTaskFactory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index 2d4aab64df8..02028b1820b 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -124,7 +124,7 @@ function registerMasternodeGuideTaskFactory() { header: ` Dashmate needs to collect details about the owner, voting and payout addresses to use in the masternode registration transaction. These are regular Dash addresses, encoded in base58 format.\n`, - message: 'Enter DIP3 masternode addresses:', + message: 'Enter masternode addresses:', choices: [ { name: 'ownerAddress', From 3f8ea186553ff0a1fe6583c82cce64d94f3d0878 Mon Sep 17 00:00:00 2001 From: strophy Date: Mon, 27 Mar 2023 14:30:03 +0800 Subject: [PATCH 77/93] docs: grammar fix --- packages/dashmate/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dashmate/README.md b/packages/dashmate/README.md index 37b4a23b16a..df70996bd60 100644 --- a/packages/dashmate/README.md +++ b/packages/dashmate/README.md @@ -101,7 +101,7 @@ DESCRIPTION ``` Supported presets: - * `mainnet` - a node connected to Dash main network + * `mainnet` - a node connected to the Dash main network * `testnet` - a node connected to the Dash test network * `local` - a full network environment on your machine for local development. To operate a group of nodes, use the [group commands](#node-groups) From 4e6047ee901739506ce8562ebdb19cb0cefddf44 Mon Sep 17 00:00:00 2001 From: strophy Date: Mon, 27 Mar 2023 15:06:05 +0800 Subject: [PATCH 78/93] docs: more grammar review --- packages/dashmate/README.md | 43 +++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/packages/dashmate/README.md b/packages/dashmate/README.md index df70996bd60..38c4f81a4c2 100644 --- a/packages/dashmate/README.md +++ b/packages/dashmate/README.md @@ -4,7 +4,7 @@ [![Release Date](https://img.shields.io/github/release-date/dashpay/platform)](https://github.com/dashpay/platform/releases/latest) [![standard-readme compliant](https://img.shields.io/badge/readme%20style-standard-brightgreen.svg)](https://github.com/RichardLitt/standard-readme) -Distribution package for Dash Masternode installation +Distribution package for Dash node installation ## Table of Contents @@ -33,7 +33,7 @@ Distribution package for Dash Masternode installation * [Docker](https://docs.docker.com/engine/installation/) (v20.10+) * [Node.js](https://nodejs.org/en/download/) (v16, NPM v8.0+) -For Linux installations you may optionally wish to follow the [post-installation steps](https://docs.docker.com/engine/install/linux-postinstall/) to manage Docker as a non-root user, otherwise you will have to run CLI and Docker commands with `sudo`. +For Linux installations you may optionally wish to follow the Docker [post-installation steps](https://docs.docker.com/engine/install/linux-postinstall/) to manage Docker as a non-root user, otherwise you will have to run CLI and Docker commands with `sudo`. ### Distribution package @@ -54,9 +54,9 @@ $ dashmate start In some cases, you must also additionally reset platform data: -* Upgrade contains non-compatible changes (f.e. switching between v22/v23) -* Command ``dashmate setup`` finished with errors or interrupted in the process -* Platform layer has been wiped in the network +* Upgrade contains non-compatible changes (e.g. switching between v22/v23) +* The ``dashmate setup`` command exited with errors or was interrupted +* The platform layer was wiped on the network ```bash $ dashmate stop @@ -67,7 +67,7 @@ $ dashmate setup $ dashmate start ``` -Before applying an upgrade, local network should be stopped and reset via ``dashmate reset --hard``. +Before applying an upgrade, the local network should be stopped and reset with ``dashmate reset --hard``. ## Usage @@ -75,7 +75,7 @@ The package contains a CLI, Docker Compose and configuration files. ### CLI -The CLI can be used to perform routine tasks. Invoke the CLI with `dashmate` if linked during installation, or with `node bin/dashmate` if not linked. To list available commands, either run `dashmate` with no parameters or execute `dashmate help`. To list the help on any command just execute the command, followed by the `--help` option. +The CLI can be used to perform routine tasks. Invoke the CLI with `dashmate`. To list available commands, either run `dashmate` with no parameters or execute `dashmate help`. To list the help on any command execute the command, followed by the `--help` option. ### Set up node @@ -247,7 +247,7 @@ $ dashmate reset --hard ``` #### Manual reset -Manual reset is used when local setup corrupts and hard reset does not fix it. This could happen, when dashmate configuration becomes incompatible after a major upgrade, making you unable to execute any commands. +Manual reset can be used if the local setup is corrupted and a hard reset does not fix it. This could happen due to dashmate configuration incompatibilities after a major upgrade, leaving you unable to execute any commands. ```bash docker stop $(docker ps -q) docker system prune @@ -258,16 +258,13 @@ rm -rf ~/.dashmate/ ### Reindex dashcore chain data -The `reindex` command rebuilds the block chain index using the downloaded block data. +The `reindex` command rebuilds the blockchain index using the downloaded block data. It modifies the configuration to start the core container in `reindex=1` mode, waits until it completes a full resync, and returns it to normal mode. -It modifies the configuration, runs the core container in `reindex=1` mode, waits until it fully resynces, and returns it to the normal mode. - -The process is interactive (shows progress) and can be interrupted any time, but you cannot start your configuration until the resync is fully complete. +The process is displays interactive progress and can be interrupted at any time, but you cannot start your configuration until the resync is fully complete. The `reindex` command works for regular and local configurations. ``` -Reindex Core USAGE $ dashmate core reindex [-v] [--config ] FLAGS @@ -287,7 +284,7 @@ dashmate config set core.masternode.enable false ### Node groups -CLI allows [setup](#set-up-node) and operation of multiple nodes. Only the `local` preset is supported at the moment. +The CLI allows [setup](#set-up-node) and operation of multiple nodes. Only the `local` preset is supported at the moment. #### Default group @@ -390,11 +387,11 @@ DESCRIPTION Reset group nodes ``` -With the hard reset mode enabled, corresponding configs will be reset as well. To proceed, running the node [setup](#set-up-node) is required. +With hard reset mode enabled, the corresponding node configs will be reset as well. It will be necessary to run node [setup](#set-up-node) again from scratch to start a new local node group. #### Create config group -To group nodes together, set a group name to `group` option in corresponding configs. +To group nodes together, set a group name using the `group` option with the corresponding configs. Create a group of two testnet nodes: ```bash @@ -409,17 +406,17 @@ dashmate config set --config=testnet_2 group testnet dashmate group default testnet ``` -To start the group of nodes, ports and other required options need to be updated. +Ports and other required options need to be updated to avoid port collisions before starting the group of nodes. ### Development -To start a local dash network, the `setup` command with the `local` preset can be used to generate configs, mine some dash, register masternodes and populate the nodes with the data required for local development. +To start a local dash network, the `setup` command with the `local` preset can be used to generate configs, mine some tDash, register masternodes and populate the nodes with the data required for local development. -To allow developers quickly test changes to DAPI and Drive, a local path for this repository may be specified via the `platform.sourcePath` config options. A Docker image will be built from the provided path and then used by Dashmate. +To allow developers to quickly test changes to DAPI and Drive, a local path for this repository may be specified using the `platform.sourcePath` config options. A Docker image will be built from the provided path and then used by Dashmate. ### Docker Compose -If you want to use Docker Compose directly, you will need to pass a configuration as a dotenv file. You can output a config to a dotenv file for Docker Compose as follows: +If you want to use Docker Compose directly, you will need to pass in configuration as a dotenv file. You can output a config to a dotenv file for Docker Compose as follows: ```bash $ dashmate config envs --config=testnet --output-file .env.testnet @@ -440,17 +437,17 @@ One of your nodes is not running, you may retry with the --force option: `dashmate group:stop --force` to stop group of nodes (local) #### Running services detected. Please ensure all services are stopped for this config before starting -Some nodes are still running and preventing dashmate to make a proper start, that might be left after unsuccessful close. Try to stop them forcibly with --force option before trying to start +Some nodes are still running and preventing dashmate from starting properly. This may occur after a command exits with an error. Try to stop force stop the nodes using the `--force` option before trying to run the `start` command again. `dashmate stop --force` to stop single node (fullnode / masternode) `dashmate group:stop --force` to stop group of nodes (local) #### externalIp option is not set in base config -This may happen when you switch between multiple major versions, so your config became incompatible. In this case, do a manual reset and run setup again +This may happen when you switch back and forth between major versions, making config incompatible. In this case, do a manual reset and run setup again #### TypeError Plugin: dashmate: Cannot read properties of undefined (reading 'dash') -This could happen if you have other .yarnrc and node_modules in your upper directories. Check your home directory for any .yarnrc and node_modules, wipe them all and try again +This can occur if other `.yarnrc` and `node_modules` directories exist in parent directories. Check your home directory for any `.yarnrc` and `node_modules`, delete them all and try again. From 87b88a84922f653b116b92cff015249316565fb8 Mon Sep 17 00:00:00 2001 From: strophy Date: Mon, 27 Mar 2023 16:15:05 +0800 Subject: [PATCH 79/93] docs: refactor readme, command usage and command help output --- packages/dashmate/README.md | 137 +++++++++--------- packages/dashmate/package.json | 20 ++- .../dashmate/src/commands/config/create.js | 5 +- .../dashmate/src/commands/config/index.js | 5 +- .../dashmate/src/commands/config/remove.js | 5 +- .../dashmate/src/commands/core/reindex.js | 5 +- .../src/commands/group/core/reindex.js | 5 +- .../src/commands/platform/feature-flag.js | 5 +- packages/dashmate/src/commands/reset.js | 5 +- packages/dashmate/src/commands/restart.js | 5 +- packages/dashmate/src/commands/setup.js | 7 +- packages/dashmate/src/commands/ssl/renew.js | 6 +- packages/dashmate/src/commands/start.js | 5 +- packages/dashmate/src/commands/status/core.js | 2 +- .../dashmate/src/commands/status/platform.js | 2 +- packages/dashmate/src/commands/stop.js | 7 +- packages/dashmate/src/commands/update.js | 5 +- packages/dashmate/src/commands/wallet/mint.js | 10 +- 18 files changed, 112 insertions(+), 129 deletions(-) diff --git a/packages/dashmate/README.md b/packages/dashmate/README.md index 38c4f81a4c2..babbdcdfb2f 100644 --- a/packages/dashmate/README.md +++ b/packages/dashmate/README.md @@ -12,7 +12,7 @@ Distribution package for Dash node installation - [Update](#update) - [Usage](#usage) - [Command line interface](#cli) - - [Set up node](#set-up-node) + - [Node setup](#node-setup) - [Configure node](#configure-node) - [Start node](#start-node) - [Stop node](#stop-node) @@ -45,6 +45,18 @@ $ npm install -g dashmate ## Update The `update` command is used to quickly get the latest patches for dashmate components. It is necessary to restart the node after the update is complete. + +``` +USAGE + $ dashmate update [-v] [--config ] + +FLAGS + -v, --verbose use verbose mode for output + --config= configuration name to use +``` + +Example usage: + ```bash $ dashmate stop $ npm update -g dashmate @@ -77,13 +89,11 @@ The package contains a CLI, Docker Compose and configuration files. The CLI can be used to perform routine tasks. Invoke the CLI with `dashmate`. To list available commands, either run `dashmate` with no parameters or execute `dashmate help`. To list the help on any command execute the command, followed by the `--help` option. -### Set up node +### Node setup The `setup` command is used to quickly configure common node configurations. Arguments may be provided as options, otherwise they will be queried interactively with sensible values suggested. ``` -Set up a new Dash node - USAGE $ dashmate setup [PRESET] [-v] [-d] [-c ] [-m ] @@ -123,14 +133,14 @@ You can modify and use the system configs directly, or create your own. You can ``` USAGE - $ dashmate config + $ dashmate config [-v] [--config ] -OPTIONS - -v, --verbose use verbose mode for output - --config=config configuration name to use +FLAGS + -v, --verbose use verbose mode for output + --config= configuration name to use DESCRIPTION - Display configuration options for default config + Show default config COMMANDS config create Create config @@ -148,12 +158,12 @@ The `start` command is used to start a node with the default or specified config ``` USAGE - $ dashmate start + $ dashmate start [-v] [--config ] [-w] -OPTIONS +FLAGS -v, --verbose use verbose mode for output -w, --wait-for-readiness wait for nodes to be ready - --config=config configuration name to use + --config= configuration name to use ``` To start a masternode: @@ -167,12 +177,12 @@ The `stop` command is used to stop a running node. ``` USAGE - $ dashmate stop + $ dashmate stop [-v] [--config ] [-f] -OPTIONS - -f, --force force stop nodes (skips running check) - -v, --verbose use verbose mode for output - --config=config configuration name to use +FLAGS + -f, --force force stop even if any is running + -v, --verbose use verbose mode for output + --config= configuration name to use ``` To stop a node: @@ -186,11 +196,11 @@ The `restart` command is used to restart a node with the default or specified co ``` USAGE - $ dashmate restart + $ dashmate restart [-v] [--config ] -OPTIONS - -v, --verbose use verbose mode for output - --config=config configuration name to use +FLAGS + -v, --verbose use verbose mode for output + --config= configuration name to use ``` ### Show node status @@ -199,11 +209,13 @@ The `status` command outputs status information relating to either the host, mas ``` USAGE - $ dashmate status + $ dashmate status [-v] [--config ] [--format json|plain] -OPTIONS - -v, --verbose use verbose mode for output - --config=config configuration name to use +FLAGS + -v, --verbose use verbose mode for output + --config= configuration name to use + --format=
  • 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 literal 0 HcmV?d00001 diff --git a/.yarn/cache/string-width-npm-5.1.2-bf60531341-7369deaa29.zip b/.yarn/cache/string-width-npm-5.1.2-bf60531341-7369deaa29.zip new file mode 100644 index 0000000000000000000000000000000000000000..bd884056581734e1ed8a0d35bcc747f2a0f54a16 GIT binary patch literal 3889 zcmaKvc{tST`^U!;8Dvd%VXPx-w(Q2fWKd+yHZf&ph>~q2G=>;Qls!919N8HO*%{j? zjGa@mFJ&#h&eE^nab3srxvtOi{PEoH=kvL)*Zti08){5J$qM*$XqJ39``6;17ya>! zM7hCkB2aGkJYhak(Er@Zd2*|d?_D_3{gNNt&DZ0fIC8+*zm90RFa>`^4gfe%0s#D{ z#(BbBVMrgCgM}SxOqvz_*_wNUXv7p;nhzJ2X|**FXiwPiV1}qhu(uMRM?VNMz6cTi zET01;K~J;;;Yx+NRZeu6)C*iBSG|mblCpT{iO6MPhN&Ql;9_(dVQf3PExoY?a-q3Z zLqjdtF>_$f(<*txv!NOZSjv*iQN}mHi4bW7dHVpnm%hgpwG0#TrcmC=X%{^l^(tcp z&$1UeJv}g|x1axsU%S_Ep$Wq!k2MEZ`B|-{lrNr-GbuKB5GYmEaKbzM+nYUnf`)f| z8SVp88gSFMA)oUB3m2bM@jsz_o`Sw@*m6))?H=f!xs~)xq`xzVVlesLXyvxSk?>fZ z31)I%GV}xUS7+eJSK^a0k@>mKm}%1~mPfi11522?8i>RN;N@|_DEvo4dgGO*$k-vJ zi+NbZ*DW0abEqN8#s2+)Zw>YFm2LE|h4c^o6)cqosdw6Sq^fbwUSxTbpneK_b;ob& zo9TKh)IJP!{xXg~Itd0})u&tRdJbpXI(8a+&uo?|6aO$;Nt(ZSyU=Y7{BL;l@b$ln1XrsY{=@3o8-=&eo`b#%h|>0)oW}RM& zNN!U`{rx;`;YW!+!Skf-0FG~Yu*&DNu-8rwpE%k-#plRY_3Xs}P4kplQYmGtoTXG9 z6C(xY#vCS)y{@!-?1vUYU5`9-VOgMOG<6A!Q(vwURmp^PO+$;_ur2>>s;vprDMxOYsRIiOI=-C zGnN@DL)o#@E4?l7ux#O1%Gc#c9HPVq=D15OPJEA>20X;ytgw^@j{5CPnB^yMvt?e# z$%*H|7i)*q59bzHeT#SWea|daz7}z>}vOI)LAJ9O9|zbB6i2@^8E} zueI!CfairEsNS}4v#lq)aS^2-pl?04vd~%v^cw;{oHm_~DWMHcAn>W`p zMpsfg^Ontmzw+#BH@N{ZNNWG(CGg%zFRhQS{(@rI9OTXhix$^z6-7l*Ob|ILOB-M zOf7h}kWk?SHN{s;*Lay@RD1BloO+LED{+08NIk5{rk(_k#7iu(*fG1XegPyWzIq14 zCk=-TT?Eweir{VCYM(!3ygF+HV(VLUB zWrbMh193u#iLC^2+v`xY}&ZScfQ@BUvOxd zGd+RKs%Ooc+>!g4xpzO~Cy_vW32oB79)YLH995fv#(utbI3u1id9R0JdFtUr$%5Im zd#Su!a%&6E?%xaLCfq#CIj@jjQ(aO23h2FJQxRxaW_W&KTg_CFh`$^{_HSy`fYU|h z6aYXg6#yW3Dm8au&Ta^pB*HD?8VO0#V+29j2#ENa+!wFq>OxQBE|;f(ld(8C27V=x@*}er{I= zUaVV@Zp1q|5ei@}4w+Ts|ld<__Sq7aghCCUMY}xM@qdaIakc%}a>OOAa5m=$#^!OF^pgnAZDv#+gvyTRmJH;tXmbM*a&X^9x&7 zK0g(9mFcF}pUk}g-w25#jY@+XbLOv6v;jwARqTltc<7SOf~$N17TnMu13}sI1^dHg zavY9!NmL%~9&QoTuoO}6dHd|uw)%sp&tw_n86{63W1(8A>at=wMnnvrp_H0Ew0%_y zH{uPU0s8laqiH&$vYk9fBSoeyd;{)X7o<<9w=Gxfj#5WG;|{>AEH1tmjsuI0Nv~rQ zOTQ@PmVsAXtq1ej=Hk(jS}S;LN!xJVYJ0Aw@55|c^RvFO-4d^A->8;l8OZ}nKZwaM znM6-oUNj=;r}}*#7wTTpze1KED%3l3Xu#Y?`CP~ho_PH#Ay4Y1WxV?X+@MAGo?yCQ zG$+-k`3NMge=j#LE{fMM?&^Nl1<;C4#;qdkAGVohhqVPQ?e}7QcffVX>9W|X;h$5R z$QE<)oz~ZZ;&?O3#|cm+k2ulGg?Ba;&ECtAV1^U6AWLZ*Oz~or8-jjD8&fjzmx_!<35|F^|UJs&ENzm0j0z@O#vVM$^r? z5GNJH%V!jdB-A8c(abe~y~6uqg5Zz~WZm0K8%(Ql!>aeQL|{R~-QU~LBHNCEv^moy zVfm0S(~F~}<%HTM$yc|z+Xuk|9#``e4!WSr2(bHNU4VD+G8ACDuCVE*9hsh`x zhJRsO6i|8-8`o~9`Q=5tuDR?p2k+Yh#?*udE~9vtWEzRr^MYv-QzIl$d3gGVc%ouR@#m_qSK6Iuw*BFEmB{c;N!_6mAw~j+$4>mk#gB?U1)gRC!mGcdH8#@46ht z`#T?~Y~_Bp&I_yCM(aLN74mhMpnzI~+@RJGn^uW-{Ef1rfNz|O?j36dH$^-*=niJ3 zq?W3e>KJq}TP_1H67?a@U=Q1^xvC0BdGFpnQ$qgM=K41C*RL#-61b4;8@vk6t%t`v zkdbRp{I>@>hT^ZWqV?x=!V&#<=%1eG=UCAKA20tEdcq<7t@E?RJn4~s>g0yHo~rYY zWBU0=Kjlt#tiR+y$JGD#XZ`G7PwJiQeSYbQpE*tM|93(sHBVN?Uz$$Tr)mCQojfUc iGO>RNZURpe{FUZV<1@!)8UUa^emIUDEBT*}81O%?a+>r2 literal 0 HcmV?d00001 diff --git a/.yarn/cache/strip-ansi-npm-7.0.1-668c121204-257f78fa43.zip b/.yarn/cache/strip-ansi-npm-7.0.1-668c121204-257f78fa43.zip new file mode 100644 index 0000000000000000000000000000000000000000..84c011395c5894ca9dca25b6d8afc262179e647f GIT binary patch literal 3116 zcmaJ@2{=^k`yPXaVUQWoVjD|^(4wq^#@LEv$!9m13}%z1tR+jfQj#rXvP7RfdxRt; zGmNoBAyU>vvM;~s`#%5vxh_5DI_G`Qb-mC1zR$Vt^W3-5Ic63Z;AdzQ^sxOi`R@T? zj0B<+#tu((^1@*}wnK==Zur`0kR;3PMDVD9`ct7$O}xN^e;xePOWQ1^1p0S zS62(LP467VT}qn6)m9JyQ{h~`xC1THL{c}@^dR8O<$$t?Ejo3_tkPd$GuxUP@}6azpr?E=7^7 zh%@<(E$~rd7t3VFYUhvI=doq4A^8$In?9#a6ltKPW-Ymj7&M6~Yf!v{*&1Q{12Lbf zJp=OK=JYvkyU|L~T|f*sTD{#IdEK&9*Uma$s6-#rpGo{A;+o^MB6T9IA*K5-DzuNi zOtu0{LYADJAzL#^FMczDSpe6~C46jTOztx3}n@b-$NBewPtS5XmmHGOQM=}%eU zHAr?_XkS>H=WPkANb8&cpfnl$(pvOLaHO6D4Nnm_wX%4iptH(}=D3(AUh)khM+aII zgVy;ta(ZQ`VtfOSefR&!!jvV9VDjy4KJRb-9Gh{X{O!tZutAm*^dZZMa3ZiueXQY#XJMRPhc*Cwlj=dvUk^8k0<6mPV-(&bw*qR*?!L}DhVFB1Vbo( zn9clAy{t9QMsX`msX9t+3xM%0C+8GNa#_P)Y^bWT>9+`J-3|%QXf)Jq5X3_{ZWlDH zDt>8hEIgt#-Z^!HaJh_-<&%q;CLPKf;ff<7$2ah13d*I8CKit70WwufYL+oy3Gd9f z$S9q%LZ8LWI1v5;v%5wwS6Wrx4MSI`V7QX7iQU0VJ`^B?l2YIvseObxcnzDlrkIUX z5D53Hr)O}ab(cIok@&{B&Iy-sY#EQ5zmqF>buEfcEcQbJm+McPJRpZzZ_n0Ule!OEiHa{WYQPkdDFt`f~pHUuG{me zp=H@gC;xstxOFe9+FgV4o>}vcw+5B4_70=Mg`*Wk{rUFmn{}}lwHH0A>ZGW>$34Y+ za#kf>parxs2|fDB>up<1zcb)Mpelbhqfa-m0sx|aV89g&+6j-5#XH?LH6RYibJnhz z^Nbgr(ttYG-+*w?$Wytfibh&m$zzPu>mK;IWJK)3P)uxBwN0?YEk)jyWnBaf0TfOt z6{FkkYdZS23$o8y{WHIYZMpMUHH4zPJYJFBehi`VNmhNhYfH#1+>Ch+4T>kJ~#(PxgTV z`s^)X7Y0Wg3Kf(5m&=#?2C+w@yVlk+1v#IfEGUNPq9snQS04h?421{sG1!qSGUplp z+J!IrkzU+W(Q0nq+-b?<93c_m*k22+r%wS@FE#!%jo$OrdLbI?&`E3dHqS3?alMd>KCaOB6 zq*ia;iwT+8y64^ZN`?9)Q-v7r?5eKyiZRz+>>nOa6kSuNW#&a?wpFjh-VUz4TEtYwOK; zX_FUp-l%SAEeWKOP(5;nM6iZ#G^irP{P%F0v}DaethMnAn(M+<2j_qrtiO{yS7+(o z0E65%j8+H#1IhpG=1#Jn9{8Ac!$x_Ykl8iZ3#ACHL*n8_$Be8Dtt(Aa^t&tX+%Gt= z)#9xs{OGk_Yv=$aQ04FamtaLvLW1vzh^xX{tVdJew9`_DN<5-v^8`$?*BdyLyVH;4 z&-Uf?VHFL-MzJk=Q~8oNLk5st4*+gneEmPblhu3Zl-0!afy5hK3I?m1@At(quXjcV za-03A{GdJ|7fka#Ii=r~!t7W`455T9EGXGy^9tzX z6a1WXg(iZjbQmJmTmHmjg>x~ur_Yn!zAObbGJF~nP@Q>qE6Dgh|HO>u&tZo#+&%TD zHQbIFO=-sTx76Q^;=d@{TD#LKZlh!dq5pvLpK;u-W*cm$aQ^}mVQAcLN7|P0ooGAt z@fRA1;cIt8`~PaW6LDw1{e{TBXLrQ^>%KeTb~5`H+*gLj-|c|Ecy4r#m9Z@V0AgGa Lh77QSf4=<>1=b*i literal 0 HcmV?d00001 diff --git a/.yarn/cache/wrap-ansi-npm-8.1.0-26a4e6ae28-371733296d.zip b/.yarn/cache/wrap-ansi-npm-8.1.0-26a4e6ae28-371733296d.zip new file mode 100644 index 0000000000000000000000000000000000000000..2ee78f31c85ded17883b9533a5ae0f977f64a35a GIT binary patch literal 5880 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 literal 0 HcmV?d00001 diff --git a/packages/dashmate/src/commands/setup.js b/packages/dashmate/src/commands/setup.js index 01474583b8b..cb43f57bc5d 100644 --- a/packages/dashmate/src/commands/setup.js +++ b/packages/dashmate/src/commands/setup.js @@ -5,7 +5,6 @@ const { Flags } = require('@oclif/core'); const chalk = require('chalk'); const yosay = require('yosay'); -// const begoo = require('begoo'); const BaseCommand = require('../oclif/command/BaseCommand'); @@ -114,12 +113,16 @@ class SetupCommand extends BaseCommand { }); // eslint-disable-next-line no-console - console.log( - yosay( - `Hello! I'm your ${chalk.bold.cyanBright('Dash')} mate!\n\nI will assist you with setting up a Dash node on mainnet or testnet. I can also help you setup a development network on your local system.`, - { maxLength: 45 }, - ), - ); + await import('begoo').then(({ begoo }) => { + console.log( + begoo( + `Hello! I'm your ${chalk.bold.cyanBright('Dash')} mate!\n\nI will assist you with setting up a Dash node on mainnet or testnet. I can also help you setup a development network on your local system.`, + { maxLength: 45 }, + ), + ); + }) + + try { await tasks.run({ From df56236d5b29729cdd278f01ba2c767ae5a9cc13 Mon Sep 17 00:00:00 2001 From: strophy Date: Fri, 24 Feb 2023 18:14:56 +1100 Subject: [PATCH 06/93] chore: add dashmate setup command user help text --- packages/dashmate/scripts/helper.js | 2 +- packages/dashmate/src/commands/setup.js | 6 +- .../setup/setupRegularPresetTaskFactory.js | 59 +++++++++---------- 3 files changed, 33 insertions(+), 34 deletions(-) diff --git a/packages/dashmate/scripts/helper.js b/packages/dashmate/scripts/helper.js index 61f5b93d464..c9bf7174317 100644 --- a/packages/dashmate/scripts/helper.js +++ b/packages/dashmate/scripts/helper.js @@ -15,7 +15,7 @@ const createDIContainer = require('../src/createDIContainer'); const [configName] = args; // eslint-disable-next-line no-console - console.info('Starting Dashmate helper'); + console.info('Starting dashmate helper'); const container = await createDIContainer(); diff --git a/packages/dashmate/src/commands/setup.js b/packages/dashmate/src/commands/setup.js index cb43f57bc5d..38f4f60f063 100644 --- a/packages/dashmate/src/commands/setup.js +++ b/packages/dashmate/src/commands/setup.js @@ -74,8 +74,8 @@ class SetupCommand extends BaseCommand { ctx.preset = await task.prompt([ { type: 'select', - header: ' Dashmate provides default configuration presets:\n local - Run a fully functional network environment on your machine for local development' - + '\n mainnet - Run a node connected to the primary Dash network' + header: ' Dashmate provides three default configuration presets:\n local - Run a fully functional network environment on your machine for local development' + + '\n mainnet - Run a node connected to the Dash main network' + '\n testnet - Run a node connected to the Dash test network\n', message: 'Select preset', choices: PRESETS, @@ -116,7 +116,7 @@ class SetupCommand extends BaseCommand { await import('begoo').then(({ begoo }) => { console.log( begoo( - `Hello! I'm your ${chalk.bold.cyanBright('Dash')} mate!\n\nI will assist you with setting up a Dash node on mainnet or testnet. I can also help you setup a development network on your local system.`, + `Hello! I'm your ${chalk.bold.cyanBright('Dash')} mate!\n\nI will assist you with setting up a Dash node on mainnet or testnet. I can also help you set up a development network on your local system.`, { maxLength: 45 }, ), ); diff --git a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js index a5f8b5ae20a..2695acb1f50 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js @@ -60,14 +60,14 @@ function setupRegularPresetTaskFactory( ctx.nodeType = await task.prompt([ { type: 'select', - header: ' The Dash network has several different node types:' + header: ' The Dash network consists of several different node types:' + ' \n Full nodes: Host a full copy of the Dash blockchain (no collateral required)' - + ' \n Masternodes: Full node features plus additional Core services such as ChainLocks and InstantSend (1000 DASH collateral)' - + ' \n High-performance masternodes: Masternode features plus hosting of Dash Platform (4000 DASH collateral)\n', + + ' \n Masternodes: Full node features, plus Core services such as ChainLocks and InstantSend (1000 DASH collateral)' + + ' \n High-performance masternodes: Masternode features, plus Platform services such as DAPI and Drive (4000 DASH collateral)\n', message: 'Select node type', choices: [ - { name: NODE_TYPE_MASTERNODE, hint: 'Take me, I\'m cheaper' }, - { name: NODE_TYPE_HPMN, message: 'high-performance masternode' }, + { name: NODE_TYPE_MASTERNODE, hint: '1000 DASH collateral' }, + { name: NODE_TYPE_HPMN, message: 'high-performance masternode', hint: '4000 DASH collateral' }, { name: NODE_TYPE_FULLNODE }, ], initial: NODE_TYPE_HPMN, @@ -87,23 +87,19 @@ function setupRegularPresetTaskFactory( task: async (ctx, task) => { let header; if (ctx.nodeType === NODE_TYPE_HPMN) { - header = 'If your masternode is already registered, we will import your masternode ' - + ' operator and platform node keys to configure an HP masternode. Please make ' - + ' sure your IP address didn\'t change, otherwise you need to update. If' - + ' you are' - + ' registering a' - + ' new' - + ' masternode, I will provide more information and help you to generate' - + ' necessary keys.\n'; + header = 'If your HP masternode is already registered, we will import your masternode' + + ' operator and platform node keys to configure an HP masternode.' + + ' Please make sure your IP address has not changed, otherwise you will need' + + ' to create a provider update service transaction.\n\n' + + ' If you are registering a new HP masternode, I will provide more information' + + ' and help you to generate the necessary keys.\n'; } else { - header = 'If your masternode is already registered, we will import your masternode ' - + ' operator to configure a masternode. Please make ' - + ' sure your IP address didn\'t change, otherwise you need to update If' - + ' you are' - + ' registering a' - + ' new' - + ' masternode, I will provide more information and help you to generate' - + ' necessary keys.\n'; + header = 'If your masternode is already registered, we will import your masternode' + + ' operator key to configure a masternode.' + + ' Please make sure your IP address has not changed, otherwise you will need' + + ' to create a provider update service transaction.\n\n' + + ' If you are registering a new masternode, I will provide more information' + + ' and help you to generate the necessary keys.\n'; } ctx.isMasternodeRegistered = await task.prompt([ @@ -111,8 +107,8 @@ function setupRegularPresetTaskFactory( type: 'toggle', header, message: 'Is your masternode already registered?', - enabled: 'Yep', - disabled: 'Nope', + enabled: 'Yes', + disabled: 'No', }, ]); @@ -126,11 +122,14 @@ function setupRegularPresetTaskFactory( ctx.registrar = await task.prompt([ { type: 'select', - header: 'Dashmate is not going to register masternode for you because it\'s not' + - ' secure. You can use Dash Core so we can generate a RPC command for you or you' + - ' can use other tools and we can help you to generate operator key and node id' + - ' because that\'s only what dashmate cares\n', - message: 'What do you want to use to register masternode?', + header: 'For security reasons, Dash masternodes should never store masternode owner' + + ' or collateral private keys. Dashmate therefore cannot register a masternode for' + + ' you directly. Instead, we will generate RPC commands that you can use in Dash' + + ' Core or other external tools where the keys are handled securely. During this' + + ' process, dashmate can optionally generate configuration elements as necessary,' + + ' such as certificates, the BLS operator key and the node id, since this is the' + + ' only information necessary for dashmate to configure the masternode.', + message: 'Which tool will you use to register your masternode?', choices: [ { name: 'core', message: 'Dash Core (Wallet?)' }, { name: 'other', message: 'Other' }, @@ -141,7 +140,7 @@ function setupRegularPresetTaskFactory( }, }, { - title: 'Register masternode with Dash Core (Wallet?)', + title: 'Register masternode with Dash Core', enabled: (ctx) => ctx.registrar === 'core' && (ctx.nodeType === NODE_TYPE_HPMN || ctx.nodeType === NODE_TYPE_MASTERNODE), task: async (ctx, task) => { @@ -469,7 +468,7 @@ function setupRegularPresetTaskFactory( }, }, { - title: 'Set masternode operator private key', + title: 'Set masternode operator BLS private key', enabled: (ctx) => ctx.nodeType === NODE_TYPE_MASTERNODE, task: async (ctx, task) => { if (ctx.operatorBlsPrivateKey === undefined) { From 3071d59b4a5e5787a103e5ba094374dc76a8bc4b Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 21 Mar 2023 10:16:14 +0800 Subject: [PATCH 07/93] chore: remove unnecessary dependency --- .pnp.cjs | 135 +++++++++++++++-- ...ct-npm-1.1122.0-50d083704d-41af353430.zip} | Bin 24810 -> 24808 bytes yarn.lock | 136 ++++++++++++++++-- 3 files changed, 248 insertions(+), 23 deletions(-) rename .yarn/cache/{@snyk-protect-npm-1.1108.0-623decd138-a594dd8749.zip => @snyk-protect-npm-1.1122.0-50d083704d-41af353430.zip} (89%) diff --git a/.pnp.cjs b/.pnp.cjs index 18b34879cd2..94ffc91f923 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -4007,6 +4007,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["@snyk/protect", [\ + ["npm:1.1122.0", {\ + "packageLocation": "./.yarn/cache/@snyk-protect-npm-1.1122.0-50d083704d-41af353430.zip/node_modules/@snyk/protect/",\ + "packageDependencies": [\ + ["@snyk/protect", "npm:1.1122.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@socket.io/component-emitter", [\ ["npm:3.1.0", {\ "packageLocation": "./.yarn/cache/@socket.io-component-emitter-npm-3.1.0-3f778351c2-db069d9542.zip/node_modules/@socket.io/component-emitter/",\ @@ -5547,6 +5556,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["ansi-regex", "npm:5.0.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:6.0.1", {\ + "packageLocation": "./.yarn/cache/ansi-regex-npm-6.0.1-8d663a607d-1ff8b7667c.zip/node_modules/ansi-regex/",\ + "packageDependencies": [\ + ["ansi-regex", "npm:6.0.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["ansi-split", [\ @@ -5589,6 +5605,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["ansi-styles", "npm:5.2.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:6.2.1", {\ + "packageLocation": "./.yarn/cache/ansi-styles-npm-6.2.1-d43647018c-ef940f2f0c.zip/node_modules/ansi-styles/",\ + "packageDependencies": [\ + ["ansi-styles", "npm:6.2.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["ansicolors", [\ @@ -6193,6 +6216,26 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["begoo", [\ + ["npm:2.0.2", {\ + "packageLocation": "./.yarn/cache/begoo-npm-2.0.2-d0c18c96a8-3c42191429.zip/node_modules/begoo/",\ + "packageDependencies": [\ + ["begoo", "npm:2.0.2"],\ + ["@snyk/protect", "npm:1.1122.0"],\ + ["ansi-regex", "npm:6.0.1"],\ + ["ansi-styles", "npm:6.2.1"],\ + ["chalk", "npm:2.4.2"],\ + ["cli-boxes", "npm:2.2.1"],\ + ["pad-component", "npm:0.0.1"],\ + ["repeating", "npm:3.0.0"],\ + ["string-width", "npm:4.2.3"],\ + ["strip-ansi", "npm:7.0.1"],\ + ["taketalk", "npm:1.0.0"],\ + ["wrap-ansi", "npm:8.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["big.js", [\ ["npm:5.2.2", {\ "packageLocation": "./.yarn/cache/big.js-npm-5.2.2-e147c30820-b89b6e8419.zip/node_modules/big.js/",\ @@ -7023,6 +7066,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["cli-boxes", "npm:1.0.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:2.2.1", {\ + "packageLocation": "./.yarn/cache/cli-boxes-npm-2.2.1-7125a5ba44-be79f8ec23.zip/node_modules/cli-boxes/",\ + "packageDependencies": [\ + ["cli-boxes", "npm:2.2.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["cli-cursor", [\ @@ -7275,6 +7325,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["colorette", "npm:2.0.16"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:2.0.19", {\ + "packageLocation": "./.yarn/cache/colorette-npm-2.0.19-f73dfe6a4e-888cf5493f.zip/node_modules/colorette/",\ + "packageDependencies": [\ + ["colorette", "npm:2.0.19"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["colors", [\ @@ -7990,6 +8047,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["ajv", "npm:8.8.1"],\ ["ajv-formats", "virtual:58fb68f2aed20e5e0f2e48520ab903ae9bb3440369bfd5e912034003cf27c5aae368649fc5620dd2acbed578131f3a0975e75b838d77d12335fb0412e24026c6#npm:2.1.1"],\ ["awilix", "npm:4.3.4"],\ + ["begoo", "npm:2.0.2"],\ ["chai", "npm:4.3.4"],\ ["chai-as-promised", "virtual:58fb68f2aed20e5e0f2e48520ab903ae9bb3440369bfd5e912034003cf27c5aae368649fc5620dd2acbed578131f3a0975e75b838d77d12335fb0412e24026c6#npm:7.1.1"],\ ["chalk", "npm:4.1.2"],\ @@ -8009,7 +8067,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["hasbin", "npm:1.2.3"],\ ["is-wsl", "npm:2.2.0"],\ ["jayson", "npm:3.6.5"],\ - ["listr2", "virtual:880cda903c2a2be387819a3f857d21494004437a03c92969b9853f7bdeebdfed08d417e68364ee9e158338603a6d78d690c457a55ab11e56398bc10f0ad232fc#npm:3.5.0"],\ + ["listr2", "virtual:880cda903c2a2be387819a3f857d21494004437a03c92969b9853f7bdeebdfed08d417e68364ee9e158338603a6d78d690c457a55ab11e56398bc10f0ad232fc#npm:5.0.7"],\ ["lodash", "npm:4.17.21"],\ ["memory-streams", "npm:0.1.3"],\ ["mocha", "npm:9.2.2"],\ @@ -8025,7 +8083,8 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["semver", "npm:7.3.8"],\ ["sinon", "npm:11.1.2"],\ ["sinon-chai", "virtual:12a596dc9572e25ce715d3736dc74b317c5ca5cfb3b4f67864b1e76b3a401006f84d381aaf975bb5b4da9cafac5125e6869fc78d5202f4c95780c81479112f32#npm:3.7.0"],\ - ["table", "npm:5.4.6"]\ + ["table", "npm:5.4.6"],\ + ["yosay", "npm:2.0.2"]\ ],\ "linkType": "SOFT"\ }]\ @@ -8631,6 +8690,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["eastasianwidth", [\ + ["npm:0.2.0", {\ + "packageLocation": "./.yarn/cache/eastasianwidth-npm-0.2.0-c37eb16bd1-7d00d7cd8e.zip/node_modules/eastasianwidth/",\ + "packageDependencies": [\ + ["eastasianwidth", "npm:0.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["ed25519-hd-key", [\ ["npm:1.3.0", {\ "packageLocation": "./.yarn/cache/ed25519-hd-key-npm-1.3.0-248db2e234-65dcf405f9.zip/node_modules/ed25519-hd-key/",\ @@ -8700,6 +8768,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["emoji-regex", "npm:8.0.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:9.2.2", {\ + "packageLocation": "./.yarn/cache/emoji-regex-npm-9.2.2-e6fac8d058-8487182da7.zip/node_modules/emoji-regex/",\ + "packageDependencies": [\ + ["emoji-regex", "npm:9.2.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["emojis-list", [\ @@ -12668,26 +12743,25 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["listr2", [\ - ["npm:3.5.0", {\ - "packageLocation": "./.yarn/cache/listr2-npm-3.5.0-6aad1da502-cf30837462.zip/node_modules/listr2/",\ + ["npm:5.0.7", {\ + "packageLocation": "./.yarn/cache/listr2-npm-5.0.7-f7d9c71212-5c2cb6ba3f.zip/node_modules/listr2/",\ "packageDependencies": [\ - ["listr2", "npm:3.5.0"]\ + ["listr2", "npm:5.0.7"]\ ],\ "linkType": "SOFT"\ }],\ - ["virtual:880cda903c2a2be387819a3f857d21494004437a03c92969b9853f7bdeebdfed08d417e68364ee9e158338603a6d78d690c457a55ab11e56398bc10f0ad232fc#npm:3.5.0", {\ - "packageLocation": "./.yarn/__virtual__/listr2-virtual-30886726f2/0/cache/listr2-npm-3.5.0-6aad1da502-cf30837462.zip/node_modules/listr2/",\ + ["virtual:880cda903c2a2be387819a3f857d21494004437a03c92969b9853f7bdeebdfed08d417e68364ee9e158338603a6d78d690c457a55ab11e56398bc10f0ad232fc#npm:5.0.7", {\ + "packageLocation": "./.yarn/__virtual__/listr2-virtual-11e98e34b3/0/cache/listr2-npm-5.0.7-f7d9c71212-5c2cb6ba3f.zip/node_modules/listr2/",\ "packageDependencies": [\ - ["listr2", "virtual:880cda903c2a2be387819a3f857d21494004437a03c92969b9853f7bdeebdfed08d417e68364ee9e158338603a6d78d690c457a55ab11e56398bc10f0ad232fc#npm:3.5.0"],\ + ["listr2", "virtual:880cda903c2a2be387819a3f857d21494004437a03c92969b9853f7bdeebdfed08d417e68364ee9e158338603a6d78d690c457a55ab11e56398bc10f0ad232fc#npm:5.0.7"],\ ["@types/enquirer", null],\ - ["chalk", "npm:4.1.2"],\ ["cli-truncate", "npm:2.1.0"],\ + ["colorette", "npm:2.0.19"],\ ["enquirer", "npm:2.3.6"],\ - ["figures", "npm:3.2.0"],\ - ["indent-string", "npm:4.0.0"],\ ["log-update", "npm:4.0.0"],\ ["p-map", "npm:4.0.0"],\ - ["rxjs", "npm:6.6.7"],\ + ["rfdc", "npm:1.3.0"],\ + ["rxjs", "npm:7.8.0"],\ ["through", "npm:2.3.8"],\ ["wrap-ansi", "npm:7.0.0"]\ ],\ @@ -15813,6 +15887,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["repeating", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/repeating-npm-3.0.0-172bd87ce0-d6d736e32e.zip/node_modules/repeating/",\ + "packageDependencies": [\ + ["repeating", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["replace-ext", [\ ["npm:1.0.1", {\ "packageLocation": "./.yarn/cache/replace-ext-npm-1.0.1-ab0bac6614-4994ea1aaa.zip/node_modules/replace-ext/",\ @@ -16925,6 +17008,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["strip-ansi", "npm:6.0.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:5.1.2", {\ + "packageLocation": "./.yarn/cache/string-width-npm-5.1.2-bf60531341-7369deaa29.zip/node_modules/string-width/",\ + "packageDependencies": [\ + ["string-width", "npm:5.1.2"],\ + ["eastasianwidth", "npm:0.2.0"],\ + ["emoji-regex", "npm:9.2.2"],\ + ["strip-ansi", "npm:7.0.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["string.prototype.trim", [\ @@ -17038,6 +17131,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["ansi-regex", "npm:5.0.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:7.0.1", {\ + "packageLocation": "./.yarn/cache/strip-ansi-npm-7.0.1-668c121204-257f78fa43.zip/node_modules/strip-ansi/",\ + "packageDependencies": [\ + ["strip-ansi", "npm:7.0.1"],\ + ["ansi-regex", "npm:6.0.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["strip-bom", [\ @@ -19302,6 +19403,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["strip-ansi", "npm:6.0.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:8.1.0", {\ + "packageLocation": "./.yarn/cache/wrap-ansi-npm-8.1.0-26a4e6ae28-371733296d.zip/node_modules/wrap-ansi/",\ + "packageDependencies": [\ + ["wrap-ansi", "npm:8.1.0"],\ + ["ansi-styles", "npm:6.2.1"],\ + ["string-width", "npm:5.1.2"],\ + ["strip-ansi", "npm:7.0.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["wrappy", [\ diff --git a/.yarn/cache/@snyk-protect-npm-1.1108.0-623decd138-a594dd8749.zip b/.yarn/cache/@snyk-protect-npm-1.1122.0-50d083704d-41af353430.zip similarity index 89% rename from .yarn/cache/@snyk-protect-npm-1.1108.0-623decd138-a594dd8749.zip rename to .yarn/cache/@snyk-protect-npm-1.1122.0-50d083704d-41af353430.zip index 7e02f27921758693f4595d2077f82e13b23ebead..a8fcca0f762f8ff29f9f5805373a80888b876a17 100644 GIT binary patch delta 746 zcmaELknzPq#tqMuSf!T5`uI(Lt>h%TBup!4wOfnxl5Oo5iZ{qDeE#n`6f2GO4)$1ee!B$>H7V0@^$}?vF69zmrMIB-(8t(ckcbW{pXqAy?y>F z;m{9b4dtYb&Z5u#Mat56vyEhbOuGE*eeCfWbB=tz>bY?C;$^chb4)UhpUq|@`f1C& z5Sx1^rk|f&C>~b&M@2`|_1t5ZLPosvq=hnj91RaCUZ)ZAF#hdGph%+oWdvx7__^zTq5!|0gdy{y&q(z4fR4q6r_$ z4^1^4-u0esR?oU}515DrU;1hJN=7k+ zYi60$vZbe|bas8660styspz1?tsAGUeIwZxmreex5~$J4_CLg<%xvQsjcoU@%ds_u zadwXk|6MqBpzpy|NvVnc6-}!ZU&~hKZ_ZV9F@i?Tw(u;*?8%A|iA>+sCqML5o7})E zJ~<>pWb)MrDaM79KSZQ5tzz15%mkzZ@_y+}Q#y9SdReRL*UMHw)iHvub{ z6lKOV#RAOy5M{~q!4k|&kY=51X~jJ`B0^wtVYC#}UYp5<{yLL)MjJ3~w*{;CZOb!R zHb#r-qTR%evXgo2IVa}>c^S?i-i{bkrYY`VW$RVBCdW2!=6B{ z#pH?vfyuYL1b7&rU`gXCFR(g3Z_dfSaav3-y@5{Gn7lAfk1=`jg}7)Yd0()6aJ&f< vmmip!Ak8^>N4y?W7mUj~SvbL%DcB$AVgsNJT1@hRV1=g=q}XN#f@}f+eo;9Qr2Zo`6D>FO4)$1dGcyy>3Vzl_w|1cvF69zf0zEb{pcP;`RCiq?>}e!{;jyw zAn}jn6v2%*7IuAB=d#}1W;&Cv=49sI@9UC%{2u*$wdBItz{_VdSx(Me@5?-st1`-8 zOD_M(>E|bRaIdzi6Ph+f>3N~}x3kBV=uOa6<@&Z|%Atkb+$GPJ^fZ=*7+IX{-PoA$ zww`y(o5>GU4tlOz_u;JRPC1*s6Q0k0DiqCo=Kq}7Z|5caI{rU-xu8C6bL*`?@_`;d ztRH&KY&v#1lldH{L59gK$%hQFa(~|PF@N9i?(;+*wv-0`Z0j$_Qp@?JZ@i!KP(5kO z0k6v^Y)It(E4=igUa}Q#(a&~^mMuPNmLS!w`SOoUX`g^r ztB*DB4ca%?o3d~ee-nfGM(m&yVE9rQVG;-WcwfDQD(OBj7GM5*yY%o z!Z^DJhIRK(9q4;-RZ?oAe?`-3#n-ac`x!T9tGXCLBWFu^7E`Y3Z$!k>wCTm6t zOiqiCV*EL|F(QX)u@+e3UM$~a!Q6YXHcV%{z|0T2tdrg2^q5|IPyWcSF?l|and$?UkvC+U{2Rzs^aXP#M6pc{ ykJn@3@dI-cq&X*V19E#{T-M2g3C2vJ{$SbvHf)oN67(1qCofEJWSbqx00aQ|lu0`P diff --git a/yarn.lock b/yarn.lock index e5fc0f43399..667da63f935 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2806,6 +2806,15 @@ __metadata: languageName: node linkType: hard +"@snyk/protect@npm:latest": + version: 1.1122.0 + resolution: "@snyk/protect@npm:1.1122.0" + bin: + snyk-protect: bin/snyk-protect + checksum: 41af35343023d74cde711e2fe0561fbdf525e5cafe5205fb85524aee5d45e3ae654d540710fb061dda0183e6bdb382119a833a4e24bf260854ba3d4e9ff2d3bf + languageName: node + linkType: hard + "@socket.io/component-emitter@npm:~3.1.0": version: 3.1.0 resolution: "@socket.io/component-emitter@npm:3.1.0" @@ -3845,6 +3854,13 @@ __metadata: languageName: node linkType: hard +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + languageName: node + linkType: hard + "ansi-split@npm:^1.0.1": version: 1.0.1 resolution: "ansi-split@npm:1.0.1" @@ -3886,6 +3902,13 @@ __metadata: languageName: node linkType: hard +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + languageName: node + linkType: hard + "ansicolors@npm:~0.3.2": version: 0.3.2 resolution: "ansicolors@npm:0.3.2" @@ -4348,6 +4371,27 @@ __metadata: languageName: node linkType: hard +"begoo@npm:^2.0.2": + version: 2.0.2 + resolution: "begoo@npm:2.0.2" + dependencies: + "@snyk/protect": latest + ansi-regex: ^6.0.1 + ansi-styles: ^6.1.0 + chalk: ^2.4.2 + cli-boxes: ^2.1.0 + pad-component: 0.0.1 + repeating: ^3.0.0 + string-width: ^4.1.0 + strip-ansi: ^7.0.1 + taketalk: ^1.0.0 + wrap-ansi: ^8.0.1 + bin: + begoo: cli.js + checksum: 3c421914297a474dcccdae6763e4e6d6056b8dd3764f14e6c8718ae2b164afeefe99a40947e77b5e2a4541b05a5cddc74a5d4dbc67b541184b105aff2d0f9bc2 + languageName: node + linkType: hard + "big.js@npm:^5.2.2": version: 5.2.2 resolution: "big.js@npm:5.2.2" @@ -5071,6 +5115,13 @@ __metadata: languageName: node linkType: hard +"cli-boxes@npm:^2.1.0": + version: 2.2.1 + resolution: "cli-boxes@npm:2.2.1" + checksum: be79f8ec23a558b49e01311b39a1ea01243ecee30539c880cf14bf518a12e223ef40c57ead0cb44f509bffdffc5c129c746cd50d863ab879385370112af4f585 + languageName: node + linkType: hard + "cli-cursor@npm:^3.1.0": version: 3.1.0 resolution: "cli-cursor@npm:3.1.0" @@ -5298,6 +5349,13 @@ __metadata: languageName: node linkType: hard +"colorette@npm:^2.0.19": + version: 2.0.19 + resolution: "colorette@npm:2.0.19" + checksum: 888cf5493f781e5fcf54ce4d49e9d7d698f96ea2b2ef67906834bb319a392c667f9ec69f4a10e268d2946d13a9503d2d19b3abaaaf174e3451bfe91fb9d82427 + languageName: node + linkType: hard + "colors@npm:1.0.3": version: 1.0.3 resolution: "colors@npm:1.0.3" @@ -5947,6 +6005,7 @@ __metadata: ajv: ^8.6.0 ajv-formats: ^2.1.1 awilix: ^4.2.6 + begoo: ^2.0.2 chai: ^4.3.4 chai-as-promised: ^7.1.1 chalk: ^4.1.0 @@ -5966,7 +6025,7 @@ __metadata: hasbin: ^1.2.3 is-wsl: 2.2.0 jayson: ^3.3.4 - listr2: 3.5.0 + listr2: 5.0.7 lodash: ^4.17.21 memory-streams: ^0.1.3 mocha: ^9.1.2 @@ -5983,6 +6042,7 @@ __metadata: sinon: ^11.1.2 sinon-chai: ^3.7.0 table: ^5.4.6 + yosay: ^2.0.2 bin: dashmate: ./bin/run languageName: unknown @@ -6435,6 +6495,13 @@ __metadata: languageName: node linkType: hard +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed + languageName: node + linkType: hard + "ed25519-hd-key@npm:^1.3.0": version: 1.3.0 resolution: "ed25519-hd-key@npm:1.3.0" @@ -6499,6 +6566,13 @@ __metadata: languageName: node linkType: hard +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 + languageName: node + linkType: hard + "emojis-list@npm:^3.0.0": version: 3.0.0 resolution: "emojis-list@npm:3.0.0" @@ -7325,7 +7399,7 @@ __metadata: languageName: node linkType: hard -"figures@npm:^3.0.0, figures@npm:^3.2.0": +"figures@npm:^3.0.0": version: 3.2.0 resolution: "figures@npm:3.2.0" dependencies: @@ -9814,22 +9888,24 @@ fsevents@~2.3.2: languageName: node linkType: hard -"listr2@npm:3.5.0": - version: 3.5.0 - resolution: "listr2@npm:3.5.0" +"listr2@npm:5.0.7": + version: 5.0.7 + resolution: "listr2@npm:5.0.7" dependencies: - chalk: ^4.1.0 cli-truncate: ^2.1.0 - figures: ^3.2.0 - indent-string: ^4.0.0 + colorette: ^2.0.19 log-update: ^4.0.0 p-map: ^4.0.0 - rxjs: ^6.6.7 + rfdc: ^1.3.0 + rxjs: ^7.8.0 through: ^2.3.8 wrap-ansi: ^7.0.0 peerDependencies: enquirer: ">= 2.3.0 < 3" - checksum: cf308374629674608e41ca25e9314181551a1e2a752ddba495b7366326da88e1b01df24d13db5b7bf7ab0d8735db9cf1d5b6939b552c9c96b6314d596d3ba268 + peerDependenciesMeta: + enquirer: + optional: true + checksum: 5c2cb6ba3f7a5cfd548f89405febe73dc937acb6060227198c05da0ed5d5285a8107c61fcc4e33884e3bbdd447411aff7580af396bd22b6a11047ceab4950fab languageName: node linkType: hard @@ -12620,6 +12696,13 @@ fsevents@~2.3.2: languageName: node linkType: hard +"repeating@npm:^3.0.0": + version: 3.0.0 + resolution: "repeating@npm:3.0.0" + checksum: d6d736e32e299ea4b846c61adc47bf04573c5dd842a5acb9da99db2d02681e8c27890024b1392620fb4e4d79d1dba87db760d29f54459eaae839bae8f3e3b773 + languageName: node + linkType: hard + "replace-ext@npm:^1.0.0": version: 1.0.1 resolution: "replace-ext@npm:1.0.1" @@ -12831,7 +12914,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"rxjs@npm:^7.0.0, rxjs@npm:^7.2.0": +"rxjs@npm:^7.0.0, rxjs@npm:^7.2.0, rxjs@npm:^7.8.0": version: 7.8.0 resolution: "rxjs@npm:7.8.0" dependencies: @@ -13617,6 +13700,17 @@ fsevents@~2.3.2: languageName: node linkType: hard +"string-width@npm:^5.0.1": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: ^0.2.0 + emoji-regex: ^9.2.2 + strip-ansi: ^7.0.1 + checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + languageName: node + linkType: hard + "string.prototype.trim@npm:^1.2.7": version: 1.2.7 resolution: "string.prototype.trim@npm:1.2.7" @@ -13731,6 +13825,15 @@ fsevents@~2.3.2: languageName: node linkType: hard +"strip-ansi@npm:^7.0.1": + version: 7.0.1 + resolution: "strip-ansi@npm:7.0.1" + dependencies: + ansi-regex: ^6.0.1 + checksum: 257f78fa433520e7f9897722731d78599cb3fce29ff26a20a5e12ba4957463b50a01136f37c43707f4951817a75e90820174853d6ccc240997adc5df8f966039 + languageName: node + linkType: hard + "strip-bom-buf@npm:^1.0.0": version: 1.0.0 resolution: "strip-bom-buf@npm:1.0.0" @@ -15234,6 +15337,17 @@ typescript@^3.9.5: languageName: node linkType: hard +"wrap-ansi@npm:^8.0.1": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: ^6.1.0 + string-width: ^5.0.1 + strip-ansi: ^7.0.1 + checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 + languageName: node + linkType: hard + "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" From d51bcef03df4b21737ccebbaa46ae65ecbf0d3c8 Mon Sep 17 00:00:00 2001 From: Ivan Shumkov Date: Tue, 21 Mar 2023 21:24:37 +0800 Subject: [PATCH 08/93] chore(drive): register masternode --- .pnp.cjs | 323 ++++-------------- ...stree-npm-0.0.50-b9bc3b8409-9a2b6a4a8c.zip | Bin 6775 -> 0 bytes ...schema-npm-7.0.9-361918cff3-259d0e25f1.zip | Bin 7168 -> 0 bytes .../acorn-npm-8.6.0-9de50afc7d-9d0de73b73.zip | Bin 119027 -> 0 bytes ...rette-npm-2.0.16-7b996485d7-cd55596a3a.zip | Bin 7119 -> 0 bytes ...erties-npm-1.1.3-0f3115e2b9-da80dba55d.zip | Bin 8640 -> 0 bytes ...tract-npm-1.19.1-885c72759a-b6be841067.zip | Bin 638511 -> 0 bytes ...r-keys-npm-3.1.0-9a6ffc9175-fd2d613bb3.zip | Bin 10997 -> 0 bytes ...rinsic-npm-1.1.1-7e868745da-a9fe2ca8fa.zip | Bin 12138 -> 0 bytes ...igints-npm-1.0.1-1b93717a74-44ab558681.zip | Bin 6434 -> 0 bytes ...ymbols-npm-1.0.2-50e53af115-2309c42607.zip | Bin 10027 -> 0 bytes ...l-slot-npm-1.0.3-9e05eea002-1944f92e98.zip | Bin 7822 -> 0 bytes ...llable-npm-1.2.4-03fc17459c-1a28d57dc4.zip | Bin 9785 -> 0 bytes ...e-zero-npm-2.0.1-d8f3dbcfe1-a46f2e0cb5.zip | Bin 12104 -> 0 bytes ...buffer-npm-1.0.1-84bc270861-2ffb92533e.zip | Bin 6384 -> 0 bytes ...-array-npm-1.1.8-147f090d0d-aa0f9f0716.zip | Bin 8267 -> 0 bytes ...eakref-npm-1.0.1-152a166933-fdafb7b955.zip | Bin 9516 -> 0 bytes ...spect-npm-1.11.0-c9d4bd1487-8c64f89ce3.zip | Bin 22695 -> 0 bytes ...assign-npm-4.1.2-d52edada1c-d621d832ed.zip | Bin 24511 -> 0 bytes ...ntries-npm-1.1.5-7a8fcbc43e-d658696f74.zip | Bin 13922 -> 0 bytes ...rimend-npm-1.0.4-a656b8fe24-17e5aa45c3.zip | Bin 10456 -> 0 bytes ...mstart-npm-1.0.4-b31f5e7c85-3fb06818d3.zip | Bin 10556 -> 0 bytes ...mitive-npm-1.0.1-50b9fde246-89d950e18f.zip | Bin 7691 -> 0 bytes ...-array-npm-1.1.7-7cf2d674e6-147837cf58.zip | Bin 11735 -> 0 bytes packages/dashmate/configs/migrations.js | 3 +- packages/dashmate/package.json | 1 + .../dashmate/src/commands/group/status.js | 2 +- .../dashmate/src/commands/status/index.js | 4 +- .../src/commands/status/masternode.js | 4 +- packages/dashmate/src/createDIContainer.js | 12 +- .../prompts/createIpAndPortsFormFactory.js | 103 ++++++ .../prompts/validators/validateAddressHex.js | 20 ++ .../validators/validateTenderdashNodeKey.js | 54 +++ .../registerMasternodeGuideTaskFactory.js | 318 +++++++++++++++++ .../setup/setupRegularPresetTaskFactory.js | 192 +---------- packages/dashmate/src/status/colors.js | 6 +- .../dashmate/src/status/determineStatus.js | 6 +- .../src/{ => status}/enums/dockerStatus.js | 0 .../src/{ => status}/enums/masternodeState.js | 0 .../{ => status}/enums/masternodeSyncAsset.js | 0 .../src/{ => status}/enums/portState.js | 0 .../src/{ => status}/enums/serviceStatus.js | 0 packages/dashmate/src/status/providers.js | 2 +- packages/dashmate/src/status/scopes/core.js | 4 +- .../dashmate/src/status/scopes/masternode.js | 4 +- .../dashmate/src/status/scopes/platform.js | 2 +- .../src/tenderdash/createTenderdashNodeId.js | 19 ++ .../tenderdash/generateTenderdashNodeKey.js | 27 ++ .../generateTenderdashNodeKeyAndId.js | 38 --- .../dashmate/test/unit/status/colors.spec.js | 4 +- .../test/unit/status/determineStatus.spec.js | 6 +- .../test/unit/status/scopes/core.spec.js | 6 +- .../unit/status/scopes/masternode.spec.js | 4 +- .../test/unit/status/scopes/overview.spec.js | 6 +- .../test/unit/status/scopes/platform.spec.js | 4 +- yarn.lock | 282 ++------------- 56 files changed, 689 insertions(+), 767 deletions(-) delete mode 100644 .yarn/cache/@types-estree-npm-0.0.50-b9bc3b8409-9a2b6a4a8c.zip delete mode 100644 .yarn/cache/@types-json-schema-npm-7.0.9-361918cff3-259d0e25f1.zip delete mode 100644 .yarn/cache/acorn-npm-8.6.0-9de50afc7d-9d0de73b73.zip delete mode 100644 .yarn/cache/colorette-npm-2.0.16-7b996485d7-cd55596a3a.zip delete mode 100644 .yarn/cache/define-properties-npm-1.1.3-0f3115e2b9-da80dba55d.zip delete mode 100644 .yarn/cache/es-abstract-npm-1.19.1-885c72759a-b6be841067.zip delete mode 100644 .yarn/cache/eslint-visitor-keys-npm-3.1.0-9a6ffc9175-fd2d613bb3.zip delete mode 100644 .yarn/cache/get-intrinsic-npm-1.1.1-7e868745da-a9fe2ca8fa.zip delete mode 100644 .yarn/cache/has-bigints-npm-1.0.1-1b93717a74-44ab558681.zip delete mode 100644 .yarn/cache/has-symbols-npm-1.0.2-50e53af115-2309c42607.zip delete mode 100644 .yarn/cache/internal-slot-npm-1.0.3-9e05eea002-1944f92e98.zip delete mode 100644 .yarn/cache/is-callable-npm-1.2.4-03fc17459c-1a28d57dc4.zip delete mode 100644 .yarn/cache/is-negative-zero-npm-2.0.1-d8f3dbcfe1-a46f2e0cb5.zip delete mode 100644 .yarn/cache/is-shared-array-buffer-npm-1.0.1-84bc270861-2ffb92533e.zip delete mode 100644 .yarn/cache/is-typed-array-npm-1.1.8-147f090d0d-aa0f9f0716.zip delete mode 100644 .yarn/cache/is-weakref-npm-1.0.1-152a166933-fdafb7b955.zip delete mode 100644 .yarn/cache/object-inspect-npm-1.11.0-c9d4bd1487-8c64f89ce3.zip delete mode 100644 .yarn/cache/object.assign-npm-4.1.2-d52edada1c-d621d832ed.zip delete mode 100644 .yarn/cache/object.entries-npm-1.1.5-7a8fcbc43e-d658696f74.zip delete mode 100644 .yarn/cache/string.prototype.trimend-npm-1.0.4-a656b8fe24-17e5aa45c3.zip delete mode 100644 .yarn/cache/string.prototype.trimstart-npm-1.0.4-b31f5e7c85-3fb06818d3.zip delete mode 100644 .yarn/cache/unbox-primitive-npm-1.0.1-50b9fde246-89d950e18f.zip delete mode 100644 .yarn/cache/which-typed-array-npm-1.1.7-7cf2d674e6-147837cf58.zip create mode 100644 packages/dashmate/src/listr/prompts/createIpAndPortsFormFactory.js create mode 100644 packages/dashmate/src/listr/prompts/validators/validateAddressHex.js create mode 100644 packages/dashmate/src/listr/prompts/validators/validateTenderdashNodeKey.js create mode 100644 packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js rename packages/dashmate/src/{ => status}/enums/dockerStatus.js (100%) rename packages/dashmate/src/{ => status}/enums/masternodeState.js (100%) rename packages/dashmate/src/{ => status}/enums/masternodeSyncAsset.js (100%) rename packages/dashmate/src/{ => status}/enums/portState.js (100%) rename packages/dashmate/src/{ => status}/enums/serviceStatus.js (100%) create mode 100644 packages/dashmate/src/tenderdash/createTenderdashNodeId.js create mode 100644 packages/dashmate/src/tenderdash/generateTenderdashNodeKey.js delete mode 100644 packages/dashmate/src/tenderdash/generateTenderdashNodeKeyAndId.js diff --git a/.pnp.cjs b/.pnp.cjs index 94ffc91f923..dfe0401dfbf 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -2600,7 +2600,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@dashevo/feature-flags-contract", "workspace:packages/feature-flags-contract"],\ ["@dashevo/masternode-reward-shares-contract", "workspace:packages/masternode-reward-shares-contract"],\ ["@dashevo/wasm-re2", "npm:1.0.2"],\ - ["acorn", "npm:8.6.0"],\ + ["acorn", "npm:8.8.2"],\ ["ajv", "npm:8.8.1"],\ ["ajv-formats", "virtual:58fb68f2aed20e5e0f2e48520ab903ae9bb3440369bfd5e912034003cf27c5aae368649fc5620dd2acbed578131f3a0975e75b838d77d12335fb0412e24026c6#npm:2.1.1"],\ ["assert", "npm:2.0.0"],\ @@ -4171,8 +4171,8 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/@types-eslint-npm-8.2.0-971aa21b00-18f37790af.zip/node_modules/@types/eslint/",\ "packageDependencies": [\ ["@types/eslint", "npm:8.2.0"],\ - ["@types/estree", "npm:0.0.50"],\ - ["@types/json-schema", "npm:7.0.9"]\ + ["@types/estree", "npm:0.0.51"],\ + ["@types/json-schema", "npm:7.0.11"]\ ],\ "linkType": "HARD"\ }]\ @@ -4183,19 +4183,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["@types/eslint-scope", "npm:3.7.4"],\ ["@types/eslint", "npm:8.2.0"],\ - ["@types/estree", "npm:0.0.50"]\ + ["@types/estree", "npm:0.0.51"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["@types/estree", [\ - ["npm:0.0.50", {\ - "packageLocation": "./.yarn/cache/@types-estree-npm-0.0.50-b9bc3b8409-9a2b6a4a8c.zip/node_modules/@types/estree/",\ - "packageDependencies": [\ - ["@types/estree", "npm:0.0.50"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:0.0.51", {\ "packageLocation": "./.yarn/cache/@types-estree-npm-0.0.51-bc20719267-e56a3bcf75.zip/node_modules/@types/estree/",\ "packageDependencies": [\ @@ -4278,13 +4271,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@types/json-schema", "npm:7.0.11"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:7.0.9", {\ - "packageLocation": "./.yarn/cache/@types-json-schema-npm-7.0.9-361918cff3-259d0e25f1.zip/node_modules/@types/json-schema/",\ - "packageDependencies": [\ - ["@types/json-schema", "npm:7.0.9"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["@types/json5", [\ @@ -5290,13 +5276,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["npm:8.6.0", {\ - "packageLocation": "./.yarn/cache/acorn-npm-8.6.0-9de50afc7d-9d0de73b73.zip/node_modules/acorn/",\ - "packageDependencies": [\ - ["acorn", "npm:8.6.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:8.8.2", {\ "packageLocation": "./.yarn/cache/acorn-npm-8.8.2-9d518fd7d3-f790b99a1b.zip/node_modules/acorn/",\ "packageDependencies": [\ @@ -5353,7 +5332,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["acorn-jsx", "virtual:fd2253859039a15030fecf2d1545fcad47d7bd43468b9166c71fdd4e35b538414e653775f5401c948ed8db3eb1925f84c66c161d39a27b19ee73fef5e721329e#npm:5.3.2"],\ ["@types/acorn", null],\ - ["acorn", "npm:8.6.0"]\ + ["acorn", "npm:8.8.2"]\ ],\ "packagePeers": [\ "@types/acorn",\ @@ -5788,9 +5767,9 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["array-includes", "npm:3.1.4"],\ ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.1.3"],\ - ["es-abstract", "npm:1.19.1"],\ - ["get-intrinsic", "npm:1.1.1"],\ + ["define-properties", "npm:1.2.0"],\ + ["es-abstract", "npm:1.21.2"],\ + ["get-intrinsic", "npm:1.2.0"],\ ["is-string", "npm:1.0.7"]\ ],\ "linkType": "HARD"\ @@ -5811,8 +5790,8 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["array.prototype.flat", "npm:1.2.5"],\ ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.1.3"],\ - ["es-abstract", "npm:1.19.1"]\ + ["define-properties", "npm:1.2.0"],\ + ["es-abstract", "npm:1.21.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -6083,7 +6062,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/babel-plugin-dynamic-import-node-npm-2.3.3-be081936a9-c9d24415bc.zip/node_modules/babel-plugin-dynamic-import-node/",\ "packageDependencies": [\ ["babel-plugin-dynamic-import-node", "npm:2.3.3"],\ - ["object.assign", "npm:4.1.2"]\ + ["object.assign", "npm:4.1.4"]\ ],\ "linkType": "HARD"\ }]\ @@ -6177,6 +6156,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["safe-buffer", "npm:5.2.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/base-x-npm-4.0.0-64a1f6fa5e-b25db9e07e.zip/node_modules/base-x/",\ + "packageDependencies": [\ + ["base-x", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["base64-js", [\ @@ -6538,6 +6524,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["base-x", "npm:3.0.9"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/bs58-npm-5.0.0-da02537b92-2475cb0684.zip/node_modules/bs58/",\ + "packageDependencies": [\ + ["bs58", "npm:5.0.0"],\ + ["base-x", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["bson", [\ @@ -6729,7 +6723,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["call-bind", "npm:1.0.2"],\ ["function-bind", "npm:1.1.1"],\ - ["get-intrinsic", "npm:1.1.1"]\ + ["get-intrinsic", "npm:1.2.0"]\ ],\ "linkType": "HARD"\ }]\ @@ -7319,13 +7313,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["colorette", [\ - ["npm:2.0.16", {\ - "packageLocation": "./.yarn/cache/colorette-npm-2.0.16-7b996485d7-cd55596a3a.zip/node_modules/colorette/",\ - "packageDependencies": [\ - ["colorette", "npm:2.0.16"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:2.0.19", {\ "packageLocation": "./.yarn/cache/colorette-npm-2.0.19-f73dfe6a4e-888cf5493f.zip/node_modules/colorette/",\ "packageDependencies": [\ @@ -8048,6 +8035,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["ajv-formats", "virtual:58fb68f2aed20e5e0f2e48520ab903ae9bb3440369bfd5e912034003cf27c5aae368649fc5620dd2acbed578131f3a0975e75b838d77d12335fb0412e24026c6#npm:2.1.1"],\ ["awilix", "npm:4.3.4"],\ ["begoo", "npm:2.0.2"],\ + ["bs58", "npm:5.0.0"],\ ["chai", "npm:4.3.4"],\ ["chai-as-promised", "virtual:58fb68f2aed20e5e0f2e48520ab903ae9bb3440369bfd5e912034003cf27c5aae368649fc5620dd2acbed578131f3a0975e75b838d77d12335fb0412e24026c6#npm:7.1.1"],\ ["chalk", "npm:4.1.2"],\ @@ -8376,14 +8364,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["define-properties", [\ - ["npm:1.1.3", {\ - "packageLocation": "./.yarn/cache/define-properties-npm-1.1.3-0f3115e2b9-da80dba55d.zip/node_modules/define-properties/",\ - "packageDependencies": [\ - ["define-properties", "npm:1.1.3"],\ - ["object-keys", "npm:1.1.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.2.0", {\ "packageLocation": "./.yarn/cache/define-properties-npm-1.2.0-3547cd0fd2-e60aee6a19.zip/node_modules/define-properties/",\ "packageDependencies": [\ @@ -8949,33 +8929,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["es-abstract", [\ - ["npm:1.19.1", {\ - "packageLocation": "./.yarn/cache/es-abstract-npm-1.19.1-885c72759a-b6be841067.zip/node_modules/es-abstract/",\ - "packageDependencies": [\ - ["es-abstract", "npm:1.19.1"],\ - ["call-bind", "npm:1.0.2"],\ - ["es-to-primitive", "npm:1.2.1"],\ - ["function-bind", "npm:1.1.1"],\ - ["get-intrinsic", "npm:1.1.1"],\ - ["get-symbol-description", "npm:1.0.0"],\ - ["has", "npm:1.0.3"],\ - ["has-symbols", "npm:1.0.2"],\ - ["internal-slot", "npm:1.0.3"],\ - ["is-callable", "npm:1.2.4"],\ - ["is-negative-zero", "npm:2.0.1"],\ - ["is-regex", "npm:1.1.4"],\ - ["is-shared-array-buffer", "npm:1.0.1"],\ - ["is-string", "npm:1.0.7"],\ - ["is-weakref", "npm:1.0.1"],\ - ["object-inspect", "npm:1.11.0"],\ - ["object-keys", "npm:1.1.1"],\ - ["object.assign", "npm:4.1.2"],\ - ["string.prototype.trimend", "npm:1.0.4"],\ - ["string.prototype.trimstart", "npm:1.0.4"],\ - ["unbox-primitive", "npm:1.0.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.21.2", {\ "packageLocation": "./.yarn/cache/es-abstract-npm-1.21.2-f4ebace1ab-037f55ee5e.zip/node_modules/es-abstract/",\ "packageDependencies": [\ @@ -9044,7 +8997,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/es-to-primitive-npm-1.2.1-b7a7eac6c5-4ead6671a2.zip/node_modules/es-to-primitive/",\ "packageDependencies": [\ ["es-to-primitive", "npm:1.2.1"],\ - ["is-callable", "npm:1.2.4"],\ + ["is-callable", "npm:1.2.7"],\ ["is-date-object", "npm:1.0.5"],\ ["is-symbol", "npm:1.0.4"]\ ],\ @@ -9225,8 +9178,8 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["confusing-browser-globals", "npm:1.0.10"],\ ["eslint", "npm:7.32.0"],\ ["eslint-plugin-import", "virtual:12a596dc9572e25ce715d3736dc74b317c5ca5cfb3b4f67864b1e76b3a401006f84d381aaf975bb5b4da9cafac5125e6869fc78d5202f4c95780c81479112f32#npm:2.25.3"],\ - ["object.assign", "npm:4.1.2"],\ - ["object.entries", "npm:1.1.5"]\ + ["object.assign", "npm:4.1.4"],\ + ["object.entries", "npm:1.1.6"]\ ],\ "packagePeers": [\ "@types/eslint-plugin-import",\ @@ -9245,7 +9198,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["confusing-browser-globals", "npm:1.0.10"],\ ["eslint", "npm:7.32.0"],\ ["eslint-plugin-import", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:2.25.3"],\ - ["object.assign", "npm:4.1.2"],\ + ["object.assign", "npm:4.1.4"],\ ["object.entries", "npm:1.1.6"],\ ["semver", "npm:6.3.0"]\ ],\ @@ -9266,8 +9219,8 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["confusing-browser-globals", "npm:1.0.10"],\ ["eslint", "npm:7.32.0"],\ ["eslint-plugin-import", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:2.25.3"],\ - ["object.assign", "npm:4.1.2"],\ - ["object.entries", "npm:1.1.5"]\ + ["object.assign", "npm:4.1.4"],\ + ["object.entries", "npm:1.1.6"]\ ],\ "packagePeers": [\ "@types/eslint-plugin-import",\ @@ -9523,13 +9476,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["npm:3.1.0", {\ - "packageLocation": "./.yarn/cache/eslint-visitor-keys-npm-3.1.0-9a6ffc9175-fd2d613bb3.zip/node_modules/eslint-visitor-keys/",\ - "packageDependencies": [\ - ["eslint-visitor-keys", "npm:3.1.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:3.3.0", {\ "packageLocation": "./.yarn/cache/eslint-visitor-keys-npm-3.3.0-d329af7c8c-d59e68a7c5.zip/node_modules/eslint-visitor-keys/",\ "packageDependencies": [\ @@ -9553,9 +9499,9 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/espree-npm-9.1.0-fd22538590-ba9b0f759c.zip/node_modules/espree/",\ "packageDependencies": [\ ["espree", "npm:9.1.0"],\ - ["acorn", "npm:8.6.0"],\ + ["acorn", "npm:8.8.2"],\ ["acorn-jsx", "virtual:fd2253859039a15030fecf2d1545fcad47d7bd43468b9166c71fdd4e35b538414e653775f5401c948ed8db3eb1925f84c66c161d39a27b19ee73fef5e721329e#npm:5.3.2"],\ - ["eslint-visitor-keys", "npm:3.1.0"]\ + ["eslint-visitor-keys", "npm:3.3.0"]\ ],\ "linkType": "HARD"\ }]\ @@ -10203,8 +10149,8 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["function.prototype.name", "npm:1.1.5"],\ ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.1.3"],\ - ["es-abstract", "npm:1.19.1"],\ + ["define-properties", "npm:1.2.0"],\ + ["es-abstract", "npm:1.21.2"],\ ["functions-have-names", "npm:1.2.3"]\ ],\ "linkType": "HARD"\ @@ -10305,16 +10251,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["get-intrinsic", [\ - ["npm:1.1.1", {\ - "packageLocation": "./.yarn/cache/get-intrinsic-npm-1.1.1-7e868745da-a9fe2ca8fa.zip/node_modules/get-intrinsic/",\ - "packageDependencies": [\ - ["get-intrinsic", "npm:1.1.1"],\ - ["function-bind", "npm:1.1.1"],\ - ["has", "npm:1.0.3"],\ - ["has-symbols", "npm:1.0.2"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.2.0", {\ "packageLocation": "./.yarn/cache/get-intrinsic-npm-1.2.0-eb08ea9b1d-78fc0487b7.zip/node_modules/get-intrinsic/",\ "packageDependencies": [\ @@ -10388,7 +10324,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["get-symbol-description", "npm:1.0.0"],\ ["call-bind", "npm:1.0.2"],\ - ["get-intrinsic", "npm:1.1.1"]\ + ["get-intrinsic", "npm:1.2.0"]\ ],\ "linkType": "HARD"\ }]\ @@ -10550,7 +10486,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/globalthis-npm-1.0.3-96cd56020d-fbd7d760dc.zip/node_modules/globalthis/",\ "packageDependencies": [\ ["globalthis", "npm:1.0.3"],\ - ["define-properties", "npm:1.1.3"]\ + ["define-properties", "npm:1.2.0"]\ ],\ "linkType": "HARD"\ }]\ @@ -10718,13 +10654,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["has-bigints", [\ - ["npm:1.0.1", {\ - "packageLocation": "./.yarn/cache/has-bigints-npm-1.0.1-1b93717a74-44ab558681.zip/node_modules/has-bigints/",\ - "packageDependencies": [\ - ["has-bigints", "npm:1.0.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.0.2", {\ "packageLocation": "./.yarn/cache/has-bigints-npm-1.0.2-52732e614d-390e31e7be.zip/node_modules/has-bigints/",\ "packageDependencies": [\ @@ -10754,7 +10683,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/has-property-descriptors-npm-1.0.0-56289b918d-a6d3f0a266.zip/node_modules/has-property-descriptors/",\ "packageDependencies": [\ ["has-property-descriptors", "npm:1.0.0"],\ - ["get-intrinsic", "npm:1.1.1"]\ + ["get-intrinsic", "npm:1.2.0"]\ ],\ "linkType": "HARD"\ }]\ @@ -10769,13 +10698,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["has-symbols", [\ - ["npm:1.0.2", {\ - "packageLocation": "./.yarn/cache/has-symbols-npm-1.0.2-50e53af115-2309c42607.zip/node_modules/has-symbols/",\ - "packageDependencies": [\ - ["has-symbols", "npm:1.0.2"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.0.3", {\ "packageLocation": "./.yarn/cache/has-symbols-npm-1.0.3-1986bff2c4-a054c40c63.zip/node_modules/has-symbols/",\ "packageDependencies": [\ @@ -10789,7 +10711,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/has-tostringtag-npm-1.0.0-b1fcf3ab55-cc12eb28cb.zip/node_modules/has-tostringtag/",\ "packageDependencies": [\ ["has-tostringtag", "npm:1.0.0"],\ - ["has-symbols", "npm:1.0.2"]\ + ["has-symbols", "npm:1.0.3"]\ ],\ "linkType": "HARD"\ }]\ @@ -11269,16 +11191,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["internal-slot", [\ - ["npm:1.0.3", {\ - "packageLocation": "./.yarn/cache/internal-slot-npm-1.0.3-9e05eea002-1944f92e98.zip/node_modules/internal-slot/",\ - "packageDependencies": [\ - ["internal-slot", "npm:1.0.3"],\ - ["get-intrinsic", "npm:1.1.1"],\ - ["has", "npm:1.0.3"],\ - ["side-channel", "npm:1.0.4"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.0.5", {\ "packageLocation": "./.yarn/cache/internal-slot-npm-1.0.5-a2241f3e66-97e84046bf.zip/node_modules/internal-slot/",\ "packageDependencies": [\ @@ -11368,7 +11280,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/is-bigint-npm-1.0.4-31c2eecbc9-c56edfe09b.zip/node_modules/is-bigint/",\ "packageDependencies": [\ ["is-bigint", "npm:1.0.4"],\ - ["has-bigints", "npm:1.0.1"]\ + ["has-bigints", "npm:1.0.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -11395,13 +11307,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["is-callable", [\ - ["npm:1.2.4", {\ - "packageLocation": "./.yarn/cache/is-callable-npm-1.2.4-03fc17459c-1a28d57dc4.zip/node_modules/is-callable/",\ - "packageDependencies": [\ - ["is-callable", "npm:1.2.4"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.2.7", {\ "packageLocation": "./.yarn/cache/is-callable-npm-1.2.7-808a303e61-61fd57d03b.zip/node_modules/is-callable/",\ "packageDependencies": [\ @@ -11526,19 +11431,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["is-nan", "npm:1.3.2"],\ ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.1.3"]\ + ["define-properties", "npm:1.2.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["is-negative-zero", [\ - ["npm:2.0.1", {\ - "packageLocation": "./.yarn/cache/is-negative-zero-npm-2.0.1-d8f3dbcfe1-a46f2e0cb5.zip/node_modules/is-negative-zero/",\ - "packageDependencies": [\ - ["is-negative-zero", "npm:2.0.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:2.0.2", {\ "packageLocation": "./.yarn/cache/is-negative-zero-npm-2.0.2-0adac91f15-f3232194c4.zip/node_modules/is-negative-zero/",\ "packageDependencies": [\ @@ -11639,13 +11537,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["is-shared-array-buffer", [\ - ["npm:1.0.1", {\ - "packageLocation": "./.yarn/cache/is-shared-array-buffer-npm-1.0.1-84bc270861-2ffb92533e.zip/node_modules/is-shared-array-buffer/",\ - "packageDependencies": [\ - ["is-shared-array-buffer", "npm:1.0.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.0.2", {\ "packageLocation": "./.yarn/cache/is-shared-array-buffer-npm-1.0.2-32e4181fcd-9508929cf1.zip/node_modules/is-shared-array-buffer/",\ "packageDependencies": [\ @@ -11679,7 +11570,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/is-symbol-npm-1.0.4-eb9baac703-92805812ef.zip/node_modules/is-symbol/",\ "packageDependencies": [\ ["is-symbol", "npm:1.0.4"],\ - ["has-symbols", "npm:1.0.2"]\ + ["has-symbols", "npm:1.0.3"]\ ],\ "linkType": "HARD"\ }]\ @@ -11706,18 +11597,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["has-tostringtag", "npm:1.0.0"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:1.1.8", {\ - "packageLocation": "./.yarn/cache/is-typed-array-npm-1.1.8-147f090d0d-aa0f9f0716.zip/node_modules/is-typed-array/",\ - "packageDependencies": [\ - ["is-typed-array", "npm:1.1.8"],\ - ["available-typed-arrays", "npm:1.0.5"],\ - ["call-bind", "npm:1.0.2"],\ - ["es-abstract", "npm:1.19.1"],\ - ["foreach", "npm:2.0.5"],\ - ["has-tostringtag", "npm:1.0.0"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["is-typedarray", [\ @@ -11748,14 +11627,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["is-weakref", [\ - ["npm:1.0.1", {\ - "packageLocation": "./.yarn/cache/is-weakref-npm-1.0.1-152a166933-fdafb7b955.zip/node_modules/is-weakref/",\ - "packageDependencies": [\ - ["is-weakref", "npm:1.0.1"],\ - ["call-bind", "npm:1.0.2"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.0.2", {\ "packageLocation": "./.yarn/cache/is-weakref-npm-1.0.2-ff80e8c314-95bd9a57cd.zip/node_modules/is-weakref/",\ "packageDependencies": [\ @@ -14401,13 +14272,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["object-inspect", [\ - ["npm:1.11.0", {\ - "packageLocation": "./.yarn/cache/object-inspect-npm-1.11.0-c9d4bd1487-8c64f89ce3.zip/node_modules/object-inspect/",\ - "packageDependencies": [\ - ["object-inspect", "npm:1.11.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.12.3", {\ "packageLocation": "./.yarn/cache/object-inspect-npm-1.12.3-1e7d20f5ff-dabfd824d9.zip/node_modules/object-inspect/",\ "packageDependencies": [\ @@ -14422,7 +14286,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["object-is", "npm:1.1.5"],\ ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.1.3"]\ + ["define-properties", "npm:1.2.0"]\ ],\ "linkType": "HARD"\ }]\ @@ -14446,17 +14310,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["object.assign", [\ - ["npm:4.1.2", {\ - "packageLocation": "./.yarn/cache/object.assign-npm-4.1.2-d52edada1c-d621d832ed.zip/node_modules/object.assign/",\ - "packageDependencies": [\ - ["object.assign", "npm:4.1.2"],\ - ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.1.3"],\ - ["has-symbols", "npm:1.0.2"],\ - ["object-keys", "npm:1.1.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:4.1.4", {\ "packageLocation": "./.yarn/cache/object.assign-npm-4.1.4-fb3deb1c3a-76cab513a5.zip/node_modules/object.assign/",\ "packageDependencies": [\ @@ -14470,16 +14323,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["object.entries", [\ - ["npm:1.1.5", {\ - "packageLocation": "./.yarn/cache/object.entries-npm-1.1.5-7a8fcbc43e-d658696f74.zip/node_modules/object.entries/",\ - "packageDependencies": [\ - ["object.entries", "npm:1.1.5"],\ - ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.1.3"],\ - ["es-abstract", "npm:1.19.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.1.6", {\ "packageLocation": "./.yarn/cache/object.entries-npm-1.1.6-5f9ba14b46-0f8c47517e.zip/node_modules/object.entries/",\ "packageDependencies": [\ @@ -14497,8 +14340,8 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["object.values", "npm:1.1.5"],\ ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.1.3"],\ - ["es-abstract", "npm:1.19.1"]\ + ["define-properties", "npm:1.2.0"],\ + ["es-abstract", "npm:1.21.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -15810,7 +15653,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["regexp.prototype.flags", "npm:1.4.3"],\ ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.1.3"],\ + ["define-properties", "npm:1.2.0"],\ ["functions-have-names", "npm:1.2.3"]\ ],\ "linkType": "HARD"\ @@ -16215,7 +16058,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/schema-utils-npm-2.7.1-f84d18c473-32c62fc9e2.zip/node_modules/schema-utils/",\ "packageDependencies": [\ ["schema-utils", "npm:2.7.1"],\ - ["@types/json-schema", "npm:7.0.9"],\ + ["@types/json-schema", "npm:7.0.11"],\ ["ajv", "npm:6.12.6"],\ ["ajv-keywords", "virtual:f84d18c473fad3c01e1cf352f81ad13de804ca40da5bf6e752464a2e78dcb097ad579b06da5ff33a55ba9957fb9c74909b99fc5e215420a3f9b5dc87ad71363b#npm:3.5.2"]\ ],\ @@ -16225,7 +16068,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./.yarn/cache/schema-utils-npm-3.1.1-8704647575-fb73f3d759.zip/node_modules/schema-utils/",\ "packageDependencies": [\ ["schema-utils", "npm:3.1.1"],\ - ["@types/json-schema", "npm:7.0.9"],\ + ["@types/json-schema", "npm:7.0.11"],\ ["ajv", "npm:6.12.6"],\ ["ajv-keywords", "virtual:f84d18c473fad3c01e1cf352f81ad13de804ca40da5bf6e752464a2e78dcb097ad579b06da5ff33a55ba9957fb9c74909b99fc5e215420a3f9b5dc87ad71363b#npm:3.5.2"]\ ],\ @@ -16482,8 +16325,8 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["side-channel", "npm:1.0.4"],\ ["call-bind", "npm:1.0.2"],\ - ["get-intrinsic", "npm:1.1.1"],\ - ["object-inspect", "npm:1.11.0"]\ + ["get-intrinsic", "npm:1.2.0"],\ + ["object-inspect", "npm:1.12.3"]\ ],\ "linkType": "HARD"\ }]\ @@ -17033,15 +16876,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["string.prototype.trimend", [\ - ["npm:1.0.4", {\ - "packageLocation": "./.yarn/cache/string.prototype.trimend-npm-1.0.4-a656b8fe24-17e5aa45c3.zip/node_modules/string.prototype.trimend/",\ - "packageDependencies": [\ - ["string.prototype.trimend", "npm:1.0.4"],\ - ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.1.3"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.0.6", {\ "packageLocation": "./.yarn/cache/string.prototype.trimend-npm-1.0.6-304246ecc1-0fdc34645a.zip/node_modules/string.prototype.trimend/",\ "packageDependencies": [\ @@ -17054,15 +16888,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["string.prototype.trimstart", [\ - ["npm:1.0.4", {\ - "packageLocation": "./.yarn/cache/string.prototype.trimstart-npm-1.0.4-b31f5e7c85-3fb06818d3.zip/node_modules/string.prototype.trimstart/",\ - "packageDependencies": [\ - ["string.prototype.trimstart", "npm:1.0.4"],\ - ["call-bind", "npm:1.0.2"],\ - ["define-properties", "npm:1.1.3"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.0.6", {\ "packageLocation": "./.yarn/cache/string.prototype.trimstart-npm-1.0.6-0926caea6c-89080feef4.zip/node_modules/string.prototype.trimstart/",\ "packageDependencies": [\ @@ -17439,7 +17264,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["terser", "npm:5.14.2"],\ ["@jridgewell/source-map", "npm:0.3.2"],\ - ["acorn", "npm:8.6.0"],\ + ["acorn", "npm:8.8.2"],\ ["commander", "npm:2.20.3"],\ ["source-map-support", "npm:0.5.21"]\ ],\ @@ -17999,7 +17824,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@types/swc__core", null],\ ["@types/swc__wasm", null],\ ["@types/typescript", null],\ - ["acorn", "npm:8.6.0"],\ + ["acorn", "npm:8.8.2"],\ ["acorn-walk", "npm:8.2.0"],\ ["arg", "npm:4.1.3"],\ ["create-require", "npm:1.1.1"],\ @@ -18305,17 +18130,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["unbox-primitive", [\ - ["npm:1.0.1", {\ - "packageLocation": "./.yarn/cache/unbox-primitive-npm-1.0.1-50b9fde246-89d950e18f.zip/node_modules/unbox-primitive/",\ - "packageDependencies": [\ - ["unbox-primitive", "npm:1.0.1"],\ - ["function-bind", "npm:1.1.1"],\ - ["has-bigints", "npm:1.0.1"],\ - ["has-symbols", "npm:1.0.2"],\ - ["which-boxed-primitive", "npm:1.0.2"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.0.2", {\ "packageLocation": "./.yarn/cache/unbox-primitive-npm-1.0.2-cb56a05066-b7a1cf5862.zip/node_modules/unbox-primitive/",\ "packageDependencies": [\ @@ -18515,9 +18329,9 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["inherits", "npm:2.0.4"],\ ["is-arguments", "npm:1.1.1"],\ ["is-generator-function", "npm:1.0.10"],\ - ["is-typed-array", "npm:1.1.8"],\ + ["is-typed-array", "npm:1.1.10"],\ ["safe-buffer", "npm:5.2.1"],\ - ["which-typed-array", "npm:1.1.7"]\ + ["which-typed-array", "npm:1.1.9"]\ ],\ "linkType": "HARD"\ }]\ @@ -18967,7 +18781,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@webpack-cli/info", "virtual:0249f7ceb5542d6b732af2b44f9fcd16c60be8b8440f0f3abc6a5de67aabcff731bc3bc83f3067ab2f9037661176f001f89208fcea9e8962835fd43d0aabe88a#npm:1.4.0"],\ ["@webpack-cli/migrate", null],\ ["@webpack-cli/serve", "virtual:0249f7ceb5542d6b732af2b44f9fcd16c60be8b8440f0f3abc6a5de67aabcff731bc3bc83f3067ab2f9037661176f001f89208fcea9e8962835fd43d0aabe88a#npm:1.6.0"],\ - ["colorette", "npm:2.0.16"],\ + ["colorette", "npm:2.0.19"],\ ["commander", "npm:7.2.0"],\ ["execa", "npm:5.1.1"],\ ["fastest-levenshtein", "npm:1.0.12"],\ @@ -19008,7 +18822,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@webpack-cli/info", "virtual:933f3c2d7f6a5dac21dc52727e214cdc1fcf36d71628fb136e96267112c54b183dd48537afe26d9bffb18203e9028c2bf712344b29e251121cd4c374fbb4e51a#npm:1.4.0"],\ ["@webpack-cli/migrate", null],\ ["@webpack-cli/serve", "virtual:933f3c2d7f6a5dac21dc52727e214cdc1fcf36d71628fb136e96267112c54b183dd48537afe26d9bffb18203e9028c2bf712344b29e251121cd4c374fbb4e51a#npm:1.6.0"],\ - ["colorette", "npm:2.0.16"],\ + ["colorette", "npm:2.0.19"],\ ["commander", "npm:7.2.0"],\ ["execa", "npm:5.1.1"],\ ["fastest-levenshtein", "npm:1.0.12"],\ @@ -19049,7 +18863,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@webpack-cli/info", "virtual:b37ef7cf98ceabe8c7b789a7db3f0a5f3444d083afa5f0e3ab570292e74eff241f890fadbf245a134b2ebfcba326b1782124a4dd4f16ca7cdb6091dd9a987c04#npm:1.4.0"],\ ["@webpack-cli/migrate", null],\ ["@webpack-cli/serve", "virtual:b37ef7cf98ceabe8c7b789a7db3f0a5f3444d083afa5f0e3ab570292e74eff241f890fadbf245a134b2ebfcba326b1782124a4dd4f16ca7cdb6091dd9a987c04#npm:1.6.0"],\ - ["colorette", "npm:2.0.16"],\ + ["colorette", "npm:2.0.19"],\ ["commander", "npm:7.2.0"],\ ["execa", "npm:5.1.1"],\ ["fastest-levenshtein", "npm:1.0.12"],\ @@ -19090,7 +18904,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@webpack-cli/info", "virtual:7fc88da9d00679384dc013444a3b1ed8ef8395fcad9d046790a1851d5db985e5ee052061731f87c5475e4bf20a92d69ea1a1a287c0d76d7b1a6bf97010c63532#npm:1.4.0"],\ ["@webpack-cli/migrate", null],\ ["@webpack-cli/serve", "virtual:7fc88da9d00679384dc013444a3b1ed8ef8395fcad9d046790a1851d5db985e5ee052061731f87c5475e4bf20a92d69ea1a1a287c0d76d7b1a6bf97010c63532#npm:1.6.0"],\ - ["colorette", "npm:2.0.16"],\ + ["colorette", "npm:2.0.19"],\ ["commander", "npm:7.2.0"],\ ["execa", "npm:5.1.1"],\ ["fastest-levenshtein", "npm:1.0.12"],\ @@ -19131,7 +18945,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@webpack-cli/info", "virtual:16885aa8448c33477ea2cd730ac3a5bbbcb89a3f570f5364364e7dc5830b16f19367cec64b723cc62ddb3078b4ee0f0ce5d244584279bc98369c8ee9e5959a27#npm:1.4.0"],\ ["@webpack-cli/migrate", null],\ ["@webpack-cli/serve", "virtual:16885aa8448c33477ea2cd730ac3a5bbbcb89a3f570f5364364e7dc5830b16f19367cec64b723cc62ddb3078b4ee0f0ce5d244584279bc98369c8ee9e5959a27#npm:1.6.0"],\ - ["colorette", "npm:2.0.16"],\ + ["colorette", "npm:2.0.19"],\ ["commander", "npm:7.2.0"],\ ["execa", "npm:5.1.1"],\ ["fastest-levenshtein", "npm:1.0.12"],\ @@ -19250,19 +19064,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["which-typed-array", [\ - ["npm:1.1.7", {\ - "packageLocation": "./.yarn/cache/which-typed-array-npm-1.1.7-7cf2d674e6-147837cf58.zip/node_modules/which-typed-array/",\ - "packageDependencies": [\ - ["which-typed-array", "npm:1.1.7"],\ - ["available-typed-arrays", "npm:1.0.5"],\ - ["call-bind", "npm:1.0.2"],\ - ["es-abstract", "npm:1.19.1"],\ - ["foreach", "npm:2.0.5"],\ - ["has-tostringtag", "npm:1.0.0"],\ - ["is-typed-array", "npm:1.1.8"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:1.1.9", {\ "packageLocation": "./.yarn/cache/which-typed-array-npm-1.1.9-9559c95dfc-fe0178ca44.zip/node_modules/which-typed-array/",\ "packageDependencies": [\ diff --git a/.yarn/cache/@types-estree-npm-0.0.50-b9bc3b8409-9a2b6a4a8c.zip b/.yarn/cache/@types-estree-npm-0.0.50-b9bc3b8409-9a2b6a4a8c.zip deleted file mode 100644 index dfe0eca7ace119fdc91336beb9b8a9ef4b5f967f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6775 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 GyZRpkoBzN7 diff --git a/.yarn/cache/acorn-npm-8.6.0-9de50afc7d-9d0de73b73.zip b/.yarn/cache/acorn-npm-8.6.0-9de50afc7d-9d0de73b73.zip deleted file mode 100644 index 83abbdb6442b2e2d51c8b0153283ed79058dfbf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119027 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 H~zLEhiR@v3gA*$*S)2 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 SU|@*P50U3kHzWMx-TwjY-vw0w diff --git a/.yarn/cache/es-abstract-npm-1.19.1-885c72759a-b6be841067.zip b/.yarn/cache/es-abstract-npm-1.19.1-885c72759a-b6be841067.zip deleted file mode 100644 index 755b623f0b55c34a10b730d446872c6efdee07fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 638511 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