From e09a6d2cc6d78f5ef63dad532ff09788cb4032c7 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 6 Jan 2023 17:33:40 +0400 Subject: [PATCH 01/66] feat(wasm-dpp): implement utility function to produce generic from JsValue --- ...lve-uri-npm-3.1.0-6ff2351e61-b5ceaaf9a1.zip | Bin 0 -> 18331 bytes ...apping-npm-0.3.17-57578fd48c-9d703b859c.zip | Bin 0 -> 45428 bytes ...terser-npm-5.16.1-d407c2c364-cb52412350.zip | Bin 0 -> 433108 bytes ...-plugin-npm-5.3.6-27ed5132ff-8f3448d7fd.zip | Bin 0 -> 23273 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 .yarn/cache/@jridgewell-resolve-uri-npm-3.1.0-6ff2351e61-b5ceaaf9a1.zip create mode 100644 .yarn/cache/@jridgewell-trace-mapping-npm-0.3.17-57578fd48c-9d703b859c.zip create mode 100644 .yarn/cache/terser-npm-5.16.1-d407c2c364-cb52412350.zip create mode 100644 .yarn/cache/terser-webpack-plugin-npm-5.3.6-27ed5132ff-8f3448d7fd.zip diff --git a/.yarn/cache/@jridgewell-resolve-uri-npm-3.1.0-6ff2351e61-b5ceaaf9a1.zip b/.yarn/cache/@jridgewell-resolve-uri-npm-3.1.0-6ff2351e61-b5ceaaf9a1.zip new file mode 100644 index 0000000000000000000000000000000000000000..97e857d7d22109683cbc0cc868050507403c7658 GIT binary patch literal 18331 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 literal 0 HcmV?d00001 diff --git a/.yarn/cache/@jridgewell-trace-mapping-npm-0.3.17-57578fd48c-9d703b859c.zip b/.yarn/cache/@jridgewell-trace-mapping-npm-0.3.17-57578fd48c-9d703b859c.zip new file mode 100644 index 0000000000000000000000000000000000000000..29e13633c130614ff97261b1beacce4cde157740 GIT binary patch literal 45428 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�sIsn`chlK?5c0@^kf(j`NK$m>xcK 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 literal 0 HcmV?d00001 diff --git a/.yarn/cache/terser-npm-5.16.1-d407c2c364-cb52412350.zip b/.yarn/cache/terser-npm-5.16.1-d407c2c364-cb52412350.zip new file mode 100644 index 0000000000000000000000000000000000000000..83fcc13270ad1b56bda8bd85d9a8278bb7e03334 GIT binary patch literal 433108 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

6a=%VCo9~h&4axZ?5C$7YMnE6RbOev zlL6`qUx35>(t}pXo=vB@AwSnt*x+mTjjO7#fZQ5UEVcP^u0n#ZzX7ud_rz4zWx7=u zUmRC(*0C{HC{zHaW?U?9%?w#NQ*>bka(I!|1*D$g`Pc7A+sOJ~mRH7-73*`Ugd;d2 zDgJdnJGF4O`@Yj6qhyY)! z%|Xmv64(c*P`v1g6{jJ$s7z+RK_XDgxEsVvsoR_NGtvjyQajj%B`@E z>vT!czNrMrwH-FAB64gIS1{j@&KRd3OdfVoP*)H%*+{TMC$U5G(bk`(AZ-*R`(ge2P8Iy1yfL)vu|O^x8!Z5 zeqfNrlNwVh(ZOLOg;3vZIV*J~Xmi!WCTxB7OJN$2_FGDt!2Z)!;}ienuWF&WVc zp~D3Q6h`Rha~#QMt5U*k;6j)RtuAI>yt7i1tf{2T3W3bPt-h4=bzqYDZp=fGojB~ zo^#Ssk^8^}*NoqR;J1n0B&S@=Pu(%>Y0@iIIJyXDU6fMxgo0HK%T*9Z9L}J=_`E*h zG!>MigeaAsa$%Xun3vG!8zDUqb^m;fM5MWhf$3&MEnLn#G6#dhZpU#UeomnJb!vIr zDb>J^_TU`46L!e;`$Y@HGW0uKH6*ifQHjSJQpH2n;QmQlDMOngwMQhcs116M>E%s# z$xYDZTvSl*(J?Sqs2;2^BgVx&+2mKxr8W1kr|J_Db?~G1Kk^JFTWDLYBf1*)=V`p_=~u} ztPaj}VNN?3{t5O1m1ukcJN_4g%oJM5)UqVxXtnS^R}#2taD_y#dW-k|U`S;w@C*h= zCQxcJf zP-cr6yg-!nh-SoGM>Di8Nf`Akr3>89zu5R%OIEYADUm?6^3TwKw4%5>tiMBwmiUqqy$6@(?d6}NKF2mpujDSZrN!QzdDFMuBVc~d zf#3gXwp1u^=X6#{lm>p+n&8h2q?qNj8@0QO+5n~eog%^DY~Fz(Bh7g|rzhNKd;2VK zn`()xnbe>+`QQhM*V}m-9l+ooxyvzuhCf&kt+`#06anusO^bsZF9xzgJE! z)JzVmJ~D)Fl%X=e_V1V!a_#_JFT)evW=!Qhi1Z{HzKqxJH;EDn*G~QVV-YV`KBLmR zmX4QrIb~<{a?)~Q!_fvEf6v%Q2IxEH$0s95a3(-VNr<={@sik?K1N0e<*JE_fx#!8 zvoyIz!olzXS8pFGhXTiVy6Sg%IK!n%fDz(VdOeb5vpC&IQYIZ#=ISNJu)rsb55FP= zGU#9a-VKhLm^_I;%T4|320dw4(`L9{JM zKYZJfW0Ge?nb-_v~4L^*lCjC1l&8E0la3{eYH4+YW2i~6N$$0&uV#<)0XqCcEt ziBp|(fKk%_c?IPBa-nQ+;PTBIdSi!IgrVxk(~#E5F2QRJ!M|Dtz2h#UuI0(!ytWO_ zT!6Fro7a{nRS92=5SGsAxoQZJhDSVZrRI81LG<4G)|*}M3YSEkem9IyrXs>WS#(30 zdq2)l=!kR(ahVRexo*NFlAHK;pwH#@Fow|lD(2W(FrlvME|Sw~2*LYUtav-0IP#Kx zR~NxcZ%1jN30^xcfid*U{*U7Y`VI8kl{F5Jc6VBkWrJ4=-0jwYpmMZUI$XhQV7$UM zqQlu6g;xn2@>0|0=FxKhzvjI>-z|-$$vToZFS_e9GLZIAf>w9Jr zu5XRHBT$cbW(k*3Ty$o!wjw-JNsk*;Rv-m#(lGq?-Oi!y{-TRv=}-Ak2WRN>yVF!qge-Lo@|ON}6#1q= z4SndIEa0zRqU?FrgF&CpI<$o$uu8qV0OGTCXH5_)z15QV=VgE+hn5bj(W0F0E#gx~ z2Fm<5K2qV6_z$YvUR4tyzE_{xT$)Sd&G8AB0m<1U9_Vsb-@e}VA3~gk z{Q4gNVgXI`P0ew`FNqiRXoKk}1bvlgbvo!I9Z;oWRzEcAYWKFH>T_~Q)rfb!tUu~^+ree-_dF;FdTYsgr1?)cUx%jLB3OP!O6i*fknf@L9i|P0 zN_&^OEKbMqD%WMlp7hnr9=YxWs6Fh}R0xHy!#0`^8{?_o5r z?h&=YI;wc1Z1BS&G`@6}j2JNNe#<9Wsr}}em{%Hu7&nWFE?SqMu!vWTx$1Yw5F_rC zOc*(0s#I5y#*D)0!Dv8+L`k!ya}s(Xb3ly5VCdEJCM>Z$NS5=cK9&%(iKGXC%8)&-bi^ z?5iPzJY;tv{cI)k+B3bnW#_yQjP^oTG4WILFKqr)){*r_E;0Nh{)O?*@Sex>uhLrI zsS2ErVdy$kFNG8q1w0eXi4L#&I)4VtseZEQjqEO|Pi=RquToO(sr~O4$oaS;>LanqPI zCeueb3{oURKuL*XOnv=J`OtL3VWG-5nrTz(DcNtSRhv^NDpt;c!P8iS=5V{#af;6f zzw4Kd%JNqRXj)A@ETA?vU{CjB&{qb8U`y+L7EL$E@Gzza@Lzo924&w6{|h<%qYM92 zM)hCo|Gx15-TdEVRBoEJe9h6}f!byd#_tEf!}OFXmJ>JBSvpnrNyc#f*I zD2@FDr(UNY9@b|2VaQs81c2r|+jVPqT?QT>TA~O_*PMq+4ZSEjO>|rKA*?p`7EhoS z<-3Os(4tX!u!dmKDZ2`+7r_l`g2QO#MqljQ3zLku>KYWekZ9vh4kR2yWha5jop?=3 zqw@bqA%iw!S+b^~8@h(|voP|261784b=-(kC-UoI|N0J{yR@tlB$v)^Mb(8|0z1D= z)8+KkwvyWrQWsYv2i6yk|0f^k4R8;PwV~c0RA!vK=D>l_B2(U!O3-v^v?mv#Ag-Dv z8uOm$#K532Plw&@jzfkRFA1M3;uOL!D?nBhVN5{YdwHRd=czy_BsL2z1}VIHkq5cH z797Fp^b3FUy#^JPtHjIwMb0;awD3O1M{%7t+Eh}TzKh@6e(A{hhz_aN{oeI@21t>x zJ~Pz}sB^C{`W*BWKR&55D(3Nz!R*>=Pvsff7MGSyug+M$cSe zx36m1-*mxruUJNa#I_Y}bjQ0}lxq}O$GQD#xZ4EdcW7)@W%mdwwQ0L}Ugto>3P-#q z7#y!(aTSCbBYlPW&mGyFaG+Ff3IOyI0t2Z2n;rRo0GgG(shQ`$eR$Pl{mSmiCc( zwfw{N-30>TQr(n`F{%Es%@Y8jXwvSnR zI{q06vwV)45B(HfSL>S;%i&VJ_VtK)r5$h1C!DM0h%+4SHfeRdy{xWTGY+c%Jlu23 zmvcUy7Q%N(YnIGgG0Oa@ooD?$%ym^RmRVjbmML2_Vhe0YU7vh*eD2RGH#Sit*)}p| zVD|8vx2K!B*g_$XKc?$2k85+Uq~b=3S;;`E(2h4m0Zl4(rifVQ=rA-dc0ns=R}4eT zU+=LPXDx+t@_g4;X@PNd9hBV}_mJ?5awf$x?`YL3N+thvz1$TzAXURjN~UAHZ1Ivj zS8uRxmYm9++7k29GdFc}Io|hlsv)uohOO0!J?JE+DE7W2*60tXJMSNUGVuN}Y|iEy z(1xc%HEjTBAr7pXT%fx3^b96g8Drk)xf}4B77Is42oMb$2cX{+=;4d63`2@hw(0JG zJ2S0uV})+55q9Tj-c6U>3tIuk1kfYV(#aaw$k=((OaQM?ym+{3A#jt6D|-8~nR1v9 z|AO#boZir$fsTilFXjLrz{?wA zZZYQfi5hp{5f^VDA%LIL{SM@R-NWna;`t2Y_fK)Sj^uyC=IhAd{oBLY{q^s5b`J{n z$<^rQCgXoEFt}UOp6G7ko zGYrhLqrGJ;`qK9cw0`K5r!s=vUOrE^$N=2WD*$?<$GuEGc+gCJe1bf}_l?IKBDUy< zkHGa8*vfJ(M3m;(#9g%q1%$wXFA#kBjecGpUS1CmPvp0=Z?{4}KOg7Y`R($+x%}hF zYihyM^}-$0 z0shC?@$oOf!Y!8M%h%I;E`*PVcLY4*(W@Wy^_oYwHw%g$vD|pyKHr^<+ZXTZ>c=%w zrT`rRX>Z`Xa2SVc^!&Gmz_?w%$*m-;vyB~HPo9MrmS0)@Wo{na%c#jgz}H`?yfKfJ z*~`&aE!6Yln)ff}9^Ra^6NeJf(HkrF@3T){FyJJ@T*f?$b=Ih9rw3B@_nzo-l?M&3 zUS@yba;C1{tWmN3Pv2~dew;r%r%W@Xcswq?Y15-tNuL>j@=VPHFtyn7m7yY6|Iw4d z=al(_d*+F03XD5rZEpnK@xen^^6`czN269C?@rA07+lHbJI?8p{{cKe!@qHveoBl- znfbT*^`GBl*}VFFa6K>Ym>oK}O|4(^cvc|aH6HYu{S30+Qc#VacFdXy_k(l zYp@>x9jaf47slV$_Gb=f1SVr=-^8P2noO8Ayos+zli2v37%z|FBjZP6;QSG=eB;-` zM8%`U^~l`a1?ZPLfLi zz4;r^!2sncaC>9=r^(+J$!u&s0irNX7;v$V>(zhCC@%zAovJ<6u; z@4zV)FZUA=H1gO+5%tPC5aOYWisC6?S)53@%TSGuYGu#Z86#`0(d=`ceJ9fxoN2h9H6BhR}oI;n5pl@Z#<8=-B!R za?!!seRPp$*HLFM*oupC@N3c8u{qa7kW2~GACBLOKd$4C$#AAmEB*wiOi)FTkAB>f zP4nbBQ}i*X6EnQ12$pV3(R%j9-G6gt3A!}%&MhVcx9XahH8)3g{C@db1@76Wqa zwAe~vV{Yw5MHgval*4p3EYz8cyncQgXAn5q>8E%KFNS4i_OD)SmKg(1nCmDm((w?a z@tIJLhlPQ|e?1+(Mg4hr0K$OWU{a`+40!PBU>^k~YqiwEnd0%HoG(f^A4z;|&M>3r zPGgu;^5=iJbD^6U-3z2~R&RO=y1#f>J>5zG5DS2x(|T(Hv}dyb z0Bj}~7eJghF94(2MvECJs}uJX;2Ee}o1b9OJcLo1MlzO6hPgU-)A+Z$q2j*KW(K?^ zEw1`zAL9(elj)U2dOA^s0dT;pizG+V&V2tAg!_a4=U`t-{2)^Qc&LBAdULRMGJJV( z_VdBP(eUlw=_%+#QY4ng<=xT#!D~3B`|2mk;IhrhyR#ppD)D;n&FL@lnB&>Fn8p%? zilj7tjX~JUYy>jUFuSmR4B-UgNcvD}$}q%_4ab(821M-A z9rY6CTM%O$eoXGF(>_AEbeQEhM48SOn$)B-v<3`Oksg9NKGBB0ibni_7d< zKZlXWSMf*@;c+}0j*?;WDIJ%9Gc@l}C8@$(G#wbmmCP=z5qr0JG7tyYG)QS?USGUkC4LuQtOer-nvf!r+tIo^2fO)5s9(jB&4+-5u#Ld*@`9hoIGax6 zIShq#v3X#m0CAoc8BL{Cb2L;A=RlW>7R|K=SF{*?lEf2%?X7^KQ9?GagonytCe^Z{ z-GHztqErCvz&2BpiBvJ0M@+`oarJ9E`m^&|vc{HJP|?^R8eUGbQ9Q-&MX1SDmIBEJ z>QqGaO=yqX%u6&UgbR(BCjSzdfZ&>3422Zf4j6)RwLWmaWSXv?x3b#Wc+_sraLE3xLmM5UVA#X$iz$m5Os|Q?H3=Tmo|9s!62I`#moDuHk zNp?}RMLnP?@kKrAi6%qIF6){guPN$BQD&^VHlWB{HB3f`N=5A`WQ(Y60>=Q9z}gQ9 zO|`a(7HtBJP!noR3U18{h_yw8kcvtB{xy+-#2?CAHJ{}%zrf}&tz9kDvv zfhg1<`X_sH3|i>!P4z0UHD+Ic>V-T;9T$c)to5PlM>X($lptEQ?;5>`)F->BB63?N zMS=CI*C3sZr;ABaP@h4yBZGOKk_ASZP`W*LF97uo1Je$(H3(6Ipt=w>Nu&eOs#8iT z?ic|qOvEfWt*>Y>00P!Pq3SazLEpyK1C%P>(|`r<-aaA zs>3Zg@aaJ@pQdGZtG^XIXpaSAjb|;uTywUC90n|v18}98yzihVh7@&5M8~w`=$5S)I0>5ykiKg^f`>L!NA+ zwK_v4T#=hvU19AR2ruqA#DjweEukxAkNH$8E25?>E!@^ zUY1uo@b-Ir1%GU8^gPnEZsGiU)%$&VZjy56<_loj5v&ye)j`~Y6CNZg)*|FX62dIV zq-gph0}mNFliRZELTKH9ZMUP$L7iTY8MQ+B>4m~}{M$q~7l8AfXs+6VWR%RxZrT%Y zV~G0P1CV{A>A~a6m&og5T<@b$Hy>zg5lKTh<5uH{`}7A5@fx7)T zpN>nI6jI&wj(BKTf7Ix8{LJGb_ue*oeZ83p=Mq*ThBEJ}TYveo zOzRgf_}0B;k&taa0Eu8q_ZV;_*-hp4K%Tt0D~2+1GEW#nT7)DRcvqt6RyRb5bqkBu zs4Jg}?;71r{xAO=K;vxsDH#fGRFIHU$G7aSGNMtpQ(ULy-5uS86AcD6dDGV3VU_o-E#X-^N}?S2?kIujCzizy zePtCs)6{)s!oyB`DdsG?y(W4|%Xtoqf!(qeV@!%)i}P8SFq~lMO*gXMnF^>iHR~vq zcL+C>ntFnhf67g7nv{_`1y6Ro*XU5vwZGVpkRCns zc&D#hRm_MeMIo^jNWrt701aN8N zt8_Yn1$-?RXfLjPHI6J5pgIVg!@RTO+7)SLd~2$RZ5W%8N>L)O5?EjPP0!MIeg`x9#I2V55HKY83>N{e#y( z9-RGfyx;Ap2AzIoyR00w%(Xj8{ti!au|>b~K&xmjzOefk(RtWi8!5YFql}B|PN;Xa z#d>}6!^YIB<~CTXxz)fG-T`DSfNEFq3Q(q2Y)usVubIxkCde&e)ELbfN!W`t;Xx~& z3pm0NuLy;rY3TgENQcdw(@}Y=bMg+UEb%q6Dd-y< zn^+pUCIgd&)<(OK5G4n7S~tl>Y8{@ZCVjSt1b{{qqXWRSwh)+x+$HUK*tMOqg~eo9 zY3&{_lQi-iIcL>!05&nlyw;NQvf2`j>I))cj8Ejv{D3d)nO}kJ2SLUX+Ehy058C0LN*^D#t+W@BLQj@$uZ#;UGC1HTjgBEqa7Q_&Rq$G7X-D^cB$COnsw36Gn&zHnw)3Uc~CW>IK zY&&a4S71xLs>TzrP3s2G!}XD5a?!Wwgj!fmv;XhgN^cm`^y zT0lXG6U0!4MrsUZz(L*OEp=;Anm{-^e%po*5Y`#c=o*vI&<>~p_ZIHKdQZ`GfcmF2 z7DOdRK#<7*9c6)m%J(-{31vBmqYwIW_Jda8*D7O%(BxwZ^#v_gT9Fr+RYNw~j6Td4 z#Z|ZWA^HaX%;xwPj1LSsEz;7;UlC8E5k*%f!f0XwoZR=)2_mnEHXV%f1o&YW9W&(; z&GzYRh@QQOu+YGNk1yqTj=zA}3O(1z^{M*0)0&PnnQ)DMme5H6G!Hd}#14t?aq1BA z1ZtwJim(-Udrr^9M@beFZGe}FKO8JSA~{pteN|n}CtZJ@C-5O-su@`*qw9X_qlWi@@bEw@1o{L#3HSsEjw~ms)qeN{f-g^TR+a=PR2xG^r&wWe z3om9ORWD^wGzf{hm*3dvd734)=4~a8i96VwV*GKzBDOEiFU`qnA|dBxHL{^fuWZWU z%t2jdnp!%IX9G_9UV++gc%uq$`dvHLwA-O13X#leASn9b4EQe~vG{eCUMJb2j8uHb zKH3>U?F1}*cXC+$h2c-x4DDsfOuf{9RWB(pGXm-s131vfCpv)th^NXeIZBJy2o|)l z9>qt|Ur&#Z;A8@B3DHydpuV1FaVh?U8Am7a>@pGKoFp>7Q2j)wLP=bZTI&VE-)eax z5;{7)o0ajc=y!HEmm@4@a>B3_dV+kk?r15syq>KqUrqmjRf_$ZajVYocH#ZpA+6us zXtYC#n-YZ#c+j@K6X~AbSJtK?Iv2U1FzE)OixK-HNaATycHe75RzI@*?qF2Uv{WT^ zuNE5;BIS{f9ab`O${xco`^*Wwm3AqoL%6w?3 zyc(+m!;GEk^m;4Lxy5X~loah|P2eSQ+SQGafSEgJtPdGA`fcUebXWpK1U%E@RN|NX z`G`9;nBpQq_L5YhFgVwf=tcEa@=y%JN@Qbc29O!1TCI=~?fm`GoKeNt-l8O@qioX) z5opVq&DJX~BUWEV1;8XOtlpe7HX*&68U+l^P9mL01eb{WF_2I0V}&f^7)aIAZQIgS zZ>*Pu%{E2Yc&jx8Pj&V>)$f{~IEYF12a%M8qN?p~0UL(dhErrM!Ggf_Wc$%*pvGEM zZ!7!D!*@JDAkBC&n_sx7LBc89K!wV*!wxI_+WUqQNjdm%B$x8KIKT>8w*9;HdLe_g zXs>>01&ZGfnY?*LL@9tO!0VaFiU=YkMX1q)DusrG%t2bvzXp+a#@F*TLTy=#M)kha z+i`k@?I6{AZ3dwWzv^Rf?5alYjUfOC2Y!EU-`-INQt8|`awb}>?9-FsMF!HH@E(TW zw3D{`5QUkQ-xkufNH?OiD*fmN&@f4^QMbQ|3%v9Ptsm1NngbN`cuW>CXiYPWKEOCq zKSv8d@-5z$gNhGgd37C4>aIAZ!k^u>hnZ2-4Mk7V)(1Fn90gs^ps4xFr7IFo_0 z(n^a#kzFSkO@dTGg?RbfXXN?g_n{8h-Z$ac9K_?RZc{Xx8`v}e)n3P;(SOjUdQr1? znyN?&9d3DFGl~qEQnw0aHWVgQ%7W5mjk(+q6jM?mYPc~QRYFM%MeqXx(s0YE2b|F4 z{*FQt*wrN3hKSwTySrp?Px4KV3sTIW3SwbQk*-nerjxClS z775hct)IC9L*9GtU+ZpdQPv?eN|Gc-Qit&VoMf|a%cwwK#>Je{jl-9|EsTUpm;!r^ zIf<@_T3z;GPBw85E+)=jl5;&VRSRZNQYPeTBxx+M8USD2Hm+tYs;tO)m(H}XlY26z z;ovmY7x&gD1S{&^Qs-Oc>9iYJ1iu$Li8PZ*0y4HXl`rMTF6bS8Ydi(%IYgeZf%bjz zz+tqKLRpx?X@*wE$L`naPMZt_)uyiJyq5tUnf#7CjWN|6sdN?p@|xSxkRoo>Rfl)# zWZ6pnW`alSy`vcKzdSNbhA^TuBNTVneYuQ!MoL3Cvk=LSYiS=~C-$_%>vlU$eY!9& z;Zm3bs4mJLe^b^p3?T=Z!tbsH-UoZM5S%1()1YLKRfFy{N)8&|d!gu%(CHu$P@4ap z2G)tGP`e^`NwYxE=4kmw9L$$6PP%D7dfL!OC01OOk8|jzk{&lAkHBXIyvkV%<*wdp zNGyh25shW%|JsNwf$$H4%8CNYOJAKgln}4)A&$=S^Oey4ekCqoOSE+xzw8mNU&m^* zwJ$rCo^3xG3<#kaGQo`O!?$lStz4bb6TkC zo^Dszwg4LAxa`WY`o{HP{e4A^oxO^AThYqC9yCN#n#fN5wRNp2-pjqjN%hM2(7D4h z`oZ_jyyDf^SQAIjXXJ=WYDrg8_~K!_>ZS<&i#+#B9jc;2Re(92X|-KP39> z3&hA1q+d=b?F2G7!AY>O>7&sb2%nHiv~J!hnHDr;4RzwPY9sc07*hmFuvL*#AUt3M z+r-#hGh+3l!5{p40PVzkI7xvUuUn;x3e}r&qhs2E}0xfjy7Fk1f#2K$9WSPT5bM} zDf{|5P=VK-jng8X&g4lIZek+$K!B;}Qw9Q?(x!wvrp)$8hvwDU@kyOUNK_x#Ce16{ zs4Djnn8^h&Mwu%Cc!~B!s+WH1N5%gkk97{S=?roWo0khKcaF!d-s0qD{KB>OkE}J?91~8CM@LG?%?uCzlR+~>WM1DZZXm*=kJ6tbYvTuE-#eS2(j z*@h zS?myW0=a90mF1nWfr!e>)c0Ym-w920jKrkw!bJJlmed8WMcn=9HwEW^^GzT$pY9j7 z#d$Zlv8YaB(wlyBy8X~ax3~P}uhj*;l2niFq0l zDG*;lMQWv!>v$7aE~(_8-Rkc~MciYNVJaBb;KEwllA4>Xy?G?acYxBge!X7245by4 z!Rhvwc9tOgc7aWrxXS=~EynW;d3IebnM3hDEudxbo8=&+wt-I^@DNSj!V9s}{N^wM z|6_=l4^tl6DG|#k6OXG@v{5eV4d`nRn^>dZ(@H^Rr?!l8U?>F5iZpAHH6@fb41+hP z9bUBL6{>KqKonb8bsuS3Sj%b50-&KVJm_1|p>d2sMiB}yDdsD^izW$t^IBx^Lsp`? zfy9A{V9Ki`qHxk;fMFM9(&sxzh$*S`l7{a8@$df&v&CT0AF!rKGPnQu_y4^U!CbQl z&f_FY3Upt_jH~1#it(lBvHUSnqkN!(4QNRIfVZmI;_?c6&hu;pG~o_CpBK}~U~N_A z)q<~xSfWYLAFuDG9Jn<{xGA8#iy)HXb%73mEo^S zG!5Rigm_o8OMfVo9e6TG!0*H7Rb>-n6c*?1f2UnEjyc`pkwu0%p&?U^a#|berb8XV z?hH{-673!LTUC4cAlML%0z%Jrx_-}3VP`G0adh);k819v|3Tr_hHPh)h_vcA2{0?z zWq|S|BUUJLNnl{Kl~^74+$;f@mcZ|B;<<2XD3F2jfWt)J_5#h(aCkil`0O2Jrla5= zs!u8+=##%M;we@&u8NFD(-=MN%&hOeiX}el#3^6T`D>&uelg(EG>2Gj1s?7lhUO{k=oQvOXawU2mN>ax4>YSgIS6n5sV za4U+Mt(_>~kbij@nU_d`YdaGN+a6rF#Kp_*PZ+DLv>!`sf!cM3TJCyOjRL4`O5|EM zode8P5cAu4CBK-cLRhU3sgbf#c?3BtNw$oy8uW^25z#`=F9!*sY=pu+>I;C8e_y1~ zBcA9KkHsR-G1w8KEX7svRRWU#z#Xed+LiN2ivo!4*8ljw{s&Wq-K6lL>LKJq;vS(XhnG!G*c~Gr0&%F?A9r7JB=Em7MxyascyTi$)FX;ALt3BKurrgUxqZa@ZdcqMgIYp zz`|0Hgk5DtqVwvv4y3XR6E!-_vN2SRwrQ@8kn^I(I!)i?&C^!@kbT-%-ZBR2#w%d< z!aWQi3qCyb+gYvejbKPh)29rdj4f1#Ova08IdpL#xsAtIO}Wo2s)zAfq407w#}S;fs42DrSuqP95Own*AZUd-l`<`^TOjK2=b2 zY24}-#9HyaSsX!9lb*i_gKTVUoY$kEDSZgJWX*`arqyKmkTzUIoS6#*-N7S=!|4(uQIQGjI#n?pB@u`oB<9SL+Y(Lrc)t^6m zXr@LmPd+92U02hCv}Z;^D?%<4UfJ-*dg$(PW>bFyx3@Fv%WihEkhu8AgUEo5A^I(?y73#Zp{mW{vwR`UFNB(bFCH(;53$f9z^}+G9ET zujf1|!ZtocdNpY`#MslgFtGVo>eh8Y7L2W|5c;LfRg+>^y`#DHBZVSvC2NZ|y92`h zbY2<-y z$3_{%=jQ^iH#a%F7#VV;%6G+-##9j{BO#Z%f~jS{>4`xHRFRHR+8A=0A~9uQr+h6z zh`WjAS&B(pO5rjhM0)^NtagrMNZh74#iD}(HqlEoQjc?jBCsA1=YTDlgVV57jb02a zLfwopfs4_8RlF%RX}P7VTaqBB52*${+?bTPJwCfilw1k2^HmItGmlbQ_9R1L_6p`Y zh<;AU>9hn+9mSJRAWz1Z(z6t?DRYMv8Sf$>;6nH{GS7)Fc>Rn%rJKU1G{SHP`34?lfNntDf@9MTxFIFzs(kJ)hZ~mz39?o-BTdp0h$tK<89* zuI3b?YfvJ{!^a($j+L=Mm>|0BeoW`{WHJbgx9$;xhq!g{uYaa^77>zfYcz>oIK7*z z;f0gihR&gDwec+w7?5s8&vdN={(04}eO^5y9>eKvvg+ZkrmloED7pY4K&%uX6g$3u z@Otmvo3m}p^ucX{sb1F_Jap$BwlDV416Tukw43Sjy^oE4D_;Z%5njJZ5)MW1Yc+?~S4bshy8Q%RI!}295<0C; zXXdE-WRtL5@XuYU;W@aDZ@b>g`|iwoq-1zQiTw)_E`7V~A4|JSAo;n2+DNkvltafj zaqANoWYP2S#StU=8n?-d7|}n;KS?oya1tHx$N_jxOaz*T#!|?emcETbfyG<*4tt%= zP#V*q%aLV9G7s`pM~GBbSOg)OgS;afk}X!5)0!)F3Fb@|RT2Yz5)gIa#L&cCiqUfi zTL68XRwm-giYtZvwU8A;e3UE^3@O+YlXB!1Zu0UdnX}i@g~U`BKg?-}?tPDhi08eq z=6IT@YGO#FrR;3ziKyG;37|1FQX+m4b&YxU3<*ddCIVmuxut|5t$m_}?+_QFnd9@w zC129EVT(lg^_Lb3VQ5$TLV9Bbz~`oB@Q<4)+3c zb9SQ1GL7jFlyxZNPh^;bY72LS%|>Rr6uM~Mr8-ZdeiO-j zv7@PgE>;DA>36AR5v=TNy@CCuSbhi=26L2!g)wv*D_v>9rjSl<;vU?p3rcUkEhw9E z^>N#{Cy6Ivc2T1ACWKQ{vd~FoS29Sn^t%Weo9uvPi9-zaJ4rwrqtdh#z-KdJV(r%? zPNlHL1guzD2%~sDM{~Hv+uY%^MM+Wcmd$)1_)<=v)?Nc7<6qIB@b@^87DK_J1Z(2# zg=&j%3WKjnETkKx0_7?muI8~5(gC8aAsBf_0kgc{n2nH0NrJ0*lsR-PHiU}TT7Px%UyVbJE^)Mu$eO~*T;#gP|^TkTD%sC6#2l?$ccyo&L}NWr@+Z)t_8LPwQ(`j*NA>#f_%1ytGJ!5IU9*I-0GH=MqP>{W0Z^&%=*v^N|gG*E+iOpLY?vej@MB zYt@X(cN32n3HRYT5v<*huN}=SdR0*ck4hCxEwIF~4^<&{tEv0mp7mKplMLI_oA|D1 z{7%y*HEvGhrZjIxk6nbK^C5EVQV$dK>lWx0NJQ=m0hk?!AxU6WJLK1`)jOwCQP}(c z&?qGja_tG*gNd6>;M8B?6Sf4MTaMO+=uQQvYAg6wVc{Zh#5HaUEa{^5O}E9$vL!{OYNh(c#@aG z>DCpz)QwCvdz*~S-Syf8A}};ziyGR5QiC6`?HORXg`wGSZamO2WJZy@YE^jZ+tYYO z*JYX}7XqyY6QEW@&Ap-IY{k?D)m{zDtSdfYA-3M$N>DWoaLXnhFpfM+{HphX7+^gg zPoU4U%)83bh}0M+iO2RDm?Yq6w+_*B`tXM|`P1nJTc!pNXbDCz$%!@DgI7u#=t346{t*`YM z5a0#MG$yQO>az9tO_nD3q8YQwY-p5#Y_8#)CzHiE8DiP^XqT(sW;Ey+X)gVuu2pnT zRezE0iR`6tsL2LVQ!-7&*_yhG6*j5A9H2Lp|J=N@wZwnc&KGhjp z`_afPrQy(=Vb|D_9t~{Q%B14OzF>LpTxE(1lEM-^@J6ZniFO06E>6r)4EZuo=F@nb zOg1;Y3n6m{ta~9Ph-j)}5^SMCkCQHg7`zI4Vh?V!=Sqj#qV`v6xrvqm^ui7c|KmqVF0 z+E)1q$%J(=;MJD^=J2gZsO_OJ`asB3y9F}evKQK>T8YF67=a6pZ3r}=Y}cS@QGoJu zI;(2)*jR3aAhrMUB?|1gvCVv$8-Ghz+R&!WY`u|YOdYOmi2-fSezdqAB|6=`SXrHh zAf^8&!D{w_8<0R2jr%1E-35{Eyf!R_LACoeZ(uDBQ3p?$W63AFtoT(mm>f*|St;{G z4d8iRDtQ7EJMSR_?x@$QBD;8paYmgg1*$nsblBn3sk~PN*@BXPBvdnZvNWNvk9LvJA#I<^U{{2mtfG@MOG%{7qP zfXi~>e?&5LHI~p&(e974`yrbq;lfg?6@j(;xth;?Z;5;fYRivDzXIiMv*)g!RJ-S5 z*!oSEM?Fo7ZO$QjrRAKK7?9Y0Is6?F4HBNbWC5K{Z8!t_)$i%x@CM3;%W&gjTcT3G z&QWip6ZF5UU2V0xr5#Rc_C*}H2kwi>s%!S;$@1Hxyg!3n4)d~I@f8}`slLO#d<)b! zy=|a;TGDRXTW^0K$~Wqc5oweyx9h1(NBuH|h+*~cE$EAwYBntUR3gfg7E-fV$;%9g zX*_!%=Dj8>pIZy27AU<3Aclz)zc*g3cUpPdg?l`NOq?W_ptCxgMXGe1$JZRoW#JDx z(Npfqmm|l|>Kobyo*JE3S;(Mei$tQv)itb3uzz6-=i5nKLaUNaw7S#eJ|q{DCzpT? zmNwLU#qS{?E6Fxuce~=YM34C^@ecvcwXdCZA_%(*-_Lkh3syCLSEyBTJ)VLTqgvGOH+#R3i2k#xgSP*K1v}a%xepmU#wO2j{gq*2es5&n`TeXP&Vz zVOnFeHQ?6Bc9Q9m8>TLauxp)ZRY0|wLp7$=lm%CdvJFASy41h= zSObYfk%~UpCTE+$A&oKG?r|f3HO6e?N*~p5NymZVp?ukKcQ7W}+J=6=*2HsQ0(AtM zg12^7-_+p3Fv+{>{B#A3P!Vhz4U4PvqU^3pWYusFITeivsOKu~s4M?7;ptt^Pa2T8 ziIBI&Uk8V2X0?qi3=LE75WM;V^lc=1V48rMu8jXGmkM`x*kKLiwA2|^Xn?W zV)wZbZt!eH(&=|FWpJnW+4}5z4|y?!QTnt%^ZQ#HTPth)~+cVmo|dTHPB75aKHATA;m$E)`qjK#MXNq8foNmc#|` z>iftw5DBUWB;cn1f&#W+oVr*o#|@hbqzd28T6@Q0R_mN=90i=jkOD+o8$yG~LMQfk zQ34==W+m}8ClC8!f_TeTX64;H8BiqSWdiyqFkw8=6qC@80w+cvM!b(`A%`q!XoXK# zKEG{A3`1(>@Kp@7SBhtio!cZoOUcUNh1SrmR>o$~_c0#1r=pO$TmSa?%l)6WVE9g_ zy`UA;cB=5^$^a)qce{LEbyX_W5XNr@ZOVH|NXTFrOfEU310eA9 zV&;T7^C3J($<4B1Pc{C=AmCKOiYFqvSpm(~@0Gh_U%Q(04Y?8irai(xge&a%Af1h; zi%C*=MW4xsRtC{DD#zqF#Mg=5X9yb}YRS zBZWCccg^lzH4%yqCqpX@RK=nh0rE78<7$c%B%^jZ6JbYJnCl>&O>A44&KY6CghIvf zkufpb#32qXeZv)RCCFvWy|S>>OY0s`@2gU>Hf)VwJ54!zg79}@j?@JJ{R`)HSY=5G z>J~CWz?~sm4908Z1)<~1e#DlZsO*W~(?_W+b1os#7*3*0>}*NqoTIB$n6R=Nm_=FW zlMJ`h@Uuf`9SUh@Kh>KQ#&2VCGRg??{JC(wvBEM>1)?0>iSRBou4pWd=h@F~yB_ zJ5^B9)djJX!%C!kn+WM#UFD7MMi`0k!uafY>DC zEMF+!==0`mDZ+j2?+VIwTUuG8{!SNAX5hGm8h>}Q@HWam`nJW|L!xBn7s#_}nK(zH z$L^7L&laxDO`b>aZ(r2v!P*Ca_Hy!(oP0>HOM(|C_sz2wz6!lS zkS3<}3tk{6gIRKE-@Nu4B(>fu7e{EY$SyjbX;nN|IYk99&@c+R;if2)TS)D^yjm1& z!5G;WGng3w_nPgAvI<6Vh%$@DSIPJz0+kffN^k2&s!jw}?V&mLRW;b-e`QOk)X>rw zVe+IdR9uqg%P#$fl&8j^cE--$vZv3dLYpEO)?MM@j8d1}`ShtqudKckz+>|^g_+An z2d@aYIa>EHUFYn6N8Ox%`Y2m5X7n$(!6U);Hnx9Oy#PRJw53@F0uEC>64^u10Iyv10BL2=Q z26?fqqFi9d$5AV23ct5PVF5vS=LMiZUIx{Ymno=RB{WkYu&C26k>c<+D5kR$-UXWZ zz%%tQ_Lp1M;Nk}_$gl*=(h!PEAd{9{7cAfwvvn+01(%nFuyUR>-1y(Tr6mNNjhgXH z;F{R!0J7B}+(VJhiNH!j9`nnt!=H?J)z`pEIZt>KnomH;{ha~PQn{BmvDb@|vYH>u zv!jyx1BacYV`KvzKpYGVTHhtA|6TM=^dUuSXmi(`DmJSS)CSjW29yP7R~!?SyKsSg2L3cTd&4z zT`EwDcI(DB+GNsY7MXOjxy#zj<#T3Y?BR%=AddO8Q&djS%iHl4Z^^u>WiV~jVP)zk zSbDOD=m-)=8+KRPYL7Ia{XJ)#YhYN(5N)@X8_<~$u2e59lAGieT804#Ce-Mf#-ZXn zq7D!GnS;PN6`Ymn3;Vs8mV+p|lDAPA#{8;6t9}CTZnX>b8i)mrw=!gzF)bvfN9j^e9s*_qCM!0w1@gZ{WcAQN{d358B4$NhNwoc z%Li2bd#q8;ATHMLL9rMCIFR!`3l;zS+u#1Sjnx*>teS~b+*k<^!!;(^%`B2NHFfoD zXRE!P?pURkQS*zQpuBa9?l+islYZE@mMk`~i9UsjTO$dZw9-wxqAs%OeUFV;XO4id zqTN%@8`S~^)0hj@e`vpEr3wieSLPk%`KXL4UFBFSfj^$e5 zSIdA5&*Wi7Q@Fyz1}Sqv+V5lytJU?q%BZ7XNv6er(I$--$L&#zAJ)QMGdXh=T`w@l zeCLi(3DnhCmS2Cbu`06#L{aXFl;RhWGJ*n1g%jjd5Vq7yLGix%#vy@UzBs&YdR6eU z9c~o7v`$>jl|&>*!Y+;kc<+wcLPi15x*umOr?5N#6LIiJ7Ut`o>`3sQmFuIL zJ7oERhiayVSZyzuy-hE%G0hpGv$C-Y(#j?^TyfD$8OW;zSG0(bpe{{|n%a`70VNev zy&K3;-A&9!$6<#}_oGC$rY6y9u!K_~23Hzrw4IB?CFLd|7thQqh)SyYzO${351r?o-VSGK*Nu0r z*1Lh`_ekyKC&Mtpv4-+Sh8nwFZ#zgli?q zWo%y7jGes;H(UiAUj-(fk(Iu}SXy~6r)D~;_+e)?S0qEvaG12tg>P6$&Q9K){qT#g zIlmwi8>3KjgS_5*bNUM(fAWG+5Uau3iVd1!OsBPp_#Wafzm!65rsGHP#MK8vVPSP# z-QeP;rgXl1VDj=(mIiR1hwfLG5DQn9V_L{Fyj)}I<7}7n)_E`LQVtbKSs}l|`<6ux z1g_+HYh00eU`2&c28($Uku2@$>E=}hP(izPcl|@)$W<$Bvq{(=nq_2bE4sxQ5dp#Z z-$k37n;4b-0{+})2#dvuY!H0;(h0$Mn){TzWpY75lk!kRl&S+BPg@rZZ=)_&b+@-` zRTv76HEVD?i~NeIJS^MRicE-QK}#{95c7F_#`D-aCf<$o-Tsn*n%&wOnb^Wp^)b3r%o z(`i~ zGlnU^j_B(Typ9RxMs+V?YDk#8g{hOMLkU+9tHnB&xXhOer&0@b<@{CxO-t}BcTZ(N zDPJ*{@qK)qQ!4FJj_oRbkEo4@cg(9 z1FnVNkOQi%a)Z77&`y>8VpPGoT6j%w@2M#dlTN_xhd!|e}dtJOi_YLrz zUYXZ3x|>RBTBxQWirsa5nQa11d_-%xZ9M(9jXb=|CvKz8t#+h&zw(=_iI$x6ws9>! z`2L$e=S+8-p9)`_;L-wtS{6J$ANk)UIV5?x{{D1KW}(if_R>KVhSf#v^5$jx7`PSV z%;bqu3afb^Nt4v=*b&Xnj~^Q*i^UY1O8zatz98R9m-9$ZHMm!g8TyE>eklx==4)YF z^$_}~XD$kwu*VdUKGIQ|Yo}6!KZ8nu2WI#{nFM;RYf&dgby;(7=3?Ug2s%P6{BEj( zP~EuCWW~!p8uK}FB28vDc>NoR${jSI5Loy!vs%jqdvaIZr9FP9Ww$LddF5#pb^{G| z7su0(k5{|ijev~num=ryyD^-slT2+YX$O?iuF3Xg2%UOvT{%KJ_*^NGaKZM9A3ocn zsR*E&sb1Rsu1j6X6;`zZ)dyKCD8}oKjWk!^usimaZ>To_Q-?NfOf5-h$C%d#=Qz+t zV2~qYGb2(r(osnVmo%_Do^cg7E&P|Yd2cOWmR8T^8i&E4V~jI2^I3RHuM(!nw^YFH zZ}538REJwIbaTM|c10TTzQQ)X-CDK>%VrPj6I#p$PYRliYr#zL zod@v3Z{fKusQi3b3YDa=y${E&yuR9q)ZIQZWC<$s!{80h2smW{X5@eQplV_RX%H_M z?B(?r`Jj**fDDP?T8t4Lon+B~@ly|&C3EzGuD*WQ#9v)I1SSSHx(9!MR-(uUE8I!(RHl2p z`%Ulk3NgQs;wntteSE@FS4A6R#Ca8`Ia}Y5Lxb3QT|Aehxs&2nQdYoIi<#OkEWS3k z=`)$$y|?(eSVtn6p4$LtrIgWDay1%qdp|m)?saEpzi?)j=fu0C7rI!Q2FNG=>20U= zCyu6=KQQf0ylNf52P9SZ1_1}^wQJX zsQ9K|i_LCT_c);7H)G;v(6H4^yld5AuwH)8cFxf#icp*A7L_B0m?^)HR|o) zDX;6^q33$c@#m|al6zAr8PudM`s*sFq+^=KjW1%*u}d2o?sX?s`Rm#XoO&Eg9)hVr zL>wvKCPBq1=RS#$RaAymm(Bb8epF9Xf}oRXu>_|}iGARZz22Dr?mh3%_w(kyu*w1b zsZr6yj%bqZf^@=*1`g;3o$(SML2-tX&(0|G9po6KxI(Hqrd|+#)FO>)=3#id&j_TO z#iX2AsL&t1g`6otGQm$W=9NZ8ZC;Q0SmOMoskE48;A#TDT}Cb;fC_%nHF|B0u0C~I zX14uUWRdMum~qxa3<-by_FWsaEl-zeF%?QkyG^49+HB5u{`-2}2R+n`Vh5ciGg; zq$1{{$TndhhKqhs5nEQH2(r8)X0FeM4= zn8qku3RK6#qi$ywLOf;VvNm_4-`YM;ub`W#ixQqII%;^Idz}>V;f52qltJ-z z7O`1*V3GX2!0PL$F+}njo+A<%vKO~~rs0%gJX+JSU#eQ&+;|Q0Sc4U#8j$vO+d#lH z>`(CaW_&#&N~7c~Jn*CO1p8HK@H?#*%9E;p*;9U1B{MfY0HYc8+Ji#h>X=R&0^X4g zchA{_9cj20NDlJ^oRgt}??B40+Y^WiuHL-I<_e!0Ao;Oo(=S}S4LN#LfpxcZA5BMQ zW^9YmAIvb=W@_u&RlQyaq$gq}rrgw3^2np7vW)EgniS>EK$Dv2x2je81Vvsq@Ryb| z>&<<7b0sv>y#Dx|Za zu7B6u%v2r{7u4bbU)3~ogyAaVHuS_~gVlsL;E&4V<$~X5LDO!Xx_r-h-ub-s5WZDR zp(3RgvZDfKc`ac~wW}IRU{PwckLX`)>ki5y)0!M(a>+YP0)Rs*1v(;{C1qXp3xA#Y zzN~6`x-x2*11oE|lZ#}((>3NiYKoy)a@V!;7fQ7hMUQy$px?2IKW~lvXjoDIhUP+2 zt>qA&@w%}{VgI$3NHGx?n@`VzSE>R%4MfgvaQ`Mi;?FS?`CTg67Fwy}oZO9!R}>?- zv9n%I>?wV-+)va|6vPCgh*b8BVoYvvo3TeK8KsT*w^Scibq`vS7XZ2P^u??)E z{`8uPm(m(I+fi|KT`p(flD1DlljUQj?{5Drp|x5MGeh!RSJu|09PLHkxF^$k6)%)xpLP+r#pgMXTIN%B2R;@{Ezhmx8iI_=YG z(kw4lP4OOGCjYCkk>n8|lC1-%m1DXt_Gb6N5P@?EUQ*OqpsDl7jXhj=jyvYr^ux_q z5wYQl_`S_qEUc1@rBSaq-tHOwQBg4S>N=gjRS>&U88W4K+*xa1z7}1Ra|-L5o$gYN z4);9o*l}}gIy-{izx4z!%cOpcdD&bI^1Ek;RX*XluXRZ&!Y!yDLVSZ-#9>B^(FKe3CZ79My2M&4qJ&*2i8PoS!q8mx5K=Gjf3&RI5J&t_` zB7Ylc1Yn%eSTyfvp779*&Rwpo!DS${=8%rCQBss0}B~y z2wELwO&Gj}Sn*9?Y39myD=5ij756z@dB^460wzwhJ96(NwQqrRyqbg@M0TUnof9^z zaUyqCoro8jfX`d)G~V5|O*&YM!)($W^-LR5o~5+P(zuhn+Hol>$jH0b#!Z8wtkMm1 zoDN~wf^kSJ>FEGy9STnyF?q*fSkptyR(h~ixa6~-w$HO?olr?Co0D53nhmM9m#HA<&B9z>^8f2SuuzIuZaHt}w)?pE_@@1rbIClkX5z7I zod5AbAycc=zLY8q(z|;20}g3Accu3s7O#4nL9tic@s+Rw^}HRm+j4lVPQJYBEyTAO z9vo9OC%8W+`jgN#XD?N`p3KQ?;I=35WnV{aWi1aX509X=8F!OrqhnxZNny^FU@s9# ztQyGBR+qIqX>b$n#+ z5}Ti0S!^EXTPY?Q-SeH{j*>&#nLwKcbTk5P^NpwMwQL9ta@7i22a=bv3AkIfTe*qy z%+pLo48H9vBVbgX&Nslz5~LS+umbprAC@yIP;mcJz(Ye%V1OLJ2S=r<uv`&Ie|UyG%A=lx zhz>LIj~KEVg3e6ffo5iL8d^qmA$VCSx%Cn2Jmn4>v0@=E^`UVKvZ+$1Yr1kNt7imS z6JJ{CwcyMB{33+2Ou~B9tcG;w;AZ^Icbd|)hKT)=gS%1BJ=(I4Y17=Y`A+^o^QHn# zMfH@#JIC846Ip?aIo=DAQd4Am|*P!|@&!=eIA86HHglwmp@v-DK3ei7P}r5fRI zx__WMqC-#cz#<;zk~k;%yNAI!Pl{6c*P`frjA7anUJ` zR-gTw3P>|77bMAX-ZneONj763D(kxpLSEF_K(F^7xo_TRATlEi1OzQfv;tKK`#}$Q zV>p@=pB`k)sY=#%%nkY1H`DB~`yPW6<^^8&*WLbQ@ZPtTh)q8&VbXe(pbbB%)8vc& zl%qf|oir5Ptl1qy+IYz~3dcdZ-?vj^0}RcT385zr+fXbV+-XI5U%C=6W11^#?q&0*`=+9`6Tt z0!IAWyWb`YZ9GoGBUy(3a)=cepabG(Yo&J_)&B<;buYSf@sEr^whWB$Ds;d0yW92+ zPEuRL(sJn>Q1oxc);EgWswG6-mN(2or5M# zX`v<@f$XCpuj8}1h+upiHy<+jj#Z=jizVo3XgeYAfMwxhShbq(-lD8bw7p3MF=CH4D2HKh`#+&x#yl-gNV|eMx~Ld=~}nS4=&*$w(yk&|6!B7` zTW6Qrj1Pgm0Xt>AZ?1lN#wLU=l%dnk;uU4tP-kfU}1`PpB`+i~DxW~G~d2<1r< z8oYTpFq2`q3Fehez9EW=3RqQl!l>owU{}{mQ^?*!ptP{Yl;Nt-j9lB(V9`VrVV+N~ zgVoV6JjRTKvZ=^`iS7 zMEBe8W?wtvQtr&U>K(c(HG6WiA2T5epqdOc_)NST63oD5c999_-wk0#VT}mQeI(M4 z)Sp>pOIbjqf`DmCmWLoL)|%7+*d;-Q{Ak%mhrJ~+k5bZezYMw4$LJhIk&I@qXuRmU zd~8C?G&eknJ~ZSOa8Uj}DFI26+LIDT=Rv-*qsknyCkbhchB2V9nO=YvgFo61qnr{z z(M^b*Xn4;kty>H6hGQkVI!!+7hiPoV|PjuN}FAHA=g<-V$bJpQ;h$mFIark zDN*|-%=^ZmFOxO~I;ioY7xXS1Lwm<4dmWA@yAiG(s1+chI(Ib)M_#WPJ4R?P?~Qat z9h>$=8K&@Kp@#ui^jP_i#)&Dx&aqJ>|(Eb)aSZnD|Lse%-bpFQ$VT z1s9WyD4gJ*E{1_UN`#H5Zh9IPhtz0UmV{=IZn4CD?8Io_I|_00Zou$Z@D3^q)3FB3 z4U!D%!>_YQcOb}4fng-3i@)eadR1NlAOSDib*bUf)js{i24{^ zfWTb{wTBEEu46v%?CJCt%wuB!p5D1pbZ( zl=48VLCE_sn9KOc+#htz=Rwcu_=FoB|6A?~NnEymu&jTiXTc3Ktx5P70rL*R+LpEW z&wL;37EXEMBzG0IcJMGnwK5&Ud0jDcktgq%q^5@Wu=MJN`anjN{(!K&5Ms;lP8ExK z-;I?c`WL=t`0=tz78WnCLiM750^<}SU|<(`58H4c0Vj<|LDXQ+-8NHVkpyngn+Xv>MXBrpZ7jS*)8w8KgGh`WDtv(nDN(X z43!npXF;}*6wH=IhqYVXRfHOB$NkGz4Yg97X0ps+7j^TE>2#-JY1X(5_xBp=iZ!C{ zXV!iA(-%O#&n%7sMqEQz)37>UH%pG(*ODf5ZIjYcNY_;Ll{Jpl6ytkPpa{em*qXVT zUI_-A+8Jq{MsV%lbHNM=A3WEjppc~|)+Zo-J1pGlYh2R&_*&n($gqUlN%B1q8iV=@ zFyt?&6n#R~lO_6xWxSMckD>&F{0!(GzS?SxLlRo_MkP0ADcQP?4J!t*;+R7mpA_y1 zQn$((-MVX%Q(Mk$<|%G@qJrhEq2aMcajg0*i5pDA`HrjztYq$C_#bp1wo|67Y1qRRx}CvqqR}J$Dw7 z>CgGQv$wmm>HYZtk`IUq9M*nyumn=BXu`QD1t;TF*)=rM(PXnE6C8t7y=EKnrYhv? zpWHuGR_X2;DFi+;^We*me|_TPu1{GTQT5Ex;Wla^>qqk-TdU*=NSnauP4UbWfapYP z*oKIM27$oB$#jOdmw;?qo%T&{G!k%9oecP(F`*$mN?6c=a`q>c4&7>2_)ZZc?UM&)@Q- zvYIYY<}o4Mz{~Vtw-EhEeV~k+spb6LrhX20e|H-cn-A8r#Z5y?qIk`npL7sT`8kLS zD0_MCwpB6qH7Bg9w^W-#A=#Tyc*@FjScGMCB(}#KdtkGf1&nNP$|k#LM-cM}Yq?nv z+AAHbPG@Sa^Tu(sXK5A{y)dD@?~b7GC}(T#4n5A!d0HCdJJG+A{YiP)h7EHX*}zK* zO&=A|?2Tp}o|jEz8&)z@*(XGk0l~zZ`_--C|5Vk#Zqfg`9TYJR5oWK8trFsI$-{_H zC`PxZ?}#K(3lNNbMOsieF493c=A432F|pJAyMT=KsRhlNa{J>ylt|UVroAT9ldV|$ z>8l|hErb*;(>}2Q4rL;p;}vO#8zoE*1Q#M!s9`bdC&rCrx=?*oEa&~OfF=<{mBhmq z$GzJ_5>zboST3QS2J=(P5y@wSRJt^eIBRu5?ee0C6p5+9DQpE6On**+B(Utask! z{~#bb?=G~fxts+n065l-8fQK?ytX5xML3iNPIa+9- z70R?A?uV0lV?^Ttx=>GdY9)uV%>ZNr6@}6^goY@^>wd#2@<4(G7%E-?}q73$O-4C`BgyaZfOM zhHozGyAX$qrJb9qU^(ng$Dvobz;FW+k$6Z%VKNyPOGP5(B{AQ# z)yM3P&<-H*?~CSf&$;0CS1X$yg=H^X43svY+L~jr^VX%AVFn+CzM}Ngpl3@gMnE%_<1rv6yYE#rj%d%GCnKV=Xf=B z==qdXGGNJAKD?`q&zUZ#o^NGi!Av{8Vzb{bX}*tBv%9Ib@(yweey{gLMaGWIDS`X~ zMUgK^5|Y9SeNG}N4G*@`1045tEA3Jw4$8jO!KUxGY*vDLkC8>aS$>j z$RWY{Ak`K9J3={OFdmW&v=*?TDPgRyaI6QKuQLiK?#J*q53FbtP%hDbzZE0ICLW{D z%$E6$;V@XwdR5I@T;QRm;tW2Lr+w!Oz$M~M5YWwPsMIslvftHErQX3F_5ye-VjmqW zVr0VHQQc|u6nh1Z_*M&qW#0^DT26)7^joU*O2#3rL22ovn&!6#SjCWiU7MfOWFDPP zwdQ)Qt)E{lGfS)bhtRlrMzz#7*p)fLZH>O59HZXo|G}7jkp(l;mo*G+4=3N8; z*pB=07jkn0Pu0LB5yXash*7sxRcDR-F$6-&L{bKj&<3 zHJ10;i^A6Be2MNi%p;B1Zz#=dyPd!UaFSF%EH?5!9YpITM%vJ8cB(x<01+eUVF4ls zv0+<7SE9hoe9Ax&>vcd8l*&Y0{8bIO<%cG{a?lQ)48nZj`{7p`o!%`poJ}>+0=5YD zD`&g5B5a;Hn@m!)))s}6)1-gDq;x=^qvzYnXXNXFl5T^I{RT)eZ3xNZ==y`i`?~VjHe;fBiYg#RZW1!%MajqGg>p>b2rvW_PmvjKeO)z-H2OOts3lKvWda0tUc z>Q^%wHN7t9me9~$K_4PV7~cq+fz_g2p+HOXs-fmpKtxFc+s_CCCkpK#Sm;(OYS=kb9wfh-t%d0ix259C*Afd;Clq1S6ot~p&0yE*%; zhVfOdmvv#TwGSgcIx@Ekil`+H7R>O^o;g}x?)pYPejfofrrCaLr7oS(*(E+ebKgXS zfiqv^wy+0Bi9qeQCrhZu)FRTUp1YlLgRKlzO|^p{GU^wXkaCa!6NG$4Ao7t=k%{6) zkppt4t7}XV16>D*iSCQU=8mJ%&>Uy3LB+6YC<*@rnN9H@BE0>Lh z{wXKC51O=K6-?r9gX^qUFk#Il%}qQ9NOE$&yThK0Xmo@14VWwY>H`fxtJGMRfEOEouDHU0CR0RGs z!(Z^7mi|3Gbu)F<@cmW$zPWBtHRyZLx|Lbto7l+RgP8D}DXx)8!aZ$lMEFMedfIa( zeMm1Mk}_Nldt#D9wl2`wefM~5X=v1d`?1a#yNMpvm%ICWbiIg0*YhwMUGuI|fKGfq z-aA97H*yZh^_;q8Hu}}d?wRqWBCh-rT=vrf(TyIvqtQI)4m)1XalCvy#q?*@8dwVjXU*-^n_qe)Y7SdDx&;{IHwv^8F`5dUUnPaBbc2SKBrJv zz7H=>mz$St9IoF`(O^f=W1P_I_IP+U%mYO0xPIQ86>7g$b8!|v?-=&Oaoxg**}fL+VoEZcq7Oa>oYE^+oO*8ij`Fy8 zvdZh5oOHR(h)!{xKYebxaI5Nn*q*lCmZ8q@3eL@)$BHMrR6=V3s_h!?v@g1p?|)tK zN6g$6l7#rTbFn{W_3HT}fK;t=Tz3WOj-<*IJYm3fpbMS;y&Hhr8Lnq@6hkKp>&Axh zTv*Ft^1gM&y^Vhc&uLl-IaOCTS*oYk3lC`L2l_aKo=pyQniZX~cX!}*1UDmP{sm|R zumZp0vDoj|IM-IUp#Ksd7$;qTMEkTq(DxP>4GAqY2$MdD3AJ@oCRxM~4cad&VB&Jx zdER!L(OCVX44nAX|BQpo>%>E7fBdipss0+cL>C_)2vXeQMsu!m(qodnoX|&ko($>hNC!*w`S}K+EKoM(hs=s2KO9CU@ zrh;o(~i3nxNT0Io2UfBZV zT!R=g_U$d;jIfpS`IDNI0~ny7hygb#GHNjlwPV~Hl{wt`0N=P!uF%RS~I z6_3Tz0KSp9RvHcmr!J9!2DVzuOz4fSD|!{>v^tcg>=&{xEqe=RwHx3*&t6KX7;v3ljjm}A{rka6y%&0e3R($eIS2=WTnfx2i2J>hZ{EsRl; z9jR4>wE+)qIkNSSMOpg~s2acN?$#ns>FgN_oW1>~74x8X8Ka}PtQ9)`o4+&c=qGz? znwIBOz^1?igfii#+%t1j+s_tAI&aOxc-)>Beyt?l1dK@YaQx?HfY-|>c&v=Dm6M({ zvnX)a`huS_#dRZ#be50dyXaU_+AB<)sFrf>Ujnc;(DTdjZFwLe>y4Ai0oAjYz=Nh4 z!dV_B9d1=)L&OBD=ohitIwwvAhcXDuCP4B_Xd~H7#|E~<3czss2=0fma^pC&i<8$U zAjwcAJ5CTAm;P@2Sf!ENWumWL6gr^cs6z$tT)t9AQMJz}rb+k_Bp(b;Til_98hdq^ zx)<>f;?*mtLMCdsjY!K`N~Xb5=2bdwEH~1SS&SNcIh?o&QGP+&sT|HdLe~YZ^*#@a zmVJ);Y`*FyHj>UbxoU5jiG4Wwp7P<>Vk~fLK(wZOiF}d4N;Og{BS}FF1h(BdIUMa! zJ6OUWyC$`*)u~06U!yWTAQ@P+rwI4 zLIh(sQU>%GF!@{+&9Z1JWlZ@soj6GaH4!vI(ffiJvu9X0W0Mv%UmSfvNJT3zEmY#0 zvrad=g1^yMX2GJsLAFRfk~}E}NhFm-dxRC?Ob_)!a-p*rAA(vJ*2j1T5?1<&pD6{H zgA!e~c=E{cKrizOHP|+Ig^jxV$<3|&i`cS>RUB@Gm>9CUG*J%rkG0a|zs-alPSms# zCnc0bdML~!YZ)!lti>Z$JU{x!))l+6zywXfw$vwV46;7mrdKw zz_$VItuYoZ4!WT-&s25TAe8a6z+Rb#im224Uu!$ciWkKDbCD?;1>p;t+xwU(Uc*BV zO4Fw;%IMCv#BURT@>N*N9peY|vLn0u&_2y!lkN;ZVOw)bPTrG|hw-#oQ!rl|S0eic zgvC`h%Rqk$uW=^e#^#EU5%hT3LzC+!B-85y9kN-J_F>v(#w*WH3-B@ztS}=NBDOmv zYU=D+it7Z&Qf>-47sP0ST+2`>xqOIac#IU!31~K78_&G+qmi8Qo5EddZBeSWYikw( zdKO(nHi0>k(3LT@{9C!TNx##!_;tI-;|W;#C4-`NjQ36Axgc zi8IYo7RNwvlQmiy?MmesF9Xb7DhvV5QT2_81wo=sbNjS$BTxSPY=*X|83Bp~oRgzA zo|^Q_K)Yb^ktbi{F|?`-qHzsrUft!@a-_ev+{Lc&@KvM*p4AwUA&(RaH#$md?fl<_ z=!$t`I|29+h(7D#><^tuG9H4oVn;Dcj3GJ3sKuMOe%G z_)+`#4AB`SiR$PF$OIGc1c&XvzrZ*Bf;`s{pz-oVm*{m&&qczC>H|*F zWpe1scJ-;BA$jlzodo*aV}{wYf54mC5_PVZcZf*>T?8CFn%z)!iY57qXIz>)^4{X* zQrZ7Saz){_o~0}3l|qU^^e7o$0=tW_0MI%tmt(QNOqnHKYtOfBgHSs2Y`Qq!j`tr@ zD=V##rzgw-KA#Ts^4tEiw?#xv8=nZXqYk203u!dl7brOdO&g=ARAk$ll9y%)DtwKX-^# zeNX=DJbwbh&D7lZzK`^Db+ArZsl#g&eSdLW(hfg`5|a4{ENIJz1drKsAw4Y8Q4kxc z+`}SDAgCdiO+*bs9IrjTz=05eC*PJhJ|1pRgW}aYKH_)V>Q{RvDP|%0i!XPER6$3YMA^)`17seuO+-=aYh(+N2DyhQIr75XWU@TGO z;8l*mRwGaN%aq6_!i&RVauHL>Ci^ZS2Ks&w6ms#$qe3+OiaNXN8P|QAX0pdnJjL)* zwirYcK4myag`4Dz zczpeG--yK0;4@bZR@E)IjQS&S@!T)K|5iQvw!ddQVgUdU#RCA){6EFd|4==enmC%+ z8kzjlJ#O>(xoxs0{(dU)ceHAhD;zboUT-%Z9$8CCEICo<5|?JKrYccDHmu1P{i}k? zw01Y)9bb=MlD4J*hy{@L;MdPzSnXQTB=qT-Fkrx#fcNeyN8jD-`_?EvcRHF!oOXAD zsh@ZqR)0c1ui|Z}`SS3YY;AtLg@IKH3r_z%_l(vT5sW5fb(}^lE(p@(re zp|!3;LBObLJK0xQAks6The>OVme2HpChvh2Jb9c0`it1Y@@U&WaOW|FvkDzxgG+7# z-X~B7mWKoqzJTHig~D%eqyCZ+T>z# zDGglDyQM|&W-|qu9N>VrV1@($${_J%e6v3-Caji>FDv!~##b*U^cK9^H!j=9KhDRM zx9fu*tILDSz%C5E`zQSSy7t$JGc?if^YXW0aT4$A7g*rp_uX;{KW^QA2<*0o77PGL zKUS8GEa<0g5G?f+eYLy)I1`SmGpBBHKUfE52bNUcn(<0s34}y18CI{+?R)-R%blAC zTN{QHzifLoXq=?w6$^{oM6I-NeDCYyz*$(orbbL{&>{DaLU;e$*Mak0&F&=-+8pC$ z@2#Hf+S~Q{a7fMwQ^3^l-qTe9oo3q?fWPSXBV=OY7bmzbpe{NtYtKb4{GHhEtPjC~ z^HaVMf8N9Uo#WPToE13)sQT^G_BnQ5rOFhNz^J*qFV97GwTDCq`_9*6N`zxMq5m>z)?~*czxv-q-rGJAX8`w(LjY{PVIgeU~-x zF&}^yz^YQ&4iOwY-Qf%wjBJ1-aTcG9BDb9-3^yS@LO76 z2%yiAn4B5$-XXbIw%@;=7=!Vr><@*lrzwZTy})?Cp%Q;WJ#W+n5O|*67@wu#Ay#ur zHws_XdcZ4qqZv3~x7u;<+;B+4LLL;$7$y~TLGzRIAY(Ra;`mVn|@AX zj=|WE$Ixp9Du+ROb~+yA-`Ukidc&XR7hgA@Nk4oHrrQS5+f!((o~;c;H0I;n$(HytWiQ#i6`Jr>M}e1W$l zat5mLnGC0XttPiUqF*tD=l3}>Sm?adTn|dGsed3FN4%4LIUi}%JX*D8xy7jH50v5t zLH>C={376q@Z2_ofph%-m273^!?j9hGWu9CeqQ{$G;x?*_pRLTxJHiEvDBVz4}ta; zezLuf9v90%psAw;KRXXz;f&m}-ZNxkF?d zRqNMyngVOz9OihHnm|?5m&jo!=;r1Q`AlWk`k$TjH2?)Io#m=NI#9<&?IK5|WLD3XPnU}fT6!M3GwEA|t@r=s?dS{DA{d?S)=auk+CaL^^1@hF!;0OEC-H_v7$EpE@((3y%;K^_uZscSHH8x+ zV4CUi{rQ5Y23Rt_?i&=HyZOPSSzM0=En3d^nOp}YhXY`~TazP~;{%i==&~LSupYW2 zL#jA?-q@Ia>j%^irY^)2k=+vn4P(@kHpr_(UKy~pYfMU2%t34G=-bJ4qPJH9&gStD z1nr1&XEbl_gd94Qc8YzTw7sy&OIR8+X91k4?QKx2&A2{vj-iR&vj8Z$`Ae6&hWkDN zodzg4lfxU5Oa#QAL!RB}A6M7pz|pDYz*t73c8-q1YFeLu%F#!Pu%mz3S7Fw=4_;k- zb%!>`2C6$QXv5K^f^x5f*9?X{_D53!w*H7-84yr$&Bt*7i|kJC%V|Kj4xQ|ZTnZ^M=!9Kjg3eqZvYJ?$2>!vW=ue_ zh#)z6$d5o%d0>CCu9Co%R${VKd0r7p#j8AC+7h7HpV_=483S+=3qW0e9Tluua~Zt>i?zeodEXq{*-pOId@&8!!xZfK%e%KQ28|-65wq!$1sz)}(ZEhUPUYm}okTmXl~v z%%ISYHF8@crsx|UtDQd;XAdGxm;{Kgto2L!FA`;(2d=hs>YokzM??@BPb`7R?TAK8 zo+Wd9Gy_UJ^z;dCLA^D`n04ld^X)i*u!W7wyz!R7z4Q6*!Dxf6J z6-2lWFZtG#hQ(|kbtX)5@8MVH7l~&==}ZSP5P>6{$Jv7jjTbJ8vabP-*6|`XvcfJp zQc2x1sMSRk7tJSER)S+NnhTal&=3M3GJR5>l*Qz-isYH4f%zz8G*-k++!)Ls@%a&J z`UNJr5|f+As`?~WK1zq#jON0mQ^{u z61O-(T^$onkY+7wvBjyaP>Cu)SjSQ(Nx_`lZl>R=MMk59P~7Nf_BIXL84lF{Y-iiQ zz(8AL^}Nl&F9oNQ#7Oy^|50ZjJ?2s6@R)?BVJM4=Kob~}fKh z@6lMncpw(B4cZ6}2u21tJ?f*=v~Lv#9rliQiL$Dw+>0y;D-c2jir#jzGcG&c1^J{` z7Ja-}Yjvrj455jedjzZPE&Z zhkEYKaV%_02gE^d;?xlLi+-9aXqk0a>i1;9#L?ZVgJMI9kGn?pxyzU1kTvU23E;eOfb)? z+JgsVab2d_S(6vMLe(W*S5-}pTUy4XVX>kkQt5#(Y}7MIYUrG-N2y@tPT8+*OLK-b zz2&?dD_(Qr-A%Mf`anYATf`$?^1iB6__d%TMR=lXVi#NU@ZTcbZ>yOB=tQj^?q&u% zc~sRXqta!bP*~y|M)4DteXPuxyYg;oab2`O_Ht92O`hm=_UCzUZpr51#P(J5o?D4Q zV#f~(B6R6?hO8SM=(R*&iRL98Bpct|vI3!ycyP(oEpxeKqj}7jEIeY~S9XaqX6(3p zS7ieH&G>>4&LlNmg03}1oHEm(mWFeO{ywLNW4gI>_pb20doyVV=GJLi^2(;woma@I zQEo_+L$9&DFS-2g#=U@Kjk}VVeNx*Pudj_0inICS`m6?yHPyTW{bK(bl0QvnIbobp zk%EEz8g1{gbPis%A@3?wXsNNrYmWMv(wc!%1{}i%pZQVMCyf=$Fh7U!#Kzvs2)5e2 zj$c&V5?%kvncEbD>Yn`~bR+e?&uCO?Np6J?jd_`FBm_F3jzmFaIcx5$x+)e!9bdH- zX)%h^ppda!DD)CXr-C#EJ~k2bowh6%d(c;HvXfA8;XNK!_Ht0p z%G!*ci;owxQMpcc-L%xKy6ylD_G!F^-5}?ks(wcO#Qm5U)~$$ZtC><)`1fATTF6I( z%*Z9Za!-dEOjRVAr-$zzknz0@ZwQ=#@#m9>&@FaVAip8_Z}T^{y9OgHFEeq^F83?^ z9@=)TU#~yWlbe8hJ+L#Ku8DR|oPK1=%S_NhUr*ihrxz6DC4D6t^h{feC9R*y$!g_4 zUDWtZS*D7qH29`eN<}g55S8e*DAn{Dix)lR8y%ig*^&35=?B($(OQkaM)7)MP9-Op z>b95-I5lTIQSUb0M?uy)B1?9gF)p}V5JX8VTWgjoeHfl9M-aCDQO-b8G&X>oWP)Yx z!?c{P>6TK-G^nVbsxrk+6LH>TkkCfQL4g*rZ~DzbxTa%=RL`2v4QxjNy0fyVt=e=w znuE>a!5rGv-&hn&w;Ojry{6`2g+mF*M;ogX`~1_q4tb|`NzxVq!S3et zP)_v4G9L%&v3f+1mY_9~(g6PxD`Nh*B`|(F>L=XV>v_|rxJ7Nn!#v7cjmJ$oQfX1? zTPj#Am|Ecs*3TF?lEwR`=rkljq^X-t4jOX((*hFDZY2w^`f^=b;gnqt>wjQ|m7|d$ zTKPqB5lfgk(4q>w_kW^yoEU#J*c{??hnyxBO_W|sw0Kz0II1yC@eIV}D5B;>cI-0- zT}jr&QMx!0+e}T;qGmhn*LLQZr>->-_|B{t5SESaF;a@?gIbHc$V5qCDnE>y>n;N~*G`W6l+!SnJVgz);g>YWCbveT!<-f~$-0ORS%WhF;O z)MC~OjY`9|kd?BH93~nyrE_MD@1&Wkd6E@lOa0gw-KmY_Buip8`_)FVQlc4ivt9y; zEPI|&ifr(=kJ!cf!vkd}4`CzaUz)t;tpa?IS-(DDvQ}DK|CZtMC^kG>S2!NiX<~TN%CG7cm0|%&p1^-NhTY`!jM6nJg$Q`b-QyC@wwG&?IW=5+C%m%Ng-Z*RPbIs9 zabgZ{#*qgx`FnpX-~7Q{Pgr%yPI7y4ncjK8juo?jgX+HR>C5m zh;WpP#PXS!5A)O1VnS6ii{PY{rei+<@C4y;r(_0^IuqPllG*c#OceJq0IoTiRBCnp z+MU{Yzy`RBf1Ty~eC!Q&;6?Kv+bd9$oq>{w87@B9ol(XRL1uFvy+V) zqZS9QFpe0vG5bI;v7}Zt!U)tYaPyX#1p%TYwyvn-(Da}EC9e>LSJIqme)#DQC5H|Q z^8Neb+`X&|RQ<_Q&bGlc9$y_A(@>z=pu%dJ{uLixcbJ$mlqGD- zppcB@uE06GzcJ5|ea8>}Q-q#!WEO@mKue44X&9_77PO&DmLO1;MZ>mjW!ScD+qP}njttwjZQHi(&KlOBd-W&0J9`KFfO^HErO*$Z z*OujsSplhP_(7GO|3u^Hi%~;q+af6>3&<7TDw9WJW^QiC3lNo*9Z+cFI3O;ysxKas zxi2Z1L+=Ij^Z81*BGXxf%t|)IZg_BYMIr>pX$Fv$ZBMhRH!nm>ZQth~>pj8q`#?%$%0aMZQKsMRmtH^+)mpyn2Mos6KVlay<9uv?mcR#?oz8X60^GN*LRTm% zB*h0yd;w62gavB6si5!hf1HS)qY+Q?mF`M&|BkE=UoW|>)9(Zcs))3yMaS3Zg^^mc zyxxak?v#09&fx%`MV()`qFwrsOpM0K2SjRY(S$BR4T=3~Xi3hGnSc>)mR2afi~xm} zLZd@$T|g$4)o+M^TUL0=$(BDl#lOE4OOR>k1;uNecD`f(kkj!s3gPxSa32Xr6>&tn znu5A&e+wtg?+`s&VA7fh0YhzQ)H1HcuQx5s_#1$H6?^A4gVjDu5QYfL5TFSMhq4Jj zP<|~NL@}%`lFFG-Cd`vUNNogbAcrOtwP?Fn*o91JAV52xF*j+&CXL2D5H~We)9py= z=B6Z-xJXF7(WFo4txG8FijttEPlW;qit(q1+_1oWZa~U#fqMp`1FVRaMLUG5C1Njn z=hbJ{j%D_Iq)NRsqlafcO?$0af`Tm_R^ZU*&;LJeE)6VM|Jr}ACylIhAlPSn< zyHE4sk8ggnsOC9Xvh%Fw4w;?xOtpXGNmLTq2`3SF(*95;T~;)%Sl2-9=*NbLX* zYT38q?n{)VP480ccR|~=*YuYDL8AGoaGc3uk%hIWvh^9&-(=NbkLq%pdcmZPO!8xv zTy6`zVi9uaqg6d7jcR2;HwV7VVcik@1w z^X0}d(2?nG6oaFOuuRJaLsHots?^>td7*3y1d~!SS0>Z1E>8Yxs#UIJpeARQG_Ra- zFEn%VaN-H#* zwFWtUVb*`Fa0A~n(f#u;C58%fyG7wd>Zg+!*x2?e0FreyNjtVLxW%36Q)`tL=V`W)H*J*S9A+T0apJiGL ze02-2C{cJm8Csl~ua)>`SLk^kYNwwbf~XtADuWa|KGvXs*VdxXi>gkP+g=yN+uat7lsDU9aXZO0gw)vsH}(Dw)w+T;7}ZJ2 ziGwdc#W9v*#IabZeQ9%ILr&ADGA1S=IE0nMq~1Z2eiH||_-;D&j)YI#>PJqO@j)Vb z{_%EJ4MiZ;Nc60%w>*4Zk_b}|%5kWp$#qHcw{Pc;^OD!3N&V1b=>1Mv=zU%5>FC{Q zNP`}qq+D|@?{Y{ZX;<4<+{IUqv)fbk?$we)AJ(lQt9>r5wK5nrx*Y%2Q+0nTPQS zO|DPHKlrB)SDj!8_LEMAD?05N+ElEg%(KKV1tfO1J0mBvFf5uHD_ArU-7vQ=_z?l@Di3M4-`C0mHHIf; zaszHv4KruX6$V2>ie#KNO1Rz=B$x_$lmbxeq;27U;s3XLM%z}N_J#rgV50^AK>7c3 z&#WzM|6`qXb8otCvM1htK(WI&9to!=O=Y2)sivj~H^v?%9Q_-XJ*xWynV2qLl=?3| z*y%IlJ$5xaoo0~<+j9qmauM2*U)IRym)olv6_5ANC_$G+*Jz>=Pw*|4 zcw(9!!(0#1n4vvk-a?t>$Z2i&N{(n;py5L zTev*9TT*Kuvk2@rbomJmoON79nNYXOgosnIK=byj3(xC!hXTGx=A02 z_{>%VDNc$|E`34L#GW;Jj^)r1`9KtP@)<}w&Z_~G6$wk4wn&8}2Az5Ilx?&l=LWCQ zw1aZA9F8Eog-e~j@*%4DNN5QtzVvt0C_90P zk=<52>_M8qhmCPUq9d_{c8(N!`xt241OaFgj61W)RYC8qz(_6ut*?bGD#BrpPy$#6 z1t?k`ngawXuRdhZRGgOs+Xe^+RZC*q=YNcM_f0%U90)tbg3JC{HyU|_u{j5=e6Z16`Km&`srhMXzHlo6||6R!t5 z`U7~#GCJNDLl&HO%$j`|P^g959H`1G>PSjDo?lpGaho-X60?W2yE0CQBp?O@VJ_%g z{w&6yq5HZQ-LTK*E(hmGqY~A|%|bO^Z;i71ochc}<87|S_K{nYeEHiXo3=-_^_xC+ zxzn&-!S;}THfFP*?L=>$KaH;DjB;x&{yG#sZMD5u-{dUTe|;5 zo|$Lj(XNwzUM*CN-^bn+jS+Ae5nb&&=zoE~m7&$yR*F|a=TpREr>E%cfIIvZn`kbLKu;+Ld%IGHX26%68fG=@1cm3tA{T@L ztZ^ZCIGaZZW?oYPrVJVKmZtm;*ki23i4aR9R@cHuDy zKZt3tIZhBWv|@`#5WCpxd4NI2!>WAep=M z+v8~u$WWPj1SF!-MxdZ{iH$wJ1Q51>D#Aa&e}BZ(nALk?6P$R=%^q69HcxBOvx({cp>-E&izUc&-Eq0a&Op z$Z`w>y;QWtaz5_+fN=+FnRX{I_DGTvr$k$Ej|4-Nny^HU_C1_^gp#;uTK_*!x^F+| zS}PR<>&_)1)oI$KIqm4+AW%7ZS>eN`Ab-j%QBhChl@ckrY0-W5kt9|I8Fv2gLFb?e0 zWp^mA_qt#p5_(-}dd^H~N$qo(a*Ck2hHz^H``{GLOZJ>Fh8>MC5Bic4VRm?KlC#T@ z_WI*X9HQKGuykszQHXQG{tEZW$@D;yVWeoPD>DAm;`y+{rsk*NW|n{vWI6FQdUy=l zl?eoTU6@;c=J`w|tg9DHmFWt*YF&TS1)mmxrJ4f(BU4~UZj7eC3*5;%A?6%d}<5#^(`c%+5ao!Ky%)a~-Us!I9cEz2FKh>_2< zpy#e>8%*s~z7^|Gw#mat3ossJOnov4G<}WID}hQ2C&n1zNSA_kBCs4TZ;q0Zh7Q zp#Wk6Srm@P#kq>q$2Jy*&^+LvS*6)OCTli%w=ih46>g_AF8_oICP9#8Y89c`5=1)u z^Ea5kB{kh4ae21RX_eSzmKbJBYEeUY$mV?CusH6@A-=6L*0gDH5c>28|HdRSu>y^= zxs&sy7AAy8U>FJo1i8k!L&OJukn=eo6?kbU7fs29IT;DL-B^?nF0|h60a4XJnhQ~- zL_9XXx>*L2R+CDofJwo{dZel_zyXD;maUK7fLrcYFM(ES?cY#R+mMbr=lKnr`lMvW zjU95pxOQAkMRHi7>2w=68`Bh@YKwgHybSzueT)NiO6I)sjwIia8z5P3w(Tt(j_F!; zHS}0jIiCVd|;{>kii0kuk86zk*Gb&k`RH0g*&qg7WYTy5O2LfzR(EHqi30|392IMI{@d#t1Nu@2 zlYO1v6j(mJ9wk~;p%JxG;Co8;d4s25ZuKG#oX3N_t z(ctz&P9+KMYc=P}AOB9ooF1WmRU(}yF}*4qr9l#uTH}XYy&+bfx2uG!KCry>^bl~` zCStYfGFYi$6&xZ{fRa`Zx#jUj4YMdv>5#TOP;ULt=%&a>Y0gOHwFaHx<9V*&6_*N48OQN_O{ZLYy!F!P4F(*{8H`B^)a0 z4u(qLk~MXVyG8bzzoZPeil}Jd(p@MUX3R^&F&X&bbq17t9r;d3LsXm*C6k6^h7tt(} zBV`(bsvWQVnCIu10P1PbJ?T<(2DeFK5FoKaM;9)Q=CNx(K$>p0TbIz}8K0v7tadv~ zzD=~H(LKQweYN*3Br>Hhvb3{c2W!ZM{usq0!_^>bv@w?7&0G;o%}U}J=2eKc5>EgM z(6YZiBCpE(ULtdNLPgesX8r`);nsFbOh(=Fu3bET6O+veXHRYx3ymKzwaQF*?;+S^ zE)1?wRp=qyiDFeyBY4$l+qB>*6tn)quSSfj5iS^xxWnv4Fm<0DhZc|AlnG$A6utgF z73~CDnxw$_hA``=oM@{zk||k(?MkzZ$;|Kv1+y7*A`Y4xtf?+p%2Zm(NvxnZS?`4n zgg;>3R*AtYrF(W#s)ot`sO+;>t}-qro6{*2)dbUJ=>%N?M&9LrDBvAvv@R#Mgz4JJ zQXbyXG$x9QZT9#pOMYXycT5Qv6-WjcN{QET`2koxN+fTJtQ98bEn;2@<~kA_iZh&{ z@gRsqP=H$GE%ma;jU&8*%PrwFeUzU;!zqwGbS@{O=(?g0kMq79?F;+d|AGKv>14{( zwSmwByQV;D_fQvoA8VaeR{M(`_XjDfM%4oz?X|9+d9OU@RC2JdMLWPZ(7-I`dS7t- zuYRTf2|Dwn!0nCtt9Nq3lddya``)%)!7y0H3qI&);y$@4y`p~;px8swRUBPf|29Ev z=%#FX@~JMoaR!k#BBha`SQFYtZ1)B93TXrRLvdJZFOr$x&dfzRv9;+Z=7oyRY=PFwqsE~53LN32P|lD?fm5DkCJug$)MbYx z%;hCM+(Aw(e1siy2jz6wnMsB{s;K|*`RoX?=}qP0O|RwOkZfdz=rkJU(7P$l`cp0H zI6a{O%p$LT-P^R$7DA$CXWtt}&5xF3l{+UlkFMgs2u;=vm2jB#K`NpO8=NWIVt8ll z`ULj6#Vj@^{a_lRD~AFous)8?T3KZ(dfN0T8)$K`p|Pkyv*V4O%$mHF zVMG-?hQW2XwR7{1IWd+$#V9pA#Pn4_(6O{dKIfLV1Q20rFwl5$Twab=&Eu;_bZ{&G z$jK{eDOf7s)&)q*YsUDak+1zTPO2d$2Iyb6EPPz7qQ4A$PE5gR+o_Akumuxl~i*m-v;&*N61uePjdZN zHc{G+?46tLTLmg`SDXfmwh7GnulFYyl@IQo7g0? zd&h*Bmifdl9X&rnx&$)4#X7^xS(pI7-a_#8*R;T_ZCo}=Tv>WnlRGbdon-1Q-u5+I zS!z#w;73=h9-Db3e$7vvm(VDz+)c}h>o5*6J>^Q88&cy z=!^R%KXa!FKd?<0jWSGId$XMIDFXi14QPVw$dv!mWl*N5*YC#F^|fyevQmlnNW9)B z2H*R<5m5RN^3AZ9i@}gZO4?CgRSLANDXWOf^*EhJmn`i&YRKBN1moGVH>H)|ZGMrN z2D<7;I7k?2&h@G~#rG46DaG$N`gRfwMi)jbo4UkWa;p%FV&^~8y;R5ky=9%-#OHI% z1?lBpbQ#$`u#zqID*_9$dSU3P|9Tow@IA^~LPCCI$Rr1##BDq-eeZFQC7M((+i3sm zkWx(m+nzG-J%8l|%5Tr?XMo13&5 z{}PEW04xwd=`sQ$IcYY+UzS{)QcD`}g1BHIX!et?!I1}=CYwjb_w+}ftXp~i<2|c? zB{C9(Ty%ez&Jt8f-)$e4f9mKio=?ks*ybCqQ&I0tMf$Bv+pbPI|7+*vBBqY>$PGz z$jvpys(rXzf~mf1C)Kx*W;nJd{V(cUS8x6Ptb$Jd^X<1)O;Uf;zM1CDtS0(b23*wZ z==fKSOh{#ICk7qTxyjYiZaN-CYj}wqjKRvcxO!P4Z4_yKy1cxZ*x?y*u>t%xhI;^; zYIU3FChGcowh#aY=jD6{-ouYwFtw#-c#Cx>XVf!gSjB{}t_KM@*`zU7b{(s$l}%di zH=51T$$7fWTrFm>F(u!o->tGz1|B?nCLcAuUq?+_G%G#=IYPSrSbPJSA7Hdq7-?KL zNqheqkLz^GwAWNcY&>of>vSoqx}4QT^S-rfTHIEUS>c&-QMOw0%g72J<-NZKiEL3` z`9D9$-DVm-?;gHS(P?FN=S{kwa((GY!ax1IKeAFrZ<9h1Heq9-V{sqV?>s=vTHF`N zQXSW5a)12Tefj2@s$X;iH=Cm{Z;oXTg#jxnrkuV-kU2`~4xD(%>TVDzg9(@$8qW)!eA64f4Zj$4G>M#MFN=j_ z5!ooTH^91erQE<;87s-2ORheweenIae%f`;je!9O0N@S;0D%3!=%+RY7PkKc(-?(r z+d%?^9goN)@_0>hrz+>mZ16J5D0z8toAAA=m1g(Xz!;0{@>YP??=A4NA5&aGm0M1q zo&3WQs>_d$i^|Y5*tJdkZI`bMudP1hrwwx!L4adxy)!2#1ElwFJxha*{-%P(KAxsa zU#h5_YM$3Z#5^!!c`e}UFlFzvy5?5rm*jq7g4A&E;BZg&0h9uPi@!5!f9igc3rjaB z&LeFDzX4wmFe(oZyBrlH0P znYHRTUUL{{#^i-m4K#Cx`ZF@NGelUWZ&b=&%3)1WW(`g#XJytt|}cY%FXoOg;XiLt|Sx zZL&Ue`hiYeI*Y3nBx={JN*0u+@k1jOixnrN7?sAWyfAd)Jo&QVrh&suEoAZ*F$UyebRWn$;oua1he z?J`pf;>aO<9kq*eM8<>tsuyJxo2EG}Ys~8(U28cu#8E=amqPlA$_%$Vlf*CYw@GYteU==bjon1ty%HZz!zB4B(x1_t;#PnQ80<|)1hEB`M z_qjhDFA_vr09(^ts$kIg$8(H!%YQ>OY0q3onOAPd_fmZ#$l_Qq_g{JpHj-4*>9w5 zOwRAg>?Y>FJb1V;;OOR!`bz^snsoONwO)9>I$QcHQQE7QOEX(Q<@mBrJ%Vpf_M&%p zJqZ+2>g^|j@Hw8D$xP51)>J*1SJfX~PZF9zutp~$0_+VqNZYKU&WT3T=O5lZwT5-w6!z$_RXipa?{g7*eZmb>&zysRn)G@)HL8@vwVlnL?XqgJPA zt?IG9N-ERX-W%tk*QF(A0+A3&25`V1lL`{U2WVstj1|cVBCmP`9)g)sxszBsKnlg& zd8~nqxteK&2Vgg7&hd#8=@jyvI|@kqIYvlQ2ix^P{ls*Qo)zIuMx`oKMR8@XYOtWH zZynZCy)PH%9}up{yaJ~c%xN$%Z;uJxsKZ1wJ`$z%_#>{%iJ(i+`{ zEen8;iMe(4TCT$>q9HC#A^7Ojlz@hS*6i%>_u;VCoT?|d1BQW-km*%2{=b^qNvJLF zXW4C2mI91IP0mCAxf%Xo8UT8$e(4?rv2$n-8Xw|EFy6IcpK~KZ8R;QdjA$;e1M)m; zDifr;vj6A#!SXD_zHT#hi^1%Bd`KGP96U0jrmqpMYUZC@uv|DX)diU3j>5eMFVcMg zA42`+a6qAcmpb}+NAFCs-u}u*cx>2W40fn|$6y#~DE+{{qF_vI0}`tC*N?d=(~*Ue zdP68O4^(I#kvs@VGLS$zY|Vqjk`L5?bvk5QrE+t~)9Y5Iw}qpP{ZzczOmZ}`>hls;z|{hcMjZ7wQ$%l!$=QOKX>aJII#0BI!t2~H}5^7I4O z+S4o4bJn3hE@_I%Y_qb`W;Iv+FF5%P650aV$-O;7N}RC=fr( z)~vo>KPLxYG7kq|n|l9Xx^MR}gv>pvY1z90@JF&Q2XQd)9Bm9L1u(G^a+$&#yx{O` z=VA^mvZrNo49yXol~{qNW#R%(q4!9BELdJ~_hjQ0$q1>42;{tQN@E^Y-Qt5X10dL< zc`*HM)ci9c%df}Krz@8sXca80eLV^2Y*P1i?*xrRehF!!C~qFBxGe zF(au}?Io|$i_Ke|ec6bV`DRBSwu01QYzp?@{tK==V-PHlHl!%xVdxWucH|GpsfK@B zZ5BiOFQJ44f-*Zc0_PmSXrcBKclK2&Ndgx%_7co942;SaH=fW|!pqsiohzokn}x;! z#TBUwOg08UEl?-{8*lj^>C-6oHsFl{4iGRLt1=vnqXzztwEK!9ZYQu%$vg$jVp6!Vz}S=aJt6zlpRG&^QI5*-9`v=W6gJhaQnzi z77Sf$yY@<_=hGYu6Lu=UYR7;#mecDRxnhjOK>iLm z02`iKc}1&5xf3d{G*{P5WiH|zDp0>R3H}YT+ZiFCxXU?2JnJ3@Af#<~SdLIGbnh%Ve`GT)jzs((Scjvq#hXH`j{vwhV_ zpHz5GqSafL+qj`5Er4>?#8VzXq28JKO^|9s1qx4xp@ecITF!gMdh{D z6hcccZS$nDcU#sG(PcB&ZQY*PLv}KoYai3BwSeM(J58&|5>VNWuY@ z{*F}$dwPw6P=qQiJuT>G=5N(&QB>fK^QUtNCPDs7ifLtATm^-1%1-J~rlP4avZZ11 z6z|5yy}m+=U}q_8;_kJfVu6H|xoH!H1n4%=4HIu;qN!Kfkn{YKAa_AGT$8VFeRFvj zdzbY+RY&z~H{NAcgK|`9BI z(_}N?em_jDR)u3`y?NFlGA6m1>3pzu7|>p(%A5amVJP@t;M3x2smZVyKe{;R0FCrU zG+RN_z{MOX+e+kij_u6hNc)63WMq}Ti_+74;}wL5UnUp=!%YqF)8moYK6~N3BMdmk zwt^Xrv+lYpVB)xXYoVbq7V%fCxtLrFQODNf+4^NwOf5Nc9jiQy?yDZpfAsgIWn3Sr z478782hph*zS{a1Cq!c)c4ebYjIgYB;~E1bftn6dc}$(vls|1wXQIk8>H!WI5W;Vb z|2!$YWWc8N;AN{xDV#zD7)R;f{Lgm$yLAf?>XogAk$wwpzO$uiZxvw6Oh-MoZb5H_OD_5eQO(r3$PdTEC< zYPwk0R7F_j?>r@!PU7ob%mrW;`2sD77fg3zXY8jUN?I8FqqPX39yW8B--yvK(Te)9Qybk&xax8+$W>pBQ0L{<7t#9rdv9&S5BeWt>`Ux z*U?3rHR^}1^LX3OTihbss`fkG8HF;GW_v}h+{+aKbfY#0wLxK~-;;-0#6TJ{r-Ohv zBV%8}kgNuj(M{i`I!Dy6=B&JJP4B~*!WCbk@f|cwe$_gWU}u4TO?uHQMz_Zgqo{$J z+SIo^1+f!M3*0%uP%k#WGchDTDWDx52eN*x^0#S=UOTHvpKzhe(_h|^eu4wm{xV<?z@?0PR*QCui)MMUT5-8f&Q7Vxu)Fo? zzf^@L-%)d4o?gl|5ackRpmdLiK@_K%oD22Pwwo1qIuP=;L#rWT z#QZ+pV^cBST1@nZIVGTp6Mt?+Ya*N{$>wwZLX5F3Uz`Th+YX!_Q*R2OunxJ(nM;vh zl1Xrz3hgeO8waV5xYHIBoR`eZp5ydKP7Xn8x;iCl+q8}5<$N??Hlk`^Ds0~l^=ELw zS!+Nze?)P&H^=5Au+0y{aovQeSdZL^+)`R~UO23}D|3c#$!_^$xss*IE&Do=$$WS_ z*K8a|hhuTgW;bTCneXpchXxC6?6*mj(d{VjuCw+$EloLG_~wt-?dvPMVvIP7>obd8 z1ssA&r`o!>fCgoZZkV~MQI}VGR)&m~&>zFg!f#0s#hNXJB6Ck>?mPN-V*GaQk;UGE zMqlVn(M_)(m5{-p`$##jE(e>ax`7cjdyPpUFW;~Nc|d^mK3-~D_!%6 zzBq7y=6=JV?vrD$%XGWtWc8o@0RQ_}C1nWr22KnBkZ|~a6T)olJT0uP4QLFUod12T zu6eE<|3!R$A5o$&Y$Ycs99?}UF7G*763tf|yc4t6wORkg@WoF=iC9QdhWvBMN+G>wL@8p6eI)kBF7GOOY-}hnTF&3g4l|s`^5KV&)F!@>NjFM0n!Be6s>NL2g9ZHa|=RQ@TOQK^( z3d- z9Z*%$oJrk5Xu+3(NDc)8nNHI*Z@Lf^WtX%ZJ?TFz1e;&V4}OrqS*L?w1t{Z7!EypX zC_xtU3IKmYN&)gFAcCoX^i9IP9MU>K7@%s#HGhC8+`dnQJ&$adDD$4pc>3o?gY6*1 zs6DAGo3G@dfL_^Pum^^MASrAFghTdOUD(nc=P$#T$$8_w{@cg#x92-!`vV?7V0`eM z`?s%YA1@&-tgmBl#&p^4`yuSu8M&}I zkR}ce&Ma8)#TqtlF5Yf-%)i}Np0jkOJL~QzIdEcwm?&8>oolEzBDEJWdhUh&M{lUy zcs%%j;mqvJd+9|s@!f^{<7_;;6@?gb+k@NTi zdA@+vf}1hfeO#P9Ekz$XflZy?oxPv?Kij{6VP(R^nuSZ=Ut*Yp+UK}-pTF<9hx38? zVFDnDC9&yjKq&L#<;sBndH{mv`@1#L>vHGLgf>R4 z_jz&P<;ok%fhVmF9`-x$a^cGTX{Id+`p4klx)^w^!X!XP33!;LD-n`x+h4b)&(O}E z4Lxjx)Bk~v2i4~ZydX~=IBfK`50E?@$F|0?5CqS^{C=(6tlt!Sxcn9KESCut)Yl7s~E=U2uE=%)wQPY;Z_SMD=&H z1uL@R@8*ASlN2$&gLq#%?*IklDiZ^2=}mIPx}y^bzlEqzX-z)DF`9=j?pxl| ztFb+D<)V=Y=v~Sq6PoThz!1NBA$m3C7{#l6GU=xDGRt|peE8M>cTld3Y9kzH}dgl_js$o^zTMwKyMox?kf>+L~O6WHt>3NPJf>U3cg67}hfgSRjw>F7miEv(kun zgccZRgV=EGmzgv=z{VdcpGgjr*o9eO3Gjk@q?x(SU~QsJUE6})yl>Xez|OK*x4T9F z1VdeK;pj;68N;2~9VS$8IC0iJ>pv{ftoY~C)1==n5~$`x%pd*>gkey3tHp1r)!={< zA4F%^ew(zEx;?-C?${Y(BLOye)ZUl=h%f&di?sdKT?bx{#ChN*UUwzv11*!E-)`T) zCca))-aW=JM1cJluF)=b&#MpE4xZZ;+SmhdawnQ7R)zO|Ix{0_g@APy0xs&uYW2P6 z=!s6s{ekP0M^nMXWRswAy5rlDYtaAIvQu$2L^ z1Xm#5IFYz2r!->#6ZFG(;DD6KlAj3~ zMdOQYWFWDY^bPjQ>XgpAfEHLJ-~Iu4C}ZRLUI1fOTCXTn$VL~JrAd647;?6KoXI)- zX4fO2E#>!tA3ZB~ECvVFcRk>zW3ccIu*(=ErDS=V>3~r=tMlp9IU@<#TFtf}i$&R7b%s@eGzSZmH~$_5ZpDvTAqJ})y%s7~GF(qsd>KG($I!NLo3DsjLqV(ZZsC{{3$&0wtKR(Y98 z(6+TKQ`M|A1O_!&CdJef@*kSmra>={s<{fp&OBQMVucpE1l69=nSzsd1<98ho!FMU zjV+Y4?mj9s zo3N^++_v!{qT+>dMHC71CyEZm8TVtLI&X1(5~1g&K#{$zXbMS7d=AhSE>$`++A z&WuNp{thQ)_BY(g*XCy`E_&}Wd6+tH^DtqZ`&&$dn?y}f4N^JH6R6_D z!ttSve=~#RfIJQ&v`4X;I#!kKv(JY&9pjk+b!V4f3hxd$4KQ&i8qXbmGV)=3(U#?q z!uzKN8A;3fZ7AT5V&t2l3`sjSzu<4@GmZAoWG`dGx~abRgKO9AFZ@yAo+ucK03i-E zJJ|p+ml}n+setc$jH1e^Wr4PpoaNWZk7ZX{3n-1Ade}gnx3F~{GeA#ahj=H(Dc<5q zIkTw}{SvqG6)}CfF?Q5%WxFfLGeW7>@o8NZt!YJJdiyd$urG z2Zh;!h+rKTQ*1ynEDyGkLPwEjB0zwpI7KpgSRcHL)XB3#+;frw@9pu@o9A`oT`Y@? zosNL|5+=*yrC6nf*qwTCt)J@;<&xd*wU(+&JB5?*gm8*ITWyP$SAZ*Su4|g6lq>v& z;=K;VSbDzlLTEEB4&7JtbjY@C6a~H*?FCM#(!KX#AKOMw;!*Uvgy2h3kJ+eEx}?j;q7D`YOw=iyxtiq>%3trS=tsq74z1P++xEfV_{vI1e$OUdw#QzhW&9B;jXd*RFD=iwaU0c4(=g}dWe?Zn>DC4` z9XpI}DwBM>fS~w;sN0Y*v;v~`KJB$O4*R?|Eki6_gV&+%Xt?9n0^cG-K9js8Y$Y{Y zN=EJ*owckcqAkUb=|;NUHE%kYDlWOyN85OUS>jNZ8fT6j4FGkhN`uw~3>~xP6>&w= zUJ>;JIh5q|sxk6y01!QczazPxTCU`i%(pKu+-MGgM)1+0_p@F7&S=PigV+1c^jt8; zGw7*YNXgBgKmaG0ZQ7re!DxlOPZ}!cZhiFhnUPV`E??t;d~OO)E5^sOcI+HYfm0Fe zKhERCZ3-Qq_zLeJ#%ry~yYl$`K?S;TJr=j$uX?W=-Q>7$zj}PU=Uh8|w%oL6_cj83kaIvNB=sLRu)8_GN?-zYvs6sVrTw4R?+frsKzy6kWp!G>9 zF+na{9^XjMh4PL$DeIW@$b37Z#0ZsN6t6F%05faoZOK(g=rw^nq)h2`GaqcbQtlf$ zI8W?#8unMi07OPo;lvMew}7v5%=3%oX!h{*L@`<3K%O(bVw~8C@;Vwd6iJ%mD`9Dl z4d;@?2`S@c4hYC@rq*yWkTX-S?~lh)pt%V&Li{|T-ZNLeIbQlKA9R5B_%UF{(J~14 zIlDT4owhz0wJdsHd>i+&&A)Wn>{C>Uc1@s`zwLC8Uq#83UF?Q)a9Dc*F3!g0jlZOSsJqi4Iv zeObyP%&c~Tg5{n$7tLs>Dc&MCIA3Z&va5#@(^R}1gzMV|oFs*Mp~tO7Prydi-PtrY zD_;I{%skC_Jy-w{w8PZxLRM6sZ92u|Nq_TYV-g(9dOM?IFQO+q6=UYz@IkSNZqomn zp-M#HZ*AlWaDevH#u7dC6)I*WiIFwhxr{74>Ts&J2!X&pH|-{`_r2l-urE$;;DxCJemPPjhs}^*$7oe&yP0 zSgU1ns5?+A3d{;i?66+GS2%F#b-`g!H$(oa+gXi*G=7%u1g2x^trC6Rv6!wEgPqz! z0M8}uv2@AO7pL+Chgd-9jyd5_{W?kWd)4qo zVj&xrc#;ziLs!@e29v)A4EHD37x$VcdO)IW5Zk$w9fAosD7Z;jf6HHq90-Iyz zl+<6Hiou56E6>^?m3mz;7dUk3ja?97J6;0FDJFO`9q2sYWa=<%&tZgqw#s=d{-qa# z!;6s~h{@#5Ce6Ytn(l#yPZV9mqVmNhE6LEjz(KA5Qd4wX_|md{GC6V3z64Q<-kf%z z$)=ENc^sDBKS^XZ?Y)ApJgO_dX0g-xlFF;BNE9K?FKXF9w8rb}SgW_;w7mrJ($9VX z7$}Cgib;d8*{9JN4Bq_%_h!)qb@J1Z@b>;IUQ0CN-S~YXG@Sk$Do$qnX61U_T=rZ2 zhY0F%GDyp0W^7b+DcDo*mH;5pR3_Y`Q-tTMF-Z{FhsJcsdPHCT9=k}wwOhN((l;(S zDe>S4(!mp5nM-+Yo=YBjZ1WG{d^%ect=POBbyB9Z%Y~*`P^u9G#7kv}g0tw;1en*o z_=`UVYAlLm?wM!;W12i^M9Nvv=qHzQW2eI@6a#ejg`UDGR{JOFgEX9%#v4GAddoJ$ zstV}3`GrxL=cTz(8M|hL(Hl_bkV28kk%BVq=_!|Sl3RSbMv9X5`Ld+5TcR35c6)`p zq&d+wi49w8ITUE?_Z0;Ste_zrq%;Xw4i2;*5!-WeqM&UM%s{U@=_j-pxK-k-S6z0{U;y z=x0$S*Cru_H=!-q!vGkmSTXe?_}|TTmqz><;k|vsgJ;^%2ZIT)DDL03#F3 zkv`PE;Z2N!d!Rln{%~Jq5hdj z>0LP5sdZ{Ws{g~+IrWGZZE3Vzb;`DF+qP}nwr$(CZQHhOpECN~e(2=Bbh48D3)b4n zoZ}nc3xhqlYOUK`edBV^hj6_0F^g%Sa^1$GLzss>;zfBmn4g>Rawc3X>}loNJp#<@ zZF_hNGIx3e6ZpKorQ2}w#!^V2xkI0tCA1I`PpAP?Byj5T~*#U2yqv5NC=GkHMNOTv;(_5nHE`m%n5bo)WTzvWqZ=p%sP48cX zst!i*mIh4Lq2=exZs5_y*$*H~0LJWPo{GHL@PleH zjFN2&0u`%@FmvX(_UeZY(BLegL@+U1X3&h(B9|tH)Jqo8>P>iMESDohRGYP9V1|7^ zTrnzjftc{8zl<3}&^B%E6RK-iE|XqUOx9Sc)R-CD8PnK-_}$v#9XAiUo>Jn!F&e?i z^vN}*8A>eAU<&135pHV!AV=*P6gxcdg#TZeGgXqAh!)xpD z$4yGCrwlQvMA%b{S5jnUy-DP4d~-iFD2MiBRTVT{5wx~X$qR)i#z!D0JUZ<+?*uWk z5rL)3iI*pgCvQ+`ULqwml(4{b?N9|qd$I=(jKysNs|Mi1W%~7P9v(JQ;XMQA} zxt9PSzHoCEXiR20q5jB|(mA<;(LOL3#gB+h#`|-WMfnYF*=#rgnK%eeb19l&ZwL1T zD^^Xj4edIhC^ShwfYs=|Oz7ldHAb~rSIO_mIy@bcT7!tTRu6gO)q|o6q+#|}Sy3J3 zV{&oidU7X29#UM)!|>8@^7JAzRN270c0E3=!`-Z!Op7V5)knKb#=W^}HQJB5F_B}v zo{{dPq(k+N9tf3}MCzs%%PbU6nz$D_Is}_@I=OHpJq^AZoYA3;FC|6MJTRZl8o#GD z&m$Wt!JlzelttNVO0@jVUo~Bk*BHPWg1HRf71M<$rI@CN&eAk4;+Qr<<5V874+-Or zCh!OP1YI!_8iyXLML#vR&*Y`nt-=1tTnXTbc;4iC)5wogpR+d}Nl~k;q3wN^p2B>W zZlZl$S8l^C9Y(c++}M{sQ(FaV?l%Zs`GJHLc$&iRn@O$#OAlRi&*lO_XT<9`gjG)4 zJ1D4Fjrsc_(&K$GnMxUnq?7u?jFa~l9b(`yRL~&uN^5@c;B9(P9Jgft^4}h%Cb3E} zo4Ewsnl}!4NHwU*DnPhHjvPkZLYwVGSfunj8=Ga%dq9Tv>1BhfQwfo_pb%mg=Wq1(>t#$zS}4f-5~0>b@=mmw!6I~ib4 z$5uTxAhH|8RU{5X4*{~}coG+!qO2D}R8HDL-Z3I>RGp=b-zw8Zw6q$u6kAWw5WvB! zm^7JQq`Q1f-OZ@7a}3S%@UR2W{-Lo%D4!}5X-FkLvId)Zt1H60mJ5PZ38r^7OR*r> z%$>j{tQR)cQ}Gtp1rlO{o7zz?@m;f*dMJl2!fNG~>UK&!|MXq_*o|CmBtw}}&+5=Z zd`tytN&7l2pL!H}4bhV#<2pH8$C9;6l0!`fAO=DuuvU`SMJg$dBYgC-hrg`WQ7B6m z()Mst@k@2GeX8%YaZW;8pW0o=IGo@;2S;gG5>keq*C%3Ec)MBiP}`W`ehQgzi#wt} z$Fp$Y*#>JAvIS&L%vxT;+#=Sh{9hKR1`#PDH>SPTl15VReWGPzTzUw({33D(LBWc( zHz7VG^Rx}hswn`MesB~7O@# z4Ko9XaqAwU9xw9rj!@v)?6acvpMA+l;E4@uS=v$X9J7+Nqc94yIe>2{WaDVYexl8J zElbb$-v}v=uXR0E+4J+6LKoYnf-U|+_U$m%H(>gvppL1*p5aZ(J&4&U!B~qnf*qXs zAZ%r=r1hQDt*>dzzOv^EoBO(%DY1~)s4ZMY_3Z#0Dd_8`>jzaA4|fvkvS6Y@u|vDo zEAy7G()74UFttWKl6nQVmCLq3QyF#wkAKEq!y4FI+r!eb0 z*y;Or8)F<)@S34j*sIq+8kCh3E!anQd`Vero|$~9%1|Tf@vSd0U8-+i>VeuSE$z=g ziTjQ=S2#$EEEX=Bo0f!an!EUVVCdP&$Ek>?yd5Kvf3+9h2!znnoG^sbaN<+V#*ud` zj`7p8STBBM9MZm-^L=@*(+XHSF4DA=v}F?~qglk3x>_I!wt8w58H%y&G-N3#=Jj`I zDhQ}nUj>@LqKg>EcE*29E_~b=x6yvA=k$pMb&joOe7SI6@d1iqX1-;X8fgkd;xt3* zVK%1YZMQ8swxL?IdoscQ7z`OJ6G#o2?J8_~gw}Y|0X4lWXF^^2KJ$yR4O#@QDy@CaX};DZ+X@SCcQSJz>wEM zTKFn{WMYEk_oA`U?3gCs!tT}MZH8*9jEG*`$bVignmWMcTLQx{>4vYrosXw(wu2Bp zE6!VG;S#xKllT-H8g_9$^EtJk#+A*W*t#7xGqKyea3Wu7Bx9~*FJ5b;SokS*7O&vy z8E94Zt~OAnq~!QG;bKzGmHzCar#1w80I#Qf)INr}iFBUC(&l=My_vcir{+udFV?W! z;K|f;Q;@u@ZG*+V>vV6Upa8I_)TH#*8&-ZPVfEMopg%Mk3VZX@KeKN+rG+Qgf57>! z5zu5HL}~<@Fpc~Qxr=Ed+mP%sne>h%FHwl&0KTR=NwxAzfhaj|!eW^Y8UzMmTqbu(P^GOMsD4fVXjz@#sB{27C4IIrsn-!~3a6S@Q)ilFZ2w#R_7@ z+FgZk(3l;+UbVfc;hb973K99-H

HnuviA9Mmh&dtZdSBe)7|#S*bP4C_f6h+5Ep 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 j)_?K}1JHth&--87>kB|Q!R2OCI literal 0 HcmV?d00001 diff --git a/.yarn/cache/terser-webpack-plugin-npm-5.3.6-27ed5132ff-8f3448d7fd.zip b/.yarn/cache/terser-webpack-plugin-npm-5.3.6-27ed5132ff-8f3448d7fd.zip new file mode 100644 index 0000000000000000000000000000000000000000..78440e2e60ecc22ebf4dc7c952d7fd13f31c7c14 GIT binary patch literal 23273 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�@WXh(%H<$ih%Vuc!Y-` zKv{20(`%YXU(Aj!;p|m5W`HJcSCfY3`{(K^Qj!r-cRrrhiS!VDn02~^65e-`;m)+t zsShkah$Iw_2N~akrhFaTrPaJ092L{;z5Pla+X-3^pz^Ge>aYnNaSijM*Y5&Lg)%7| z^6MQ^RQbFg2+%Jij8eWo#rH)8WA`*3gNuIMAgzsuCPs^Mu4fKWiUirrGr!#%+@&U> zT(113V3vI=5)VWYTiz9bDOriBH6B{_E4W)7gqpG44=IDZ34E1;F@8M}0eXn;-sCAC zRV)Cy9h3JBLehcGs@$@of@Gi+7{0wLi3kBK#8zk5RVjXT7GVlmAma(Xo?DbUt?_Z3ZBtM_ zlY6glPyj1KYgDU&foZNAyPLj1-$}OKMwUUy+4yA8%G>3pkp4J$9-|U`ah2W9=er;kw9==5~cIOfnqY7l}iD zDF~?HdA0sb1SfVl#|S;0w#pSrUNa4!Iam0;L3(VU5NyF~7a7fSzF-Hnpmw<(- zTb?zl)-El54^bE;se1i-rWN7eRh@||cPv^pJzBd~|2@scNAlVf*_Kz(>E&gWtlD+Q zN}?vqj1~IVzV2pH8e-l{WXBLv$ss%T?9r=pMK(g!pZ1(xTciN?`G8M+d`~>I@~w|g z56^IjaE9^n%S9_-K9w1NO*7wKHoLBt2vMklfUrmf51Ux%4N!4ixQEtAuIk#;!{)G_ zzWT=gT7H3!QK>n*muJeY9et1(CdLgC6Q%2PA(k`ZdoG3h3LR?=EQXd*Eq~U#AAf7$ zX1!%L!9%-x;6bLLJ?ksKRl3Hxe7~cyb?_c}mpW~mL6A=UKgNatxEy-WLEn@T3r;cW z#`PFaqcR#eyfjSjcIdC4AYLdv$WU&-+)>-QJvS-#t1O^CMFkssgbnNsivaW_^*iS= zF|CuwUudlNTdsqw1=Ly-0MJ9!UgkD}8eIg@8orIh20<|C#~V=bKCDEaacmyllv!!I zR&4e+dROOm>17x#U0l1BSLy2F%wRkF(GHE6i)Tv~lpQk5n?Yr{MKLTjINVW$4j3D0 zn9oSDWdtv9hJrP;U+9<@AnSKwpJps98t`(Ztbv%v>R+2ErooruM19+%&}ag54XC|x zN9@9a&!*?TsAz=WTR``hXV)(Yf04(xbo&}Gh8~!Exv4UD`WIIKbHZovuW7LgZIKvh zCu=IBR4F^X2)AZ~-K#bsTJ(aPv?}KGVTK{Ip@(Yb{ zMAdkg3>!0^4Yfg3k9M#Vvv-@Cw+{B}S5qI^8bb(Kjox!^$!#zHG4Qa;>4|6yRW=KR z!aeN8)ZB}OgKSd4!@_C0Mod)hp?JA1bjJ$lm%O~Ix5?cQRFt5^@=zouvXbS=y(p!L zp(QQ5n?5n+pW?BE*vG3*j+t1ALV+0Z!h?l5g2IKuAO7!ysf~q14T>Mn&rzuF-@7I# zcUGAIqFaYQ@Gis1QiW2zQ_-@GNp-fC%+>iQT2@d(j#a!i4lx`ZxCgnc(N2bdLVgJ< zmm4}^(nz3>{S^yWQlvlV_Y~=pMV=kuk(C+BrCO@EKwY#AG#5S41tv9;_#q8i$D@{X zq46TIE!VckG4IQNjdCRIC^!z6*8_d=8qI&Mk+HQeTxPD$zO6YPT?E{^pA6B;m z2u@Oa@^c@0R!}kxqy_fyk2W5E6GH$3}iKzc{ncIK54AcJtPup17T9~^3 z$B4G0zh__*YZ(QoL&cfm88uojfSsF0 zH3O${1_=1E=-P)XrLHcBewC+hRYGvrW+1{O;JbVf`#5yvA+j)P*#+ z_86csN?^!;wo9#F2cjws{zuo;Ejs3L%2x*tKndwl0%2j}3u3 zLQ3n<)IoHv7 z(bkuj;bz$`75edD3F2)wd%K?S}1Vp3uzf(Y5oGq-K{zC!Lv2og9NB*wS_cv$e z8YfYia#?SWzu?Sf&99sVos!?+x?wakY;}ScX9%w}AB|Vgu3{ zIc!w#Ru|c(%_OY}AYEwioIit&jTu|`$Jx!C<(J1DlQB$cKOS}CC($26O3vzN_o?{w zMk>`3=sLbmZS>Go-kJ5j5~?d2$gerLuv?(%Ec(rXk$t8kO>}znlBII$GqN6BOC2z% z7!qmIcifeqcYRYBG{8+J6L;Beh|k^{Qw6A9KfOT}SY;cqx}&$54m-s*QW*CWOpBFB zH+>Y!1vJ)B-*Al7M){8TCmI3Bs8yb>$+UPDnLnJoZSNC@zRu4f4bEJLcp)?2}eiTS}9c7 z@hbPvwp`;2+nCs~>E?JZ3Q=AiI>ioBgNeV_Lx1E&ZljQj4B+kdRLwpFpH z^5f$(i@M0ER#6{`@&=oz&Dpyng-NRRiS-g()afXi%D^$W$QfQ|yy(eNRve^YFoAsh zc(K>I%Am`f9n@qjjm_Bq#B>Fe=9#GZDXna9g5j~e!7Y|M2{b(vFOAo^+J;|0hfYWp%{wa2YIm&Ms|S> zgj&gKf!f^cVXvT+5M{i#-3Be<6%)Qt&Bp#*N<9g6LVm7<`Q!zgi|fY~44s@&VbQ2W zeRRqPL^hMh|5Z~-z(lG9r-$!$^rtNrV;~T$F|CEHOe`fh1>)Z6=iIajW;bF9TMCRe zkYkp%XrZkAK&o+{vBuy}Fba}WBTWJ>Z3=n4296g?p3_F%ZX8k5J&%k7)^DFA~`;g4TFKab zjp-XzOGUJWMn2ZqaT!g&0*|#dLecTJ^-76Ik$}C+ZH~5btke#zY2y6=TuR~(+S(jY z4-ffqE>ydDxcH5)XYX`@AfeJkAyYqHm?;#G5?ftNU ziDq5UoIAQIdn;%iHt(UwT^^YHA*4CxPZ;diud|E5{^)JY?65T z+OjeAQc__2A!!7#g%o4bGIaq>-{L4Qpu9`pw?)67b=2#)9dOo91-8XX7K}HYK4szyqXta`!lcXxEJs7HC*M6!%@DL4&cFEQCp{pFczGz+JSA_e& zZldNeP{mvUw}BtggziUB@3bf?(YL}PkqFD;iXiHjRd~^_O11-@l|n96Tec>`p-p{vP-9J$E-T#_uME z+?oV_sVY8vyk|Ie`2L)_8-ZSDRmY z!}Yi)VTO`u`OF?&S-u|4V-$_sQ#l$Z$SoOvJXkn;eBu3g&7CMLgd8NLrlNU5#I<^Q zX-K;_HG5w^#L>>P;4G7Q}3Q@5_!#;2}ye{R*9{A0g5&$Rm(&roG!yFBv4 zP1_Qh;bnwFry7~IDbQc`DXv%MHXt$j$0>MD0xrA}OUY+5zBI-(taPC(ZEqYDm$IU3 zyc%eyz81wWS5v$7$5c~~hE2ShYJHtq^nlkgW^IywEXOH+b+zeaX3Wj)(f(?+l^;8X zh&wh^r1$qE+?Ptu7hH`Iv7wOZ5)3ggIV794%RD*)Hsj7AH!a_Xt)Mk?HMQ#%V;ZIM z#~ExhZ?<1$_0#-K3lLG*oDQgzbpoPI>hNs$PP^dp;Q;VQ>Bals-heBI1D(Q%t|2B% zD)&#o%lxhPTy}=9#o-F)M+OvP!hoz^O!L0E=dsIu|%wP`Ux}~xX{R=f2y>f zT&f6>@|PrLB_)o}$JfjAvR)!(#OANc?fAbr)Y<2oQ>v|yy))}$(+1+__uvAV2bRi5 zN1%bpXU`U z2~N^&xBi0z2}X-qQp$1YvO;;jr;`v1ZVb6jXd8 zK{pN&w?q@ME>LP3g^JF@!^t$)7scy5&lYtKvtk(v`;TpTKh+5VT0%-y0|{n&Jj58J z;j&U0kv<`FcC;BI9v$Lw1QMBZEhnW8!Mhl$Oo`xA=Kd1i*4w~k(n&2!J445%WIX85 zE=t;t7zzxt<KZIm=<5kNkYx4;8CrL^^E2~vmurR*m;JfBZ9?l7sN%46ZM%CZAnyiHyaXY{hdBS z(fGxl>d||6>Yzg}pWmTn5fI_@?+Qev?MegCq!(mQkn~ z1Nlew1ox@pyv4xY^@8P{kQ|(yn`@D$b(yD93`XychDVh*FjeyjUpnnfQ($f$;jv{) z3T*@y+GFaYMTc-Nq-Ob)hSJ)j;?ts7?qx1QMO<|Ew47>gYCPY|jgkQWZ)oWK-v7_m zH~W5Xc|%iK-bK_HOi~2r#Unm> zQ)OG+zo5+dzFj6YdcD|}f(`18{P>4AFd7>}cnPIq@wKU6ORkXp+^JbzLK|8;#EvGS zg1Jzkw|I6{x(6WBx{7)I#Ady`qE%@HoG$ND{r&JuzsINJaY>8S=D^-`uyUE-B+s_` z?+kyrieHZznk^y88Y1iQ*8c)s~8o0LcLQn(VFBf&vCQFwNHq{y{h&Dya&p{d2 z9^I>g?6x_tn*A&ex6r1d%5@nd9^*av9($n?mGWXzl&W?w;o#uU_va@Xq&&}(ZUV|e z13rHX({JcYjOQ1$I$a%T4<|=Sm?ghd0kKCeOBUPjuShjB*R?ww7)}on0!vPLxRV?) zOjnkz_V0OR+cmJ%+<;Faon^{Cl_LuXMv)VEP4~d4t=yyFpl05she{D%pq{0Q{St%c zl~gZUGYDI;z>p$5s1S2uyF(CX8_ikbEf7$Vr0Vnb-P*aicb%Dn$L({roP9tMPtV{3 z*D-&y$GPdnMXwXfO*L&r-)|aFP`VCskWba2b{3xv>~6>_glYo_SK3zgLh!XbCa~o! zzLTqQI7GRy578jgT1CVxDy6BfhLw+8pr4dcfh*i^^jF#$AKvt64gn&U7QWZDp@-3) zXa9H-XhtsDCe=MzD0iU6GY%W}X>A%!sQCfKxX#_Ti(I|L%q}+q3@%xG{nUG1#{31$ zAM067Iin~B^~NsL^4f$UO|InaNa)zMArJJX0IiAH4F z!=LuBXao0fN)x-V^0{GsaNYATXTj85P+jE_&?ka$#v??i6N7pz{xen}71wJZW{xoE z{{E8~gGb}@R<9hLavF6AN4%JBJ%6Tm*C(GDrEq~fFG7U;%m$McZjooHCEK*w)UieC zqQBjWT^{(S$REV=OL!il9a14qr|^>knD$S2oKO)I;IGh6VzY^=!!a7`Hgun)8^V|s zdqu!z+d;)mr`@+nt%vKb=mC~Q$`Z+NVApWK0VH`qN%Tie!ry8T5 z?WAw1*|!Kr{+zuiK~D(@^jFg5t?5t-T!S%htp?{AK^=^=I_*NjNyjSiE^j2%oxneO zamm4>>2@YU1^#LeGLq{IBO-0KkcW&r8P6OzWEDH zvUamwz0$vie9a0cCeNzsnK!Pe;rpBy8#!+EOl#}5Zef_4c)vqZLig@8SlA4@Zr9t; zF5-70LM&TgWEM3Df9FO;NclGiY> zP#JB;ZXZc4U+94xD?5%J*Q$n>g7E@85LnOi;(K9;lcjxudDoH597OGubjg2)?2nZ-XYb$`kKrq1sIt$So;WnApdJcUBeey<_ro11dI#>#QML0Hg@*T7IwD(QB&L5 zUTNsstuvx}pJ-^F;j@PaJg>J_6e<^6R(HsIrjaj6*@kJ1##o#AQGb8b2qZv20jr+s zJwrS{Jw0)q_#B!DN+t=9fU(HJ;OWL;{6iX{5h4#WSZAX3^ICh3&Qoo`!$V1wtfZYfI)W~tmtCmITSE44xswIV_{aDm%Db1r_WR2`bpu~?Mre_VIG&ioaM zB=KAd(J0Irz^lOPu*4a^^7;&Y*=?l^FH!4EyL8@utY(`VqZ7St0ly6qyTn4UC`M0_ zk|11WDydNZ6t7gZLizoD1Z^46U|MmdO^j&+2cCA6joKfsYEhj73_yr&is zagv3~++2l{s3Ia=afg9FVm!NSk(n6Aa%UZTGLrOe#GAvMsBuRbKkNqKAeDIHRD`^Q z9UJYr@7}G`(VEj@EW=~#+5SX?FBDPP)IIegH>=1C7p;kPkVoHRJ0)G7O&6m zjh>PG!S|Oq-X4$N9%xyjEe~mbfbr_DoX>oUdnP@^u6XrLuLe2d@}_uj_W`5HhGCR( z>UdlMlgkQgHE8|x&dLBKG*))2C1W{M@wp+L@d6;j_qf-1P{-I|x+o51*w8ON9O2^(A9! zND*k|Pg7hu>SRoxP)KhpXeqcN3d)m%`9Mnfo!@#i_LrpjM0c+}y3 zg8$bj&SQ8&_xXoiOJM)C#sANu_&@sV4b4pcGk}ZLW$X^v5qnNF5cw~OD33H_4i*Jr zKr>NK4gW9*G05r8F0Ph{go8+}xnR8A@OViU5I}1^8l`2~ZL<(OeMQ6x4NGHAj`anw z=bhoFupQJkrA%q52Ik@#hZ5&ghh`WbT+(l%8?>P}M<NBG31~zNWkJa?wb|5&D%jRPVkEliLf1#jEX&#wklWCBZVi&ywMuGY zg)E>zhkD%+$WVHSf*D;YD?q-dTjtsyj#Tb^3+l$KQAL91JOrbvm4joiQX!c;#>EdV zOa7o_A>uR5cZo)mMqs<2hrkIRLB%$Mu0U#-Od9DO7?>0LE4Nn+Jy#D zk_PynId-Vs`?Qx{gI~t%326+P`Tt3uiL8MMI z>zC6&l3mTfn}!Ky<^@U-m-y^9Q3ILmF>tDK3P3W#>q>8eMUTp+vOePBvv+J5&Ls)v zYxGK-RyKnubnt$@R}G{&Y>TT#}ixJN&Fj%+t#wP%!}mi zCl?<8dMY6pLKSB$`WKXLG_P=&6sMTgzTy#__5$t1bS6~it!MzvLH2|^nailL1K9U# z`F=|)V#(ijs#gtYp=M+BmVS5NDCD6UeHiEJLUseP@j zsxYvldp)_0%u`1Jhlw6fsT@>dJV1J@fJ=HkpTBegSkss#Yqlh6&t@Mv< z^g>a=R@bn)QJGXCsBclR^V!Zzch70B2ytWh^nwI*5B_nkePXcQCH%wNWBJ>#!=v;4zaf6@31I-_zmG*e%0NK0 z|Fcx4EG8r>Cq{2$e8p>(`0sTYJ_78!>R*-02?cPbyDir}~UIUupss zqwRx!0my=ahI}iyf=RoHC@hffoYUmq7uwoo^Q>d8|z)P zjxQ;EhIb&{lhEiVy+XfqQN@xb*FFMHf}!wE0)+!~`HX?k$#wg2t2Cj|ok&3+cF_GvCZ2aNcqP8kj5e%c<7or4s)oG~{agqh6I z!Jx<*e6w6R(WA(-*rEF{xlUQEc0igByoS86Yp& zm`@O~cxLG#CbT*Z*~RWed+D)xvy^az*tjM}!gNts{W*2S48vt}DGI9qV)f{=k3c6} zXBJ0W{L1EDptFgIA*~a&p{042I%DD)|1B9M+IdBbiOeQM%67tYWO48SI(PDTM1uKG z2#DOUcOBn^Cic4H3IYtvltfB9-v!(?V~!}5>7%Pb2ZOiib&j~at=kP z{YSKXK-$18DV<<*0wcO?bTYj#96E@SzC9bUhVQ#ubW@5geaJ$g{Md^kqm5FqG& z_yqT=pmQ|Ni!D$PF3M&#IJP5j?k@%GZEHQj*>$FWhov?WaS2iwy~lYE1Cd2~kP(Cy zqVNR`F}^!dfM?`sDU&d=$GesXi_j$vN zDBgleCMQjlk8w~2mwlK^_Hzr%uuk8j>cm(1`;E%RtyB8ToOUY%Z!|^i$Bo1OYv1Wx zNHoxa3WAfiFO%{IBArZ<<`|P+BWSCaJlo;60Nvq7cKf<`5jET;DQ%yI4}=v3wAy`hRq0V;P zOx>bnfleA7Q6Z)c2#4yTWryX>kf+d9<9o=Gh}Ip>oWCVY_Zc(9>i3$*k{4+kZUp6h z+LF)y;mfm`(UBROnu>PxcrV$hUF|oyBNwv+QMXcUJ{O#=68|bZT`e&|Ln1QMR1k1( z4RyN6^n9N3{x}wzfru{_S!2psX<8yTcO{6--XjedWCx}7G zzoM>sXLOmsy+1q(Ou+@d!(Y}N1fU%`bspZGb@L)e|M<6o^f{|D)&8J~8`tAmH;0~t zDu=KV6ge!T)xa*tyPQv$6U4h0Oz|ti85JIOdU``dgSv#vx~@flm=(RuNZ#{u%GBD1 z2UKINV`ZeSH|)TfjB4H=3gTBW*NAvNJVJAFZn9J!@@;Q*WzP()R{_qU6Vy3TKz1_I zl8owCyfjAK?w$+uV)jV9j^HD>q*T)l=FU`I)B+Y7d?>>{n!ZfLFK^w^`}(@jU(7XC zS}@v%K^mb)9j65s2-J_8XDxgP!d*df;FxJH$fu54SLovuF_wQgD!iYxRk)X|lS3*= zODS`KKArRHTL{W$hs@y|HZ(f~W6i#Mj{g)t7y(}Iw(BCX5l z){v29iLFG5jIfUG=TNt;I3AoqkPMPwYWh|5?ME^Lv(~khU!0L|w9C#X*My0a#<+C* z(8C~OL678MeRjim4pslPgxNgTw0dL0N>Z1Na;KWJI=C=T|D`e%#9UrBy;UX}wsZ?p zCUoeCTB|E~+3bI(?*TtsCe33csFN9=Yn*`?8tGLX3`&lMjBCcUeD;?UI3#8+xxqb4 z-ko>3fny$hM`oVsju**-YBYb0@kA%kzdovxf2neWfCWu}RA29xrFChGzX9?OOQ(0pJ+bji^}y^?D|7ZL_6o667pXQuHOMRP!DO4zpUj;F^DPa)RNEg&(L%=8N2r4_#lO*!N&+s z@zO;YK@3DYLjrL~wYmoND|PR&W(qrZIO5B_w0`5M85{HI7a6S8h*}HyF2E~JJB!u} zc+8r-)KgXdUc=s4OSgSsH%RbfcJBT={!OCi{M8x;QqM^x3+R{Az(ZhdLLM zUYns?cac8!i_w!G{p1rXmMlndf%@3VMo}~kx=`pD7wBnJ`nJlI%sZ`asGd&``p&d7 zK0Ahr+Gf=YhPCy;Kjqz)sJOTXk1>kg+Ib6CQ_$}E(-~tP=l7~gX*vmjDk=Fxi_1=< zW+VQf9R=1QlzhQL`3ft_W{^~j*mwoZv{wG7L;7Sp;K>I+8@@gcz5@iBNA|GIZQD1pGGzE`cYL8^<&qA^y{wD$6Sva)xZxszKsjPaKI z`sI!bP8@HK1ok6~!f;Qe);?{CR$$D7A+w1aKp;tml;nTOO>v&5m?5!S=q5WMp6geI z(9cpt9E@6wuEJ{?cO2p2(e&{!emB8!qu(*?ve!9%Cf;yPt+0!&sMbKk zf+T1f`azkYzZ|s`Wco%F^i*R{v?UZIWMLd+;w3l~WnhkI8TB!c-6JOBfgel2BwMdSFr=MZ;R|9(X`wG=6Cj+$Ae5Mib@f}o+TAbEqK-bG} zo*JwA7!S^Wp+dEf2&~TTc^gWI$dxxpS(H)?<3OjROu?i$e=>&#jT-E%+8Mzeg<5>y zlHM^zdY^Mq5*TB*+5a9<;r{t1xwNu3Hb&b~5va;^6ZJ$F(4i^Hwmn}wX3S_VM%!`f zC%G;Jj7Ito3#@y8O3l&V%8-?p3~ci9YkB6^1nf(0d^8WUI0~G4j@gw1?Xy2z{wBd# zs01(Hu{y;LkB4s-1e5h@?tiaP-DDB*h&p*l;Qg&jN^V*f7|RFR!eP`+mAdp~S3I`D zM{JKU;m}R*f7knEPVNYohqKYB{RMVAVmFrB%|9%znN1Ed;)3^!mF1^OoK2nrq5?!f zMut}*q3-{w?uZ-OW-WAh|4!lr#b&h=9Z* z9n#$h(s}X!yIk*O{`Zc*vokyI%+C9Ho;`DR&Uv5xK3|BqPI-;8cP#o$)#+k?yo4R#cdi1_O9=YmU6n)0y*KP1*SNFL=F!FZ(xF zMcQ;2F>!=G6KAAlOXMBK>pGU7R=vnU6q?mFX9d6&Jx1C=s6wCM8B7-hTWGvg8-~tur1$L56lpWxRfhmUE<|aTCOv5aQu`y&#=F zJ{3+GsRj>Ucrr|D*IRE%nzZ65R81q;FdtsTp{ul!9&(WjOZV8oY0f$_osT{+=L&9H zl=!5!rENF%?HOc&YzWiPPeHtb53bH&y9Q(~@(5H|1LA=!m3QxE^fX2ef8!bLx4=}~ zYRb&<_}CKWu-vRgeh`NEz;pEm5s|Uq+u9+g2o>5Rb~N8c>Jth&_-_1$Q9Uu|bHq?J zwuzjWi4xGHkBaD5JWZb~rqi6cKY{zWND~ff;ljfmr!?v8;Gy*MOxol2kvabyJCWMR z5sQyvo{n@Eh^bIB22!i_3#n`$4{`f6-kC|N!#nK}lOB}XTf8ek?=H-;o(H^5uE=a8 zjcf&xbCljm{kD!6)}y`ytFFWZzVT(07V4d?ZZz5NfE(B#aCHN?vK8%zQ-a<=oWjLy z^43F-4VzX?aHEi->>|tR@+0TjGwfCPkCdE+*%k#Z)3@PXA`9^YC)hS(3@q;I5=1dZ z#<+G1+!+9@ZV4-Irul<9pPip5cb>Aez_TN1G3h%bP#MBk@J9!YRMGF`x|90w{)C;w zn@a2sqv#K0Uy1@z7G0Od%GI_4f=9SR3AU-<+I7Y-4H#7tHp1(c=y9k{d8}lG{O;@v zoqHfldtc6S6^88EaWrw^&2+WSj4&IGe(~N7?gHEP~i!DD_27?EssLk0OAz^_SP9e7n9{4_7ZY72h5|y zDy!+%m3=RJoe5DsKS{A>UJC?Hp^Y%);d3f>K1ZU}eklthDb>#n|9d^7!}rl|zdq zNh%r)n_hqpou-gGBHYEgQC4|Z6+)7~x>K)gWsDL_Jh1ewKm10y(graK8_<$dECMA` zVo<0$`?5Jebh(V8H&SQw-BU(V%nF*hjln833Z+%jG!>&%UYk{i3?+&psJ>L7!yB*R$+CY|BHKC4KS~neZ?wr!i8ppQT<_ z-@Vkw;~_qv{X=6&^Q9ZtUeOuSx~uxn=wXX{3X{zaX>KeL%*VNY432M$%6Ml})v1hG zy@ER_5X+2tP;fw|aEiu@d!OCHM^KtqVrQR-{g}1rfXt*_E-XTt(=r-Q&fI4XoL5)I zx3&o@Q9sE;oIaUcD>WUeIP#3Q{W4*x>eG*O5c>6D(o_mj^jU)q>z6(#K4XYNF?}tN zUn16%ZS4lcb_ewVv|)=Ew3AWT+p$|*pY_Dsva5gQYifDlrC1wFFQ>(E(Q4u)Gv10+ zmYQ$m4%YHQSES%6(B~1u`WJK%aX}IYDVN-m%P};Cgm| z?pt|Ydd7&;{;Rs9E~K|=T>^c<-`Gk%Dvi+sMK)zAJ0htM##=pdNNR23l!4n1)-bui zWFp-ec9PAfi*xt6@YyAtD~SG(>8uE>OR;sccjp9v*OJnECp4@m}tU_ohH5- zaCyf64GG;3DRg0KB9M>v8`N$e3u<>*&9Xs)m`fbSc_(f<1=1-d&F6g4sm|9rF)!Yhgf5$4oMM8#dRi`C%L=&Y(`)>EiF>FqSYC5)7ZBp>&9bJ-StFqOLD zrX`BK5Ewh7B{hWk!Y8EmxF_Xs_?fn^(IfHqWcxo@5d(rzCxa`(O83VA-4%m1(Z+`? zF-0uw_v>7{OQXjd3OsbxsWDqF@9&(%iB5Wz%t9_q$Pm-E_)&Q1^3=A- z=wx!*t}z3lsby)|BnRo0a9f|Xh~#cbBn``Gp-uRFeQ1G|FDt+tv4d1nWy1Qk3&Vb$ z^%cRO!PP7O#o>;l8pC~^Si7#YU4IgD3CyMjdwr58EK3V?G6A11qN8h8T_JFO9ps1| zG6ZK%LbROcWk9SJQ$3x?e`Eg`izDoman|R)kh58IBnPi}$O8)2m4BJU(3Ww8|Y%iXX z40w{Bc=Koc*^INI((Dyp%v6OLQuMB4MPAZV<{~UAv{|VB+A$j#1s&a0E<(+<28_BL zJt1|}*z@Jho<{s`hI-Q*3=+o72Wr1Hl26?UbXiR( zta^exjg3lH=pe3bwg`z#9F|EqQPPuPbw4>y#Kyvq=FwF{xqNNQoK-HSd+{0fu{^s` zF)iD708{uUOcBj4AhMOS+EkfJ_6@JQaw)M6fX5F!=$l%DT&n{0PPl~f zPm$XEW+tkMz;MurL?NL4v2zQX$+)w+w5Qp=>27LNC$OJRhp7EQc_N9!2qRln&qt4> zi*|0kXUmLc^My`yri`Jfs1V}ESIyE(@ueL3J>7h|Jzl-+92X=Ov=T9+qspmm2?R8a zPIwSYCI}JKUV|ZY@&oW0zImB<$j_^0C)qB>PHMfgpXDBIo_5SoK4m;hwBu&0;-jN+ zcCpUkmr)E6DrIiVqAth{cl}^@OpVrn@oF#HpUSsOql-xTRie=Dax=iNjpZq+iAT@Y zoWCT&y;>JR%Z`Udm!sU}U$j(6fU$ho#80oHz{_mVvnynTltRzH8j*Cw1*Rpoik5qy@Msvr4Hn-Fz7G z!6u$151G)L9?!Up@f8(qp2)Y9I^W%Ub(hM%Y1Jid+1(;Az)-W8#330>?D9}C0EJ&> z1He5fYASeH&ApP6KXz^k4MSZfB38939^+{aLa}NsHXMjzQXa6kfBI9mD?)hq*hw#q#t8WXh)>~!nFsg{W7imw!3KY;jeZ%%lDcXW4Y^$1I)NcZ8^bmi8@bkLliK-$}I0%P{ru=!Fs%(Q55)NNJTS5!n zky|bU9PCV1?geFHv~J+%o$Y~0eodFwU872Kef_?(&&cKNqRuQD$TEYwi$A^qEi)`g z&5t?rJ%xhl(vZ4NQQiPyVPVWpZwyUO3{6sy4PT;Vs|`ngRKMXo;6jSXXwehlo0nB< z|IsgNg1-GJw&_!fT@C=wlL%und=-gTd$@9Qy;kfe0$B|P6$-Jy(xcjhbI)fLv}I&d z$P_P-%>~*cjEnB_$@W{gaTQ?jg(P)U!OoCICkXItDZXAz5~d6L8jo{$kX5+X-HYaU z-hbIr5?w_QR^Y;>*N39fl&SqG8|_=}{B*E}qdGV^b7Y2y!m#9AWiCosYI!=FBg~~m zW#4BJcVQY6oQsBg->x8H!tv9+sw^gb8bZ2h)_XGtUbwuTk3n$$aSGTg<_M*CbY&wN zZ-|4SA*eb^WDqF_9>mmgjvWyVD4k4BLYa_*c-|`CJ`m@TVe}DG%fp5yXp+p2T-a8B z3F7ItyDHC=UQy@UV?H_X2IN_b&bk({@fT74X0ir;Rsn;-=iMuztX5r*LCqYv z8zIG{KYA}>{n-z!CCu|YXrjfYSP00w>xM3_UcX1=ISD}XFnH$@)wF2MS?UbVZ)wEN zm?6qj*GHbf>*l^c)QJ6cg8FA?->) zLMsl%yxHK74bT$!8wJvB!o9vDUx0}4Q*19s^s6qW5=1iOn-=3|lmy(eeunENk=h1BsG?cE58f(Q#Wz}Z9xgiEtys5T!OY7RjdxtBZX z2c!lIu>+uYHT8z>qC34ksRCGH`Qbc=5Z z@95Kl*F4|qfaVnIVlJ|~<-W`_iqWkAvs=+sWRmj~IbzU2G>ZTP*h+mgoG|Mofg(|U z%J9*N7W@aw2eLy$3&n~r9(b-PVd_~Uo`O1b`fOT*<2hLCh>PQQ7WuJs%Kig3gNHC# zJUPYoV-c^R=qz3z&XwvnagnE11DNGWE-9VK)Y7^@ujv|3kqF$RIs(i?oCV#X#O5%Y z;1enVOcOn>@ZIe+(ZqC#ObhGkCvB`$2CDgaWLgvi9nyvN-lb4@a2Ax3n&xPhi~}bk zAvArX2`C*NRV+nb5_;{)q8g0CKM-+G zUE4q4*>SS?YniW>npwy)7^{+Af;Pt8k&D}6tl89h0{!8iNyviRSqL4T)jGPV^eWP_ zPe-a_b(2Q@q@qyM%-2BFN~xZ}T&6vk_uv&DwF}$Gq5+6PxX-i_l8nGf zn(wKl#-DF@VJCa?_2~-CyOmcstDt>29l5i4`Xha(5Lx(*(#>UkSzN%@3 zsfjlZBPB*Yk;DR)Gh2->d6*85f~GfcQD14JlaARj`)Rq@muo&mZk+Zh5+M9(g~6eV9<`jj}hLn(%cYvSF;!;Lw~SKUv?A@FMUs zX=~}|_=;k4lnR~+7dMGU&DR?};h+7C7IoUfbN`AMbZC9y9e8=Yx{*=DQLiN#*W>^5 zdi}o-uHUvKe_h>je*N#a{_=jk8C#O9*O&is>wj~C{R?>WRCe17_6C^aZ}Vrse>%hd zukZNFu=8eYNzz=4W&a@2f7*BcXSTNuJa4Eu{$_uJdSmB#lk?47-0r{rO}|6&=Q;nY z8~Zl?cJJ+Pyam;t<8L}~Z_{teU)!(p#m(4~OqKs5@=Y=0KbPX|a>fld$AA9sV1E}k zZt}iajkgaCzXMEx|3=>bc7(Vc;r2fJI|BBzzY*d0uB-a=F4`{$?)7W!T1~rt-DQr1 F^bY|`N?iZ| literal 0 HcmV?d00001 From ca928a9b5e40f6c5f26aafa407f13b1113e92d45 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 6 Jan 2023 17:44:30 +0400 Subject: [PATCH 02/66] chore(wasm-dpp): match terser-webpack-plugin versions --- ...lve-uri-npm-3.1.0-6ff2351e61-b5ceaaf9a1.zip | Bin 18331 -> 0 bytes ...apping-npm-0.3.17-57578fd48c-9d703b859c.zip | Bin 45428 -> 0 bytes ...terser-npm-5.16.1-d407c2c364-cb52412350.zip | Bin 433108 -> 0 bytes ...-plugin-npm-5.3.6-27ed5132ff-8f3448d7fd.zip | Bin 23273 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .yarn/cache/@jridgewell-resolve-uri-npm-3.1.0-6ff2351e61-b5ceaaf9a1.zip delete mode 100644 .yarn/cache/@jridgewell-trace-mapping-npm-0.3.17-57578fd48c-9d703b859c.zip delete mode 100644 .yarn/cache/terser-npm-5.16.1-d407c2c364-cb52412350.zip delete mode 100644 .yarn/cache/terser-webpack-plugin-npm-5.3.6-27ed5132ff-8f3448d7fd.zip diff --git a/.yarn/cache/@jridgewell-resolve-uri-npm-3.1.0-6ff2351e61-b5ceaaf9a1.zip b/.yarn/cache/@jridgewell-resolve-uri-npm-3.1.0-6ff2351e61-b5ceaaf9a1.zip deleted file mode 100644 index 97e857d7d22109683cbc0cc868050507403c7658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18331 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 diff --git a/.yarn/cache/@jridgewell-trace-mapping-npm-0.3.17-57578fd48c-9d703b859c.zip b/.yarn/cache/@jridgewell-trace-mapping-npm-0.3.17-57578fd48c-9d703b859c.zip deleted file mode 100644 index 29e13633c130614ff97261b1beacce4cde157740..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45428 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�sIsn`chlK?5c0@^kf(j`NK$m>xcK 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 diff --git a/.yarn/cache/terser-npm-5.16.1-d407c2c364-cb52412350.zip b/.yarn/cache/terser-npm-5.16.1-d407c2c364-cb52412350.zip deleted file mode 100644 index 83fcc13270ad1b56bda8bd85d9a8278bb7e03334..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 433108 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

6a=%VCo9~h&4axZ?5C$7YMnE6RbOev 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

HnuviA9Mmh&dtZdSBe)7|#S*bP4C_f6h+5Ep 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 j)_?K}1JHth&--87>kB|Q!R2OCI diff --git a/.yarn/cache/terser-webpack-plugin-npm-5.3.6-27ed5132ff-8f3448d7fd.zip b/.yarn/cache/terser-webpack-plugin-npm-5.3.6-27ed5132ff-8f3448d7fd.zip deleted file mode 100644 index 78440e2e60ecc22ebf4dc7c952d7fd13f31c7c14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23273 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�@WXh(%H<$ih%Vuc!Y-` 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 F^bY|`N?iZ| From a615ff30701911d8f17857f21dabeb71c1cb3000 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 2 Dec 2022 14:13:00 +0400 Subject: [PATCH 03/66] feat(wasm-dpp): implement ChainAssetLockProof binding with tests --- .../chain/chain_asset_lock_proof.rs | 1 + .../getRawChainAssetLockProofFixture.js | 21 ++++ packages/wasm-dpp/src/identity/mod.rs | 12 +- .../chain/chain_asset_lock_proof.rs | 116 ++++++++++++++++++ .../asset_lock_proof/chain/mod.rs | 3 + .../state_transition/asset_lock_proof/mod.rs | 15 +++ .../src/identity/state_transition/mod.rs | 3 + .../ChainAssetLockProof.spec.js | 85 +++++++++++++ 8 files changed, 248 insertions(+), 8 deletions(-) create mode 100644 packages/wasm-dpp/lib/test/fixtures/getRawChainAssetLockProofFixture.js create mode 100644 packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs create mode 100644 packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs create mode 100644 packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs create mode 100644 packages/wasm-dpp/src/identity/state_transition/mod.rs create mode 100644 packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs index 2ef2187074a..4705aaf4c09 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -6,6 +6,7 @@ use crate::util::hash::hash; use crate::util::vec::vec_to_array; #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] pub struct ChainAssetLockProof { #[serde(rename = "type")] asset_lock_type: u8, diff --git a/packages/wasm-dpp/lib/test/fixtures/getRawChainAssetLockProofFixture.js b/packages/wasm-dpp/lib/test/fixtures/getRawChainAssetLockProofFixture.js new file mode 100644 index 00000000000..b18831d8ba2 --- /dev/null +++ b/packages/wasm-dpp/lib/test/fixtures/getRawChainAssetLockProofFixture.js @@ -0,0 +1,21 @@ +const { default: loadWasmDpp } = require('../../../dist'); + +function getRawChainAssetLockProofFixture() { + const outPoint = { + outpointHash: '6e200d059fb567ba19e92f5c2dcd3dde522fd4e0a50af223752db16158dabb1d', + outpointIndex: 0, + }; + + const binaryTransactionHash = Buffer.from(outPoint.outpointHash, 'hex'); + const indexBuffer = Buffer.alloc(4); + + indexBuffer.writeUInt32LE(outPoint.outpointIndex, 0); + + return { + coreChainLockedHeight: 42, + outPoint: Buffer.concat([binaryTransactionHash, indexBuffer]), + type: 1, + }; +} + +module.exports = getRawChainAssetLockProofFixture; diff --git a/packages/wasm-dpp/src/identity/mod.rs b/packages/wasm-dpp/src/identity/mod.rs index 5ce3e41a897..dfdc53e1c5e 100644 --- a/packages/wasm-dpp/src/identity/mod.rs +++ b/packages/wasm-dpp/src/identity/mod.rs @@ -19,18 +19,14 @@ use crate::utils::to_vec_of_serde_values; use crate::MetadataWasm; pub use identity_public_key::*; +use state_transition::*; + +mod state_transition; + #[wasm_bindgen(js_name=Identity)] #[derive(Clone)] pub struct IdentityWasm(Identity); -#[wasm_bindgen(js_name=AssetLockProof)] -pub struct AssetLockProofWasm(AssetLockProof); -impl From for AssetLockProofWasm { - fn from(v: AssetLockProof) -> Self { - AssetLockProofWasm(v) - } -} - #[wasm_bindgen(js_class=Identity)] impl IdentityWasm { #[wasm_bindgen(constructor)] diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs new file mode 100644 index 00000000000..bad73ce692f --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -0,0 +1,116 @@ +use std::convert::TryInto; +use wasm_bindgen::prelude::*; +use serde::{Deserialize, Serialize}; + +use dpp::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; +use dpp::util::string_encoding; +use dpp::util::string_encoding::Encoding; +use crate::{ + identifier::IdentifierWrapper, + buffer::Buffer, + errors::{RustConversionError, from_dpp_err}, + with_js_error, +}; + +#[wasm_bindgen(js_name=ChainAssetLockProof)] +pub struct ChainAssetLockProofWasm(ChainAssetLockProof); + +impl From for ChainAssetLockProofWasm { + fn from(v: ChainAssetLockProof) -> Self { ChainAssetLockProofWasm(v) } +} + +impl Into for ChainAssetLockProofWasm { + fn into(self) -> ChainAssetLockProof { self.0 } +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +struct ChainAssetLockProofParams { + core_chain_locked_height: u32, + out_point: Vec, +} + +#[wasm_bindgen(js_class = ChainAssetLockProof)] +impl ChainAssetLockProofWasm { + #[wasm_bindgen(constructor)] + pub fn new(raw_parameters: JsValue) -> Result { + let parameters: ChainAssetLockProofParams = + with_js_error!(serde_wasm_bindgen::from_value(raw_parameters))?; + + let out_point: [u8; 36] = parameters.out_point.try_into().map_err(|_| { + RustConversionError::Error( + String::from( + "outPoint must be a 36 byte array" + ) + ).to_js_value() + })?; + + let chain_asset_lock_proof = ChainAssetLockProof::new( + parameters.core_chain_locked_height, + out_point, + ); + + Ok(ChainAssetLockProofWasm(chain_asset_lock_proof)) + } + + #[wasm_bindgen(js_name=getType)] + pub fn get_type(&self) -> u8 { + ChainAssetLockProof::asset_lock_type() + } + + #[wasm_bindgen(js_name=getCoreChainLockedHeight)] + pub fn get_core_chain_locked_height(&self) -> u32 { + self.0.core_chain_locked_height() + } + + #[wasm_bindgen(js_name=getOutPoint)] + pub fn get_out_point(&self) -> Buffer { + Buffer::from_bytes(self.0.out_point().as_slice()) + } + + #[wasm_bindgen(js_name=toJSON)] + pub fn to_json(&self) -> Result { + let js_object = self.to_object()?; + + let out_point_base64 = string_encoding::encode( + self.0.out_point(), + Encoding::Base64 + ); + + js_sys::Reflect::set( + &js_object, + &"outPoint".to_owned().into(), + &JsValue::from(out_point_base64), + )?; + + Ok(js_object) + } + + #[wasm_bindgen(js_name=toObject)] + pub fn to_object(&self) -> Result { + let asset_lock_json = serde_json::to_value( + self.0.clone() + ).map_err(|e| from_dpp_err(e.into()))?; + + let asset_lock_json_string = serde_json::to_string( + &asset_lock_json + ).map_err(|e| from_dpp_err(e.into()))?; + let js_object = js_sys::JSON::parse(&asset_lock_json_string)?; + + let out_point = self.get_out_point(); + + js_sys::Reflect::set( + &js_object, + &"outPoint".to_owned().into(), + &JsValue::from(out_point), + )?; + + Ok(js_object) + } + + #[wasm_bindgen(js_name=createIdentifier)] + pub fn create_identifier(&self) -> IdentifierWrapper { + let identifier = self.0.create_identifier(); + identifier.into() + } +} \ No newline at end of file diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs new file mode 100644 index 00000000000..2ef5b38b667 --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs @@ -0,0 +1,3 @@ +pub use chain_asset_lock_proof::*; + +mod chain_asset_lock_proof; \ No newline at end of file diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs new file mode 100644 index 00000000000..f2213a683d6 --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -0,0 +1,15 @@ +mod chain; + +pub use chain::*; + +use wasm_bindgen::prelude::*; +use dpp::identity::state_transition::asset_lock_proof::AssetLockProof; + +#[wasm_bindgen(js_name=AssetLockProof)] +pub struct AssetLockProofWasm(AssetLockProof); + +impl From for AssetLockProofWasm { + fn from(v: AssetLockProof) -> Self { + AssetLockProofWasm(v) + } +} \ No newline at end of file diff --git a/packages/wasm-dpp/src/identity/state_transition/mod.rs b/packages/wasm-dpp/src/identity/state_transition/mod.rs new file mode 100644 index 00000000000..4281f953a69 --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/mod.rs @@ -0,0 +1,3 @@ +pub use asset_lock_proof::*; + +mod asset_lock_proof; \ No newline at end of file diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js new file mode 100644 index 00000000000..3ff9b9eaec8 --- /dev/null +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js @@ -0,0 +1,85 @@ +const crypto = require('crypto'); + +const { default: loadWasmDpp } = require('../../../../../dist'); +const getRawChainAssetLockProofFixture = require('../../../../../lib/test/fixtures/getRawChainAssetLockProofFixture'); + +function sha256(payload) { + return crypto.createHash('sha256') + .update(payload) + .digest(); +} + +describe('ChainAssetLockProof', () => { + let ChainAssetLockProof; + let Identifier; + let rawChainAssetLockProof; + let chainAssetLockProof; + + before(async () => { + ({ ChainAssetLockProof, Identifier } = await loadWasmDpp()); + + rawChainAssetLockProof = getRawChainAssetLockProofFixture(); + }); + + beforeEach(() => { + const { coreChainLockedHeight, outPoint } = rawChainAssetLockProof; + + chainAssetLockProof = new ChainAssetLockProof({ + coreChainLockedHeight, + outPoint, + }); + }); + + describe('#getType', () => { + it('should return correct type', () => { + expect(chainAssetLockProof.getType()) + .to.equal(rawChainAssetLockProof.type); + }); + }); + + describe('#getCoreChainLockedHeight', () => { + it('should return correct coreChainLockedHeight', () => { + expect(chainAssetLockProof.getCoreChainLockedHeight()) + .to.equal(rawChainAssetLockProof.coreChainLockedHeight); + }); + }); + + describe('#getOutPoint', () => { + it('should return correct outPoint', () => { + expect(chainAssetLockProof.getOutPoint()) + .to.deep.equal(rawChainAssetLockProof.outPoint); + }); + }); + + describe('#toJSON', () => { + it('should return correct JSON', () => { + const json = { + ...rawChainAssetLockProof, + outPoint: rawChainAssetLockProof.outPoint.toString('base64'), + }; + + expect(chainAssetLockProof.toJSON()) + .to.deep.equal(json); + }); + }); + + describe('#toObject', () => { + it('should return correct object', () => { + expect(chainAssetLockProof.toObject()) + .to.deep.equal(rawChainAssetLockProof); + }); + }); + + describe('#createIdentifier', () => { + it('should return correct identifier', () => { + const identifier = chainAssetLockProof.createIdentifier(); + + const expectedIdentifier = new Identifier( + sha256(sha256(rawChainAssetLockProof.outPoint)), + ); + + expect(identifier.toBuffer()) + .to.deep.equal(expectedIdentifier.toBuffer()); + }); + }); +}); From 6eeeab79601576fafd89368db62d702b28ef1888 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 2 Dec 2022 14:50:29 +0400 Subject: [PATCH 04/66] refactor(rs-dpp): return type for chain_asset_lock_proof#createIdentifier --- .../chain/chain_asset_lock_proof.rs | 17 +++++++++-------- .../state_transition/asset_lock_proof/mod.rs | 5 +---- .../chain/chain_asset_lock_proof.rs | 7 ++++--- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs index 4705aaf4c09..90dc0fc141a 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -1,9 +1,12 @@ use serde::{Deserialize, Serialize}; use serde_big_array::BigArray; -use crate::identifier::Identifier; -use crate::util::hash::hash; -use crate::util::vec::vec_to_array; +use crate::{ + identifier::Identifier, + util::hash::hash, + util::vec::vec_to_array, + errors::NonConsensusError, +}; #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] @@ -41,10 +44,8 @@ impl ChainAssetLockProof { } /// Create identifier - pub fn create_identifier(&self) -> Identifier { - return Identifier::new( - vec_to_array(hash(self.out_point()).as_ref()) - .expect("Expected hash function to give a 32 byte output"), - ); + pub fn create_identifier(&self) -> Result { + let array = vec_to_array(hash(self.out_point).as_ref())?; + Ok(Identifier::new(array)) } } diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index 336159e3057..fa8efd7afb9 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -114,10 +114,7 @@ impl AssetLockProof { pub fn create_identifier(&self) -> Result { match self { AssetLockProof::Instant(instant_proof) => instant_proof.create_identifier(), - AssetLockProof::Chain(chain_proof) => { - // TODO: fix return type - Ok(chain_proof.create_identifier()) - } + AssetLockProof::Chain(chain_proof) => chain_proof.create_identifier(), } } diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs index bad73ce692f..45325d71d9b 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -109,8 +109,9 @@ impl ChainAssetLockProofWasm { } #[wasm_bindgen(js_name=createIdentifier)] - pub fn create_identifier(&self) -> IdentifierWrapper { - let identifier = self.0.create_identifier(); - identifier.into() + pub fn create_identifier(&self) -> Result { + let identifier = self.0.create_identifier() + .map_err(|e| from_dpp_err(e.into()))?; + Ok(identifier.into()) } } \ No newline at end of file From 113deb2adbfb69fff20b348905e673c4d8a6436e Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 2 Dec 2022 17:50:45 +0400 Subject: [PATCH 05/66] refactor(rs-dpp): fix formatting --- .../chain/chain_asset_lock_proof.rs | 5 +- .../chain/chain_asset_lock_proof.rs | 54 +++++++++---------- .../asset_lock_proof/chain/mod.rs | 2 +- .../state_transition/asset_lock_proof/mod.rs | 4 +- .../src/identity/state_transition/mod.rs | 2 +- 5 files changed, 30 insertions(+), 37 deletions(-) diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs index 90dc0fc141a..4c78df89502 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -2,10 +2,7 @@ use serde::{Deserialize, Serialize}; use serde_big_array::BigArray; use crate::{ - identifier::Identifier, - util::hash::hash, - util::vec::vec_to_array, - errors::NonConsensusError, + errors::NonConsensusError, identifier::Identifier, util::hash::hash, util::vec::vec_to_array, }; #[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs index 45325d71d9b..bede3444001 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -1,26 +1,30 @@ +use serde::{Deserialize, Serialize}; use std::convert::TryInto; use wasm_bindgen::prelude::*; -use serde::{Deserialize, Serialize}; -use dpp::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; -use dpp::util::string_encoding; -use dpp::util::string_encoding::Encoding; use crate::{ - identifier::IdentifierWrapper, buffer::Buffer, - errors::{RustConversionError, from_dpp_err}, + errors::{from_dpp_err, RustConversionError}, + identifier::IdentifierWrapper, with_js_error, }; +use dpp::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; +use dpp::util::string_encoding; +use dpp::util::string_encoding::Encoding; #[wasm_bindgen(js_name=ChainAssetLockProof)] pub struct ChainAssetLockProofWasm(ChainAssetLockProof); impl From for ChainAssetLockProofWasm { - fn from(v: ChainAssetLockProof) -> Self { ChainAssetLockProofWasm(v) } + fn from(v: ChainAssetLockProof) -> Self { + ChainAssetLockProofWasm(v) + } } impl Into for ChainAssetLockProofWasm { - fn into(self) -> ChainAssetLockProof { self.0 } + fn into(self) -> ChainAssetLockProof { + self.0 + } } #[derive(Debug, Serialize, Deserialize)] @@ -38,17 +42,12 @@ impl ChainAssetLockProofWasm { with_js_error!(serde_wasm_bindgen::from_value(raw_parameters))?; let out_point: [u8; 36] = parameters.out_point.try_into().map_err(|_| { - RustConversionError::Error( - String::from( - "outPoint must be a 36 byte array" - ) - ).to_js_value() + RustConversionError::Error(String::from("outPoint must be a 36 byte array")) + .to_js_value() })?; - let chain_asset_lock_proof = ChainAssetLockProof::new( - parameters.core_chain_locked_height, - out_point, - ); + let chain_asset_lock_proof = + ChainAssetLockProof::new(parameters.core_chain_locked_height, out_point); Ok(ChainAssetLockProofWasm(chain_asset_lock_proof)) } @@ -72,10 +71,7 @@ impl ChainAssetLockProofWasm { pub fn to_json(&self) -> Result { let js_object = self.to_object()?; - let out_point_base64 = string_encoding::encode( - self.0.out_point(), - Encoding::Base64 - ); + let out_point_base64 = string_encoding::encode(self.0.out_point(), Encoding::Base64); js_sys::Reflect::set( &js_object, @@ -88,13 +84,11 @@ impl ChainAssetLockProofWasm { #[wasm_bindgen(js_name=toObject)] pub fn to_object(&self) -> Result { - let asset_lock_json = serde_json::to_value( - self.0.clone() - ).map_err(|e| from_dpp_err(e.into()))?; + let asset_lock_json = + serde_json::to_value(self.0.clone()).map_err(|e| from_dpp_err(e.into()))?; - let asset_lock_json_string = serde_json::to_string( - &asset_lock_json - ).map_err(|e| from_dpp_err(e.into()))?; + let asset_lock_json_string = + serde_json::to_string(&asset_lock_json).map_err(|e| from_dpp_err(e.into()))?; let js_object = js_sys::JSON::parse(&asset_lock_json_string)?; let out_point = self.get_out_point(); @@ -110,8 +104,10 @@ impl ChainAssetLockProofWasm { #[wasm_bindgen(js_name=createIdentifier)] pub fn create_identifier(&self) -> Result { - let identifier = self.0.create_identifier() + let identifier = self + .0 + .create_identifier() .map_err(|e| from_dpp_err(e.into()))?; Ok(identifier.into()) } -} \ No newline at end of file +} diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs index 2ef5b38b667..82cde964c44 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs @@ -1,3 +1,3 @@ pub use chain_asset_lock_proof::*; -mod chain_asset_lock_proof; \ No newline at end of file +mod chain_asset_lock_proof; diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index f2213a683d6..a296b280858 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -2,8 +2,8 @@ mod chain; pub use chain::*; -use wasm_bindgen::prelude::*; use dpp::identity::state_transition::asset_lock_proof::AssetLockProof; +use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=AssetLockProof)] pub struct AssetLockProofWasm(AssetLockProof); @@ -12,4 +12,4 @@ impl From for AssetLockProofWasm { fn from(v: AssetLockProof) -> Self { AssetLockProofWasm(v) } -} \ No newline at end of file +} diff --git a/packages/wasm-dpp/src/identity/state_transition/mod.rs b/packages/wasm-dpp/src/identity/state_transition/mod.rs index 4281f953a69..d3db05daee5 100644 --- a/packages/wasm-dpp/src/identity/state_transition/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/mod.rs @@ -1,3 +1,3 @@ pub use asset_lock_proof::*; -mod asset_lock_proof; \ No newline at end of file +mod asset_lock_proof; From e8ef49e84eade7ff1983a6601aab1dbf8d5e57ce Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 2 Dec 2022 18:10:21 +0400 Subject: [PATCH 06/66] refactor(wasm-dpp): removed unnecessary chain asset lock fixture --- .../getRawChainAssetLockProofFixture.js | 21 ---------- packages/wasm-dpp/src/identity/mod.rs | 2 +- .../ChainAssetLockProof.spec.js | 40 ++++++------------- 3 files changed, 13 insertions(+), 50 deletions(-) delete mode 100644 packages/wasm-dpp/lib/test/fixtures/getRawChainAssetLockProofFixture.js diff --git a/packages/wasm-dpp/lib/test/fixtures/getRawChainAssetLockProofFixture.js b/packages/wasm-dpp/lib/test/fixtures/getRawChainAssetLockProofFixture.js deleted file mode 100644 index b18831d8ba2..00000000000 --- a/packages/wasm-dpp/lib/test/fixtures/getRawChainAssetLockProofFixture.js +++ /dev/null @@ -1,21 +0,0 @@ -const { default: loadWasmDpp } = require('../../../dist'); - -function getRawChainAssetLockProofFixture() { - const outPoint = { - outpointHash: '6e200d059fb567ba19e92f5c2dcd3dde522fd4e0a50af223752db16158dabb1d', - outpointIndex: 0, - }; - - const binaryTransactionHash = Buffer.from(outPoint.outpointHash, 'hex'); - const indexBuffer = Buffer.alloc(4); - - indexBuffer.writeUInt32LE(outPoint.outpointIndex, 0); - - return { - coreChainLockedHeight: 42, - outPoint: Buffer.concat([binaryTransactionHash, indexBuffer]), - type: 1, - }; -} - -module.exports = getRawChainAssetLockProofFixture; diff --git a/packages/wasm-dpp/src/identity/mod.rs b/packages/wasm-dpp/src/identity/mod.rs index dfdc53e1c5e..be4641a7820 100644 --- a/packages/wasm-dpp/src/identity/mod.rs +++ b/packages/wasm-dpp/src/identity/mod.rs @@ -21,7 +21,7 @@ pub use identity_public_key::*; use state_transition::*; -mod state_transition; +pub mod state_transition; #[wasm_bindgen(js_name=Identity)] #[derive(Clone)] diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js index 3ff9b9eaec8..db8e24add2a 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js @@ -1,28 +1,20 @@ -const crypto = require('crypto'); +const getChainAssetLockFixture = require('@dashevo/dpp/lib/test/fixtures/getChainAssetLockProofFixture'); const { default: loadWasmDpp } = require('../../../../../dist'); -const getRawChainAssetLockProofFixture = require('../../../../../lib/test/fixtures/getRawChainAssetLockProofFixture'); - -function sha256(payload) { - return crypto.createHash('sha256') - .update(payload) - .digest(); -} describe('ChainAssetLockProof', () => { let ChainAssetLockProof; - let Identifier; - let rawChainAssetLockProof; let chainAssetLockProof; + let chainAssetLockProofJS; before(async () => { - ({ ChainAssetLockProof, Identifier } = await loadWasmDpp()); + ({ ChainAssetLockProof } = await loadWasmDpp()); - rawChainAssetLockProof = getRawChainAssetLockProofFixture(); + chainAssetLockProofJS = getChainAssetLockFixture(); }); beforeEach(() => { - const { coreChainLockedHeight, outPoint } = rawChainAssetLockProof; + const { coreChainLockedHeight, outPoint } = chainAssetLockProofJS; chainAssetLockProof = new ChainAssetLockProof({ coreChainLockedHeight, @@ -33,53 +25,45 @@ describe('ChainAssetLockProof', () => { describe('#getType', () => { it('should return correct type', () => { expect(chainAssetLockProof.getType()) - .to.equal(rawChainAssetLockProof.type); + .to.equal(chainAssetLockProofJS.getType()); }); }); describe('#getCoreChainLockedHeight', () => { it('should return correct coreChainLockedHeight', () => { expect(chainAssetLockProof.getCoreChainLockedHeight()) - .to.equal(rawChainAssetLockProof.coreChainLockedHeight); + .to.equal(chainAssetLockProofJS.getCoreChainLockedHeight()); }); }); describe('#getOutPoint', () => { it('should return correct outPoint', () => { expect(chainAssetLockProof.getOutPoint()) - .to.deep.equal(rawChainAssetLockProof.outPoint); + .to.deep.equal(chainAssetLockProofJS.getOutPoint()); }); }); describe('#toJSON', () => { it('should return correct JSON', () => { - const json = { - ...rawChainAssetLockProof, - outPoint: rawChainAssetLockProof.outPoint.toString('base64'), - }; - expect(chainAssetLockProof.toJSON()) - .to.deep.equal(json); + .to.deep.equal(chainAssetLockProofJS.toJSON()); }); }); describe('#toObject', () => { it('should return correct object', () => { expect(chainAssetLockProof.toObject()) - .to.deep.equal(rawChainAssetLockProof); + .to.deep.equal(chainAssetLockProofJS.toObject()); }); }); describe('#createIdentifier', () => { it('should return correct identifier', () => { const identifier = chainAssetLockProof.createIdentifier(); - - const expectedIdentifier = new Identifier( - sha256(sha256(rawChainAssetLockProof.outPoint)), - ); + const identifierJS = chainAssetLockProofJS.createIdentifier(); expect(identifier.toBuffer()) - .to.deep.equal(expectedIdentifier.toBuffer()); + .to.deep.equal(identifierJS.toBuffer()); }); }); }); From 91266824f3d35734228e06b7741ad4c66472d9ec Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 2 Dec 2022 19:18:52 +0400 Subject: [PATCH 07/66] feat(wasm-dpp): bootstrap instant_asset_lock_proof.rs binding --- .../chain/chain_asset_lock_proof.rs | 12 ---- .../asset_lock_proof/chain/mod.rs | 2 +- .../instant/instant_asset_lock_proof.rs | 51 ++++++++++++++ .../asset_lock_proof/instant/mod.rs | 3 + .../state_transition/asset_lock_proof/mod.rs | 2 + .../InstantAssetLockProof.spec.js | 69 +++++++++++++++++++ 6 files changed, 126 insertions(+), 13 deletions(-) create mode 100644 packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs create mode 100644 packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/mod.rs create mode 100644 packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs index bede3444001..0b1fe3e17c3 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -15,18 +15,6 @@ use dpp::util::string_encoding::Encoding; #[wasm_bindgen(js_name=ChainAssetLockProof)] pub struct ChainAssetLockProofWasm(ChainAssetLockProof); -impl From for ChainAssetLockProofWasm { - fn from(v: ChainAssetLockProof) -> Self { - ChainAssetLockProofWasm(v) - } -} - -impl Into for ChainAssetLockProofWasm { - fn into(self) -> ChainAssetLockProof { - self.0 - } -} - #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] struct ChainAssetLockProofParams { diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs index 82cde964c44..6f0470d5794 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs @@ -1,3 +1,3 @@ pub use chain_asset_lock_proof::*; -mod chain_asset_lock_proof; +pub mod chain_asset_lock_proof; diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs new file mode 100644 index 00000000000..8725ddc3bcc --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs @@ -0,0 +1,51 @@ +use serde::{Deserialize, Serialize}; +use std::convert::TryInto; +use wasm_bindgen::prelude::*; + +use crate::{buffer::Buffer, errors::RustConversionError, with_js_error}; +use dpp::identity::state_transition::asset_lock_proof::instant::{ + InstantAssetLockProof, RawInstantLock, +}; + +#[wasm_bindgen(js_name=InstantAssetLockProof)] +pub struct InstantAssetLockProofWasm(InstantAssetLockProof); + +impl From for InstantAssetLockProofWasm { + fn from(v: InstantAssetLockProof) -> Self { + InstantAssetLockProofWasm(v) + } +} + +#[wasm_bindgen(js_class = InstantAssetLockProof)] +impl InstantAssetLockProofWasm { + #[wasm_bindgen(constructor)] + pub fn new(raw_parameters: JsValue) -> Result { + let raw_instant_lock: RawInstantLock = + with_js_error!(serde_wasm_bindgen::from_value(raw_parameters))?; + + let instant_asset_lock_proof: InstantAssetLockProof = + raw_instant_lock.try_into().map_err(|_| { + RustConversionError::Error(String::from("object passed is not a raw Instant Lock")) + .to_js_value() + })?; + + Ok(instant_asset_lock_proof.into()) + } + + #[wasm_bindgen(js_name=getType)] + pub fn get_type(&self) -> u8 { + self.0.asset_lock_type() + } + + #[wasm_bindgen(js_name=getOutputIndex)] + pub fn get_output_index(&self) -> usize { + self.0.output_index() + } + + #[wasm_bindgen(js_name=getOutPoint)] + pub fn get_out_point(&self) -> Option { + self.0 + .out_point() + .map(|out_point| Buffer::from_bytes(out_point.as_slice())) + } +} diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/mod.rs new file mode 100644 index 00000000000..420bf71d3e7 --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/mod.rs @@ -0,0 +1,3 @@ +pub use instant_asset_lock_proof::*; + +pub mod instant_asset_lock_proof; diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index a296b280858..a47ccb8a98c 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -1,6 +1,8 @@ mod chain; +mod instant; pub use chain::*; +pub use instant::*; use dpp::identity::state_transition::asset_lock_proof::AssetLockProof; use wasm_bindgen::prelude::*; diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js new file mode 100644 index 00000000000..bd61aaf87ec --- /dev/null +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js @@ -0,0 +1,69 @@ +const getInstantAssetLockProofFixture = require('@dashevo/dpp/lib/test/fixtures/getInstantAssetLockProofFixture'); + +const { default: loadWasmDpp } = require('../../../../../dist'); + +describe('InstantAssetLockProof', () => { + let InstantAssetLockProof; + let instantAssetLockProof; + let instantAssetLockProofJS; + + before(async () => { + ({ InstantAssetLockProof } = await loadWasmDpp()); + + instantAssetLockProofJS = getInstantAssetLockProofFixture(); + }); + + beforeEach(() => { + const { + type, + outputIndex, + transaction, + instantLock, + } = instantAssetLockProofJS.toObject(); + // const { coreChainLockedHeight, outPoint } = inst; + + instantAssetLockProof = new InstantAssetLockProof({ + type, + outputIndex, + transaction, + instantLock, + }); + }); + + describe('#getType', () => { + it('should return correct type', () => { + expect(instantAssetLockProof.getType()) + .to.equal(instantAssetLockProofJS.getType()); + }); + }); + + describe('#getOutputIndex', () => { + it('should return correct type', () => { + expect(instantAssetLockProof.getOutputIndex()) + .to.equal(instantAssetLockProofJS.getOutputIndex()); + }); + }); + + describe('#getOutPoint', () => { + // Buffers mismatch + it.skip('should return correct outPoint', () => { + // eslint-disable-next-line + // RS -> + // eslint-disable-next-line + // JS -> + expect(instantAssetLockProof.getOutPoint()) + .to.deep.equal(instantAssetLockProofJS.getOutPoint()); + }); + }); + + // describe('#getOutput', () => { + // it('should return correct output', () => { + // console.log(instantAssetLockProofJS.getOutput()); + // }); + // }); + // describe('#createIdentifier') + // describe('#getInstantLock') + // describe('#getTransaction') + // describe('#toObject') + // describe('#toJSON') +}); From b601b6f97b81fe31c0a2b2f5983e6e9aa4da52b2 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Mon, 5 Dec 2022 19:01:07 +0400 Subject: [PATCH 08/66] feat(wasm-dpp): instant_asset_lock_proof.rs bindings for getOutPoint and getOutput --- .../instant/instant_asset_lock_proof.rs | 29 ++++++++++++++++++- .../InstantAssetLockProof.spec.js | 17 +++++------ 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs index 8725ddc3bcc..1f7be8aa6d1 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs @@ -1,12 +1,29 @@ +use dpp::dashcore::blockdata::{script::Script, transaction::txout::TxOut}; use serde::{Deserialize, Serialize}; use std::convert::TryInto; use wasm_bindgen::prelude::*; -use crate::{buffer::Buffer, errors::RustConversionError, with_js_error}; +use crate::{ + buffer::Buffer, + errors::{from_dpp_err, RustConversionError}, + with_js_error, +}; use dpp::identity::state_transition::asset_lock_proof::instant::{ InstantAssetLockProof, RawInstantLock, }; +#[derive(Serialize, Deserialize)] +#[serde(remote = "TxOut")] +struct TxOutJS { + #[serde(rename = "satoshis")] + value: u64, + #[serde(rename = "script")] + script_pubkey: Script, +} + +#[derive(Serialize)] +struct TxOutSerdeHelper<'a>(#[serde(with = "TxOutJS")] &'a TxOut); + #[wasm_bindgen(js_name=InstantAssetLockProof)] pub struct InstantAssetLockProofWasm(InstantAssetLockProof); @@ -48,4 +65,14 @@ impl InstantAssetLockProofWasm { .out_point() .map(|out_point| Buffer::from_bytes(out_point.as_slice())) } + + #[wasm_bindgen(js_name=getOutput)] + pub fn get_output(&self) -> Result { + let output = self.0.output().unwrap(); + let output_json_string = + serde_json::to_string(&TxOutSerdeHelper(output)).map_err(|e| from_dpp_err(e.into()))?; + + let js_object = js_sys::JSON::parse(&output_json_string)?; + Ok(js_object) + } } diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js index bd61aaf87ec..6d3b63cc1aa 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js @@ -46,21 +46,18 @@ describe('InstantAssetLockProof', () => { describe('#getOutPoint', () => { // Buffers mismatch - it.skip('should return correct outPoint', () => { - // eslint-disable-next-line - // RS -> - // eslint-disable-next-line - // JS -> + it('should return correct outPoint', () => { expect(instantAssetLockProof.getOutPoint()) .to.deep.equal(instantAssetLockProofJS.getOutPoint()); }); }); - // describe('#getOutput', () => { - // it('should return correct output', () => { - // console.log(instantAssetLockProofJS.getOutput()); - // }); - // }); + describe('#getOutput', () => { + it('should return correct output', () => { + expect(instantAssetLockProof.getOutput()) + .to.deep.equal(instantAssetLockProofJS.getOutput().toObject()); + }); + }); // describe('#createIdentifier') // describe('#getInstantLock') // describe('#getTransaction') From 643aea4dd8e6480e9ebb704ef2315c4c9efc54ee Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Mon, 5 Dec 2022 20:35:28 +0400 Subject: [PATCH 09/66] feat(wasm-dpp): instant_asset_lock_proof.rs finish bindings --- .../instant/instant_asset_lock_proof.rs | 94 ++++++++++++++++++- .../InstantAssetLockProof.spec.js | 49 +++++++++- 2 files changed, 137 insertions(+), 6 deletions(-) diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs index 1f7be8aa6d1..3c25b4e7e40 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs @@ -1,4 +1,12 @@ -use dpp::dashcore::blockdata::{script::Script, transaction::txout::TxOut}; +use dpp::{ + dashcore::{ + blockdata::{script::Script, transaction::txout::TxOut}, + consensus::encode::serialize, + }, + util::string_encoding, + util::string_encoding::Encoding, +}; + use serde::{Deserialize, Serialize}; use std::convert::TryInto; use wasm_bindgen::prelude::*; @@ -6,6 +14,7 @@ use wasm_bindgen::prelude::*; use crate::{ buffer::Buffer, errors::{from_dpp_err, RustConversionError}, + identifier::IdentifierWrapper, with_js_error, }; use dpp::identity::state_transition::asset_lock_proof::instant::{ @@ -75,4 +84,87 @@ impl InstantAssetLockProofWasm { let js_object = js_sys::JSON::parse(&output_json_string)?; Ok(js_object) } + + #[wasm_bindgen(js_name=createIdentifier)] + pub fn create_identifier(&self) -> Result { + let identifier = self + .0 + .create_identifier() + .map_err(|e| from_dpp_err(e.into()))?; + Ok(identifier.into()) + } + + #[wasm_bindgen(js_name=getInstantLock)] + pub fn get_instant_lock(&self) -> Buffer { + let instant_lock = self.0.instant_lock(); + let serialized_instant_lock = serialize(instant_lock); + Buffer::from_bytes(serialized_instant_lock.as_slice()) + } + + #[wasm_bindgen(js_name=getTransaction)] + pub fn get_transaction(&self) -> Buffer { + let transaction = self.0.transaction(); + let serialized_transaction = serialize(transaction); + Buffer::from_bytes(serialized_transaction.as_slice()) + } + + #[wasm_bindgen(js_name=toObject)] + pub fn to_object(&self) -> Result { + let asset_lock_json = + serde_json::to_value(self.0.clone()).map_err(|e| from_dpp_err(e.into()))?; + + let asset_lock_json_string = + serde_json::to_string(&asset_lock_json).map_err(|e| from_dpp_err(e.into()))?; + let js_object = js_sys::JSON::parse(&asset_lock_json_string)?; + + let transaction = self.get_transaction(); + let instant_lock = self.get_instant_lock(); + + js_sys::Reflect::set( + &js_object, + &"transaction".to_owned().into(), + &JsValue::from(transaction), + )?; + + js_sys::Reflect::set( + &js_object, + &"instantLock".to_owned().into(), + &JsValue::from(instant_lock), + )?; + + Ok(js_object) + } + + #[wasm_bindgen(js_name=toJSON)] + pub fn to_json(&self) -> Result { + let js_object = self.to_object()?; + + let transaction = self.0.transaction(); + let serialized_transaction = serialize(transaction); + + let instant_lock = self.0.instant_lock(); + let serialized_instant_lock = serialize(instant_lock); + + let instant_lock_base64 = + string_encoding::encode(serialized_instant_lock.as_slice(), Encoding::Base64); + + let mut transaction_hex = String::new(); + for &byte in serialized_transaction.as_slice() { + transaction_hex.push_str(&format!("{:02x}", byte)); + } + + js_sys::Reflect::set( + &js_object, + &"transaction".to_owned().into(), + &JsValue::from(transaction_hex), + )?; + + js_sys::Reflect::set( + &js_object, + &"instantLock".to_owned().into(), + &JsValue::from(instant_lock_base64), + )?; + + Ok(js_object) + } } diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js index 6d3b63cc1aa..3e16bcf10ef 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js @@ -58,9 +58,48 @@ describe('InstantAssetLockProof', () => { .to.deep.equal(instantAssetLockProofJS.getOutput().toObject()); }); }); - // describe('#createIdentifier') - // describe('#getInstantLock') - // describe('#getTransaction') - // describe('#toObject') - // describe('#toJSON') + + describe('#createIdentifier', () => { + it('should return correct identifier', () => { + const identifier = instantAssetLockProof.createIdentifier(); + const identifierJS = instantAssetLockProofJS.createIdentifier(); + + expect(identifier.toBuffer()) + .to.deep.equal(identifierJS.toBuffer()); + }); + }); + + describe('#getInstantLock', () => { + it('should return correct instant lock', () => { + const instantLock = instantAssetLockProof.getInstantLock(); + const instantLockJS = instantAssetLockProofJS.getInstantLock(); + + expect(instantLock) + .to.deep.equal(instantLockJS.toBuffer()); + }); + }); + + describe('#getTransaction', () => { + it('should return correct transaction', () => { + const transaction = instantAssetLockProof.getTransaction(); + const transactionJS = instantAssetLockProofJS.getTransaction(); + + expect(transaction) + .to.deep.equal(transactionJS.toBuffer()); + }); + }); + + describe('#toObject', () => { + it('should return correct object', () => { + expect(instantAssetLockProof.toObject()) + .to.deep.equal(instantAssetLockProofJS.toObject()); + }); + }); + + describe('#toJSON', () => { + it('should return correct JSON', () => { + expect(instantAssetLockProof.toJSON()) + .to.deep.equal(instantAssetLockProofJS.toJSON()); + }); + }); }); From 4e0a9977a51719faecf4815e91bffc8c172543b2 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 6 Dec 2022 14:50:06 +0400 Subject: [PATCH 10/66] feat(wasm-dpp): createAssetLockProofInstance binding --- .../state_transition/asset_lock_proof/mod.rs | 24 ++++++++++++++++++- .../createAssetLockProofInstance.spec.js | 21 +++++++++++++--- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index a47ccb8a98c..2af9b1baf55 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -4,9 +4,11 @@ mod instant; pub use chain::*; pub use instant::*; -use dpp::identity::state_transition::asset_lock_proof::AssetLockProof; +use crate::errors::RustConversionError; use wasm_bindgen::prelude::*; +use dpp::identity::state_transition::asset_lock_proof::AssetLockProof; + #[wasm_bindgen(js_name=AssetLockProof)] pub struct AssetLockProofWasm(AssetLockProof); @@ -15,3 +17,23 @@ impl From for AssetLockProofWasm { AssetLockProofWasm(v) } } + +#[wasm_bindgen(js_name=createAssetLockProofInstance)] +pub fn create_asset_lock_proof_instance(raw_parameters: JsValue) -> Result { + let lock_type = js_sys::Reflect::get(&raw_parameters, &JsValue::from_str("type")) + .map_err(|_| { + RustConversionError::Error(String::from("error getting type from raw asset lock")) + .to_js_value() + })? + .as_f64() + .ok_or_else(|| JsValue::from_str("asset lock type must be a number"))? + as u8; + + match lock_type { + 0 => InstantAssetLockProofWasm::new(raw_parameters).map(|v| v.into()), + 1 => ChainAssetLockProofWasm::new(raw_parameters).map(|v| v.into()), + _ => Err( + RustConversionError::Error(String::from("unrecognized asset lock type")).to_js_value(), + ), + } +} diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js index b5bdea509e8..2f00968fce3 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js @@ -1,21 +1,36 @@ -const createAssetLockProofInstance = require('@dashevo/dpp/lib/identity/stateTransition/assetLockProof/createAssetLockProofInstance'); +const createAssetLockProofInstanceJS = require('@dashevo/dpp/lib/identity/stateTransition/assetLockProof/createAssetLockProofInstance'); const getChainAssetLockFixture = require('@dashevo/dpp/lib/test/fixtures/getChainAssetLockProofFixture'); const getInstantAssetLockProofFixture = require('@dashevo/dpp/lib/test/fixtures/getInstantAssetLockProofFixture'); -const ChainAssetLockProof = require('@dashevo/dpp/lib/identity/stateTransition/assetLockProof/chain/ChainAssetLockProof'); -const InstantAssetLockProof = require('@dashevo/dpp/lib/identity/stateTransition/assetLockProof/instant/InstantAssetLockProof'); +const { default: loadWasmDpp } = require('../../../../../dist'); describe('createAssetLockProofInstance', () => { + let createAssetLockProofInstance; + let InstantAssetLockProof; + let ChainAssetLockProof; + + before(async () => { + ({ + createAssetLockProofInstance, + InstantAssetLockProof, + ChainAssetLockProof, + } = await loadWasmDpp()); + }); + it('should create an instance of InstantAssetLockProof', () => { const assetLockProofFixture = getInstantAssetLockProofFixture(); + const instanceJS = createAssetLockProofInstanceJS(assetLockProofFixture.toObject()); const instance = createAssetLockProofInstance(assetLockProofFixture.toObject()); + expect(instance.toObject()).to.deep.equal(instanceJS.toObject()); expect(instance).to.be.an.instanceOf(InstantAssetLockProof); }); it('should create an instance of ChainAssetLockProof', () => { const assetLockProofFixture = getChainAssetLockFixture(); + const instanceJS = createAssetLockProofInstanceJS(assetLockProofFixture.toObject()); const instance = createAssetLockProofInstance(assetLockProofFixture.toObject()); + expect(instance.toObject()).to.deep.equal(instanceJS.toObject()); expect(instance).to.be.an.instanceOf(ChainAssetLockProof); }); }); From 63db5168fd7e716a454817b3ca516bacd01fa2ab Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Thu, 8 Dec 2022 17:26:40 +0400 Subject: [PATCH 11/66] feat(wasm-dpp): add identity_create_transition constructor --- .../chain/chain_asset_lock_proof.rs | 6 ++ .../instant/instant_asset_lock_proof.rs | 1 + .../identity_create_transition.rs | 72 +++++++++++++++++++ .../identity_create_transition/mod.rs | 3 + .../src/identity/state_transition/mod.rs | 2 + .../IdentityCreateTransition.spec.js | 54 ++++++++------ 6 files changed, 115 insertions(+), 23 deletions(-) create mode 100644 packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs create mode 100644 packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs index 0b1fe3e17c3..0a6099cf608 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -22,6 +22,12 @@ struct ChainAssetLockProofParams { out_point: Vec, } +impl From for ChainAssetLockProofWasm { + fn from(v: ChainAssetLockProof) -> Self { + ChainAssetLockProofWasm(v) + } +} + #[wasm_bindgen(js_class = ChainAssetLockProof)] impl ChainAssetLockProofWasm { #[wasm_bindgen(constructor)] diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs index 3c25b4e7e40..a9176bd5f16 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs @@ -33,6 +33,7 @@ struct TxOutJS { #[derive(Serialize)] struct TxOutSerdeHelper<'a>(#[serde(with = "TxOutJS")] &'a TxOut); +#[derive(Debug, Deserialize, Serialize)] #[wasm_bindgen(js_name=InstantAssetLockProof)] pub struct InstantAssetLockProofWasm(InstantAssetLockProof); diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs new file mode 100644 index 00000000000..bcd386c77f7 --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -0,0 +1,72 @@ +use serde::{Deserialize, Serialize}; +use wasm_bindgen::prelude::*; + +use crate::{ + errors::RustConversionError, + identity::{ + state_transition::asset_lock_proof::{ChainAssetLockProofWasm, InstantAssetLockProofWasm}, + IdentityPublicKeyWasm, + }, + with_js_error, +}; +use dpp::identity::state_transition::asset_lock_proof::AssetLockProof; +use dpp::identity::{ + state_transition::identity_create_transition::IdentityCreateTransition, IdentityPublicKey, +}; + +#[wasm_bindgen(js_name=IdentityCreateTransition)] +pub struct IdentityCreateTransitionWasm(IdentityCreateTransition); + +#[derive(Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +struct IdentityCreateTransitionParams { + asset_lock_proof: InstantAssetLockProofWasm, + public_keys: Vec, +} + +impl From for IdentityCreateTransitionWasm { + fn from(v: IdentityCreateTransition) -> Self { + IdentityCreateTransitionWasm(v) + } +} + +#[wasm_bindgen(js_class = IdentityCreateTransition)] +impl IdentityCreateTransitionWasm { + #[wasm_bindgen(constructor)] + pub fn new(raw_parameters: JsValue) -> Result { + let parameters: IdentityCreateTransitionParams = + with_js_error!(serde_wasm_bindgen::from_value(raw_parameters))?; + + let raw_state_transition = with_js_error!(serde_json::to_value(¶meters))?; + + let identity_create_transition = IdentityCreateTransition::new(raw_state_transition) + .map_err(|e| RustConversionError::Error(e.to_string()).to_js_value())?; + + Ok(identity_create_transition.into()) + } + + #[wasm_bindgen(getter)] + #[wasm_bindgen(js_name=publicKeys)] + pub fn public_keys(&self) -> Vec { + self.0 + .get_public_keys() + .iter() + .map(IdentityPublicKey::to_owned) + .map(IdentityPublicKeyWasm::from) + .map(JsValue::from) + .collect() + } + + #[wasm_bindgen(js_name=getAssetLockProof)] + pub fn get_asset_lock_proof(&self) -> JsValue { + let asset_lock_proof = self.0.get_asset_lock_proof().to_owned(); + match asset_lock_proof { + AssetLockProof::Instant(instant_asset_lock_proof) => { + InstantAssetLockProofWasm::from(instant_asset_lock_proof).into() + } + AssetLockProof::Chain(chain_asset_lock_proof) => { + ChainAssetLockProofWasm::from(chain_asset_lock_proof).into() + } + } + } +} diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs new file mode 100644 index 00000000000..1de908f2b11 --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs @@ -0,0 +1,3 @@ +pub use identity_create_transition::*; + +pub mod identity_create_transition; diff --git a/packages/wasm-dpp/src/identity/state_transition/mod.rs b/packages/wasm-dpp/src/identity/state_transition/mod.rs index d3db05daee5..bdcb355ae6a 100644 --- a/packages/wasm-dpp/src/identity/state_transition/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/mod.rs @@ -1,3 +1,5 @@ pub use asset_lock_proof::*; +pub use identity_create_transition::*; mod asset_lock_proof; +mod identity_create_transition; diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js index 0194e57acdc..4b647d72ff2 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js @@ -5,40 +5,48 @@ const stateTransitionTypes = require( ); const protocolVersion = require('@dashevo/dpp/lib/version/protocolVersion'); -const IdentityCreateTransition = require('@dashevo/dpp/lib/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition'); const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); const InstantAssetLockProof = require('@dashevo/dpp/lib/identity/stateTransition/assetLockProof/instant/InstantAssetLockProof'); +const { default: loadWasmDpp } = require('../../../../../dist'); + describe('IdentityCreateTransition', () => { let rawStateTransition; + let stateTransitionJS; let stateTransition; + let IdentityCreateTransition; + + before(async () => { + ({ IdentityCreateTransition } = await loadWasmDpp()); + }); beforeEach(() => { - stateTransition = getIdentityCreateTransitionFixture(); - rawStateTransition = stateTransition.toObject(); + stateTransitionJS = getIdentityCreateTransitionFixture(); + rawStateTransition = stateTransitionJS.toObject(); + + stateTransition = new IdentityCreateTransition(rawStateTransition); }); describe('#constructor', () => { it('should create an instance with specified data', () => { - expect(stateTransition.getAssetLockProof().toObject()).to.deep.equal( - rawStateTransition.assetLockProof, - ); + // console.log(stateTransition.getAssetLockProof().toObject()); + expect(stateTransition.getAssetLockProof().toObject()) + .to.deep.equal(stateTransition.getAssetLockProof().toObject()); - expect(stateTransition.publicKeys).to.deep.equal([ - new IdentityPublicKey(rawStateTransition.publicKeys[0]), - ]); + expect(stateTransition.publicKeys.map((key) => key.toJSON())) + .to.deep.equal(stateTransitionJS.publicKeys.map((key) => key.toJSON())); }); }); - describe('#getType', () => { + describe.skip('#getType', () => { it('should return IDENTITY_CREATE type', () => { expect(stateTransition.getType()).to.equal(stateTransitionTypes.IDENTITY_CREATE); }); }); - describe('#setAssetLockProof', () => { + describe.skip('#setAssetLockProof', () => { it('should set asset lock proof', () => { stateTransition.setAssetLockProof( new InstantAssetLockProof(rawStateTransition.assetLockProof), @@ -59,7 +67,7 @@ describe('IdentityCreateTransition', () => { }); }); - describe('#getAssetLockProof', () => { + describe.skip('#getAssetLockProof', () => { it('should return currently set locked OutPoint', () => { expect(stateTransition.getAssetLockProof().toObject()).to.deep.equal( rawStateTransition.assetLockProof, @@ -67,7 +75,7 @@ describe('IdentityCreateTransition', () => { }); }); - describe('#setPublicKeys', () => { + describe.skip('#setPublicKeys', () => { it('should set public keys', () => { const publicKeys = [new IdentityPublicKey(), new IdentityPublicKey()]; @@ -77,7 +85,7 @@ describe('IdentityCreateTransition', () => { }); }); - describe('#getPublicKeys', () => { + describe.skip('#getPublicKeys', () => { it('should return set public keys', () => { expect(stateTransition.getPublicKeys()).to.deep.equal( rawStateTransition.publicKeys.map((rawPublicKey) => new IdentityPublicKey(rawPublicKey)), @@ -85,7 +93,7 @@ describe('IdentityCreateTransition', () => { }); }); - describe('#addPublicKeys', () => { + describe.skip('#addPublicKeys', () => { it('should add more public keys', () => { const publicKeys = [new IdentityPublicKey(), new IdentityPublicKey()]; @@ -95,7 +103,7 @@ describe('IdentityCreateTransition', () => { }); }); - describe('#getIdentityId', () => { + describe.skip('#getIdentityId', () => { it('should return identity id', () => { expect(stateTransition.getIdentityId()).to.deep.equal( stateTransition.getAssetLockProof().createIdentifier(), @@ -103,7 +111,7 @@ describe('IdentityCreateTransition', () => { }); }); - describe('#getOwnerId', () => { + describe.skip('#getOwnerId', () => { it('should return owner id', () => { expect(stateTransition.getOwnerId()).to.equal( stateTransition.getIdentityId(), @@ -111,7 +119,7 @@ describe('IdentityCreateTransition', () => { }); }); - describe('#toObject', () => { + describe.skip('#toObject', () => { it('should return raw state transition', () => { rawStateTransition = stateTransition.toObject(); @@ -136,7 +144,7 @@ describe('IdentityCreateTransition', () => { }); }); - describe('#toJSON', () => { + describe.skip('#toJSON', () => { it('should return JSON representation of state transition', () => { const jsonStateTransition = stateTransition.toJSON(); @@ -150,7 +158,7 @@ describe('IdentityCreateTransition', () => { }); }); - describe('#getModifiedDataIds', () => { + describe.skip('#getModifiedDataIds', () => { it('should return ids of created identities', () => { const result = stateTransition.getModifiedDataIds(); @@ -164,19 +172,19 @@ describe('IdentityCreateTransition', () => { }); }); - describe('#isDataContractStateTransition', () => { + describe.skip('#isDataContractStateTransition', () => { it('should return false', () => { expect(stateTransition.isDataContractStateTransition()).to.be.false(); }); }); - describe('#isDocumentStateTransition', () => { + describe.skip('#isDocumentStateTransition', () => { it('should return false', () => { expect(stateTransition.isDocumentStateTransition()).to.be.false(); }); }); - describe('#isIdentityStateTransition', () => { + describe.skip('#isIdentityStateTransition', () => { it('should return true', () => { expect(stateTransition.isIdentityStateTransition()).to.be.true(); }); From 566bf073a2e4400f962109340767bf45bce7ea8e Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Thu, 8 Dec 2022 20:19:12 +0400 Subject: [PATCH 12/66] feat(wasm-dpp): IdentityCreateTransition set and get assetLockProof --- .../chain/chain_asset_lock_proof.rs | 6 +++ .../instant/instant_asset_lock_proof.rs | 6 +++ .../state_transition/asset_lock_proof/mod.rs | 44 +++++++++++++++++-- .../identity_create_transition.rs | 30 +++++++++++++ .../IdentityCreateTransition.spec.js | 20 ++++----- 5 files changed, 92 insertions(+), 14 deletions(-) diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs index 0a6099cf608..f62ffa7ed61 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -28,6 +28,12 @@ impl From for ChainAssetLockProofWasm { } } +impl From for ChainAssetLockProof { + fn from(v: ChainAssetLockProofWasm) -> Self { + v.0 + } +} + #[wasm_bindgen(js_class = ChainAssetLockProof)] impl ChainAssetLockProofWasm { #[wasm_bindgen(constructor)] diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs index a9176bd5f16..3475a9b68fd 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs @@ -43,6 +43,12 @@ impl From for InstantAssetLockProofWasm { } } +impl From for InstantAssetLockProof { + fn from(v: InstantAssetLockProofWasm) -> Self { + v.0 + } +} + #[wasm_bindgen(js_class = InstantAssetLockProof)] impl InstantAssetLockProofWasm { #[wasm_bindgen(constructor)] diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index 2af9b1baf55..baf2cba6e31 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -3,12 +3,15 @@ mod instant; pub use chain::*; pub use instant::*; +use serde::Serialize; -use crate::errors::RustConversionError; +use crate::{errors::RustConversionError, with_js_error}; use wasm_bindgen::prelude::*; +use crate::Deserialize; use dpp::identity::state_transition::asset_lock_proof::AssetLockProof; +#[derive(Deserialize)] #[wasm_bindgen(js_name=AssetLockProof)] pub struct AssetLockProofWasm(AssetLockProof); @@ -18,9 +21,35 @@ impl From for AssetLockProofWasm { } } -#[wasm_bindgen(js_name=createAssetLockProofInstance)] -pub fn create_asset_lock_proof_instance(raw_parameters: JsValue) -> Result { - let lock_type = js_sys::Reflect::get(&raw_parameters, &JsValue::from_str("type")) +impl From for AssetLockProof { + fn from(v: AssetLockProofWasm) -> Self { + v.0 + } +} + +#[wasm_bindgen(js_class = AssetLockProof)] +impl AssetLockProofWasm { + #[wasm_bindgen(constructor)] + pub fn new(raw_asset_lock_proof: JsValue) -> Result { + let lock_type = get_lock_type(&raw_asset_lock_proof)?; + + match lock_type { + 0 => Ok(Self::from(AssetLockProof::Instant( + InstantAssetLockProofWasm::new(raw_asset_lock_proof)?.into(), + ))), + 1 => Ok(Self::from(AssetLockProof::Chain( + ChainAssetLockProofWasm::new(raw_asset_lock_proof)?.into(), + ))), + _ => Err( + RustConversionError::Error(String::from("unrecognized asset lock type")) + .to_js_value(), + ), + } + } +} + +fn get_lock_type(raw_asset_lock_proof: &JsValue) -> Result { + let lock_type = js_sys::Reflect::get(&raw_asset_lock_proof, &JsValue::from_str("type")) .map_err(|_| { RustConversionError::Error(String::from("error getting type from raw asset lock")) .to_js_value() @@ -29,6 +58,13 @@ pub fn create_asset_lock_proof_instance(raw_parameters: JsValue) -> Result Result { + let lock_type = get_lock_type(&raw_parameters)?; + match lock_type { 0 => InstantAssetLockProofWasm::new(raw_parameters).map(|v| v.into()), 1 => ChainAssetLockProofWasm::new(raw_parameters).map(|v| v.into()), diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index bcd386c77f7..5d10fcfd1b9 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -1,6 +1,8 @@ use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; +use crate::identifier::IdentifierWrapper; +use crate::state_transition::AssetLockProofWasm; use crate::{ errors::RustConversionError, identity::{ @@ -57,6 +59,23 @@ impl IdentityCreateTransitionWasm { .collect() } + #[wasm_bindgen(js_name=setAssetLockProof)] + pub fn set_asset_lock_proof(&mut self, asset_lock_proof: JsValue) -> Result<(), JsValue> { + let asset_lock_proof = AssetLockProofWasm::new(asset_lock_proof)?; + + self.0 + .set_asset_lock_proof(asset_lock_proof.into()) + .map_err(|e| RustConversionError::Error(e.to_string()).to_js_value())?; + + Ok(()) + } + + #[wasm_bindgen(getter)] + #[wasm_bindgen(js_name=assetLockProof)] + pub fn asset_lock_proof(&self) -> JsValue { + self.get_asset_lock_proof() + } + #[wasm_bindgen(js_name=getAssetLockProof)] pub fn get_asset_lock_proof(&self) -> JsValue { let asset_lock_proof = self.0.get_asset_lock_proof().to_owned(); @@ -69,4 +88,15 @@ impl IdentityCreateTransitionWasm { } } } + + #[wasm_bindgen(js_name=getType)] + pub fn get_type(&self) -> u8 { + IdentityCreateTransition::get_type() as u8 + } + + #[wasm_bindgen(getter)] + #[wasm_bindgen(js_name=identityId)] + pub fn identity_id(&self) -> IdentifierWrapper { + self.0.get_identity_id().clone().into() + } } diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js index 4b647d72ff2..ab6500d9a80 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js @@ -40,37 +40,37 @@ describe('IdentityCreateTransition', () => { }); }); - describe.skip('#getType', () => { + describe('#getType', () => { it('should return IDENTITY_CREATE type', () => { - expect(stateTransition.getType()).to.equal(stateTransitionTypes.IDENTITY_CREATE); + expect(stateTransition.getType()).to.equal(stateTransitionJS.getType()); }); }); - describe.skip('#setAssetLockProof', () => { + describe('#setAssetLockProof', () => { it('should set asset lock proof', () => { stateTransition.setAssetLockProof( - new InstantAssetLockProof(rawStateTransition.assetLockProof), + stateTransitionJS.assetLockProof.toObject(), ); expect(stateTransition.assetLockProof.toObject()) - .to.deep.equal(rawStateTransition.assetLockProof); + .to.deep.equal(stateTransitionJS.assetLockProof.toObject()); }); it('should set `identityId`', () => { stateTransition.setAssetLockProof( - new InstantAssetLockProof(rawStateTransition.assetLockProof), + stateTransitionJS.assetLockProof.toObject(), ); - expect(stateTransition.identityId).to.deep.equal( - stateTransition.getAssetLockProof().createIdentifier(), + expect(stateTransition.identityId.toBuffer()).to.deep.equal( + stateTransition.getAssetLockProof().createIdentifier().toBuffer(), ); }); }); - describe.skip('#getAssetLockProof', () => { + describe('#getAssetLockProof', () => { it('should return currently set locked OutPoint', () => { expect(stateTransition.getAssetLockProof().toObject()).to.deep.equal( - rawStateTransition.assetLockProof, + stateTransitionJS.assetLockProof.toObject(), ); }); }); From b76b5efb2553eca87d9d620b4a322232c4f168a8 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 9 Dec 2022 16:10:03 +0400 Subject: [PATCH 13/66] feat(wasm-dpp): IdentityCreateTransition setPublicKeys, getPublicKeys, addPublicKeys, getIdentityId, getOwnerId --- .../identity_create_transition.rs | 6 +- .../state_transition/asset_lock_proof/mod.rs | 3 +- .../identity_create_transition.rs | 81 +++++++++++++++---- .../IdentityCreateTransition.spec.js | 78 +++++++++++++----- 4 files changed, 126 insertions(+), 42 deletions(-) diff --git a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index f9f7e0773c9..0c87efdb842 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -104,7 +104,7 @@ impl IdentityCreateTransition { .iter() .map(|val| serde_json::from_value(val.clone())) .collect::, serde_json::Error>>()?; - state_transition = state_transition.set_public_keys(keys); + state_transition.set_public_keys(keys); } if let Some(proof) = transition_map.get(property_names::ASSET_LOCK_PROOF) { @@ -142,14 +142,14 @@ impl IdentityCreateTransition { } /// Replaces existing set of public keys with a new one - pub fn set_public_keys(mut self, public_keys: Vec) -> Self { + pub fn set_public_keys(&mut self, public_keys: Vec) -> &mut Self { self.public_keys = public_keys; self } /// Adds public keys to the existing public keys array - pub fn add_public_keys(mut self, public_keys: &mut Vec) -> Self { + pub fn add_public_keys(&mut self, public_keys: &mut Vec) -> &mut Self { self.public_keys.append(public_keys); self diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index baf2cba6e31..4eb39b922ff 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -3,9 +3,8 @@ mod instant; pub use chain::*; pub use instant::*; -use serde::Serialize; -use crate::{errors::RustConversionError, with_js_error}; +use crate::errors::RustConversionError; use wasm_bindgen::prelude::*; use crate::Deserialize; diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index 5d10fcfd1b9..8ec2fc3011f 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -47,18 +47,6 @@ impl IdentityCreateTransitionWasm { Ok(identity_create_transition.into()) } - #[wasm_bindgen(getter)] - #[wasm_bindgen(js_name=publicKeys)] - pub fn public_keys(&self) -> Vec { - self.0 - .get_public_keys() - .iter() - .map(IdentityPublicKey::to_owned) - .map(IdentityPublicKeyWasm::from) - .map(JsValue::from) - .collect() - } - #[wasm_bindgen(js_name=setAssetLockProof)] pub fn set_asset_lock_proof(&mut self, asset_lock_proof: JsValue) -> Result<(), JsValue> { let asset_lock_proof = AssetLockProofWasm::new(asset_lock_proof)?; @@ -70,8 +58,7 @@ impl IdentityCreateTransitionWasm { Ok(()) } - #[wasm_bindgen(getter)] - #[wasm_bindgen(js_name=assetLockProof)] + #[wasm_bindgen(getter, js_name=assetLockProof)] pub fn asset_lock_proof(&self) -> JsValue { self.get_asset_lock_proof() } @@ -89,14 +76,76 @@ impl IdentityCreateTransitionWasm { } } + #[wasm_bindgen(js_name=setPublicKeys)] + pub fn set_public_keys(&mut self, public_keys: Vec) -> Result<(), JsValue> { + let public_keys = public_keys + .into_iter() + .map(|key| IdentityPublicKeyWasm::new(key)) + .collect::, _>>()?; + + self.0 + .set_public_keys(public_keys.into_iter().map(|key| key.into()).collect()); + + // TODO: consider returning self as it's done in the internal set_public_keys method + Ok(()) + } + + #[wasm_bindgen(js_name=addPublicKeys)] + pub fn add_public_keys(&mut self, public_keys: Vec) -> Result<(), JsValue> { + let public_keys_wasm: Vec = public_keys + .into_iter() + .map(|key| IdentityPublicKeyWasm::new(key)) + .collect::, _>>()?; + + let mut public_keys = public_keys_wasm + .into_iter() + .map(|key| key.into()) + .collect::>(); + + self.0.add_public_keys(&mut public_keys); + + // TODO: consider returning self as it's done in the internal add_public_keys method + Ok(()) + } + + #[wasm_bindgen(js_name=getPublicKeys)] + pub fn get_public_keys(&self) -> Vec { + self.0 + .get_public_keys() + .iter() + .map(IdentityPublicKey::to_owned) + .map(IdentityPublicKeyWasm::from) + .map(JsValue::from) + .collect() + } + + #[wasm_bindgen(getter, js_name=publicKeys)] + pub fn public_keys(&self) -> Vec { + self.get_public_keys() + } + #[wasm_bindgen(js_name=getType)] pub fn get_type(&self) -> u8 { IdentityCreateTransition::get_type() as u8 } - #[wasm_bindgen(getter)] - #[wasm_bindgen(js_name=identityId)] + #[wasm_bindgen(getter, js_name=identityId)] pub fn identity_id(&self) -> IdentifierWrapper { + self.get_identity_id() + } + + #[wasm_bindgen(js_name=getIdentityId)] + pub fn get_identity_id(&self) -> IdentifierWrapper { self.0.get_identity_id().clone().into() } + + #[wasm_bindgen(js_name=getOwnerId)] + pub fn get_owner_id(&self) -> IdentifierWrapper { + self.0.get_owner_id().clone().into() + } + + // pub fn to_object(&self) -> JsValue { + // let json_object = self.0.to_json_object() + // serde_wasm_bindgen::to_value(&self.0).unwrap() + // } } diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js index ab6500d9a80..3f483d8fb2b 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js @@ -1,4 +1,4 @@ -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); +// const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); const stateTransitionTypes = require( '@dashevo/dpp/lib/stateTransition/stateTransitionTypes', @@ -17,9 +17,25 @@ describe('IdentityCreateTransition', () => { let stateTransitionJS; let stateTransition; let IdentityCreateTransition; + let IdentityPublicKey; + let KeyType; + let KeyPurpose; + let KeySecurityLevel; + + const mockRawPublicKey = (params = {}) => ({ + id: 0, + type: KeyType.ECDSA_SECP256K1, + data: Buffer.from('AkVuTKyF3YgKLAQlLEtaUL2HTditwGILfWUVqjzYnIgH', 'base64'), + purpose: KeyPurpose.AUTHENTICATION, + securityLevel: KeySecurityLevel.MASTER, + readOnly: false, + ...params, + }); before(async () => { - ({ IdentityCreateTransition } = await loadWasmDpp()); + ({ + IdentityCreateTransition, IdentityPublicKey, KeyType, KeyPurpose, KeySecurityLevel, + } = await loadWasmDpp()); }); beforeEach(() => { @@ -75,46 +91,66 @@ describe('IdentityCreateTransition', () => { }); }); - describe.skip('#setPublicKeys', () => { + describe('#setPublicKeys', () => { it('should set public keys', () => { - const publicKeys = [new IdentityPublicKey(), new IdentityPublicKey()]; + const publicKeys = [ + new IdentityPublicKey(mockRawPublicKey({ id: 0 })), + new IdentityPublicKey(mockRawPublicKey({ id: 1 })), + ]; - stateTransition.setPublicKeys(publicKeys); + stateTransition.setPublicKeys(publicKeys.map((key) => key.toObject())); + stateTransitionJS.setPublicKeys(publicKeys); - expect(stateTransition.publicKeys).to.have.deep.members(publicKeys); + expect(stateTransition.publicKeys.map((key) => key.toObject())) + .to.deep.equal(stateTransitionJS.publicKeys.map((key) => key.toObject())); }); }); - describe.skip('#getPublicKeys', () => { + describe('#getPublicKeys', () => { it('should return set public keys', () => { - expect(stateTransition.getPublicKeys()).to.deep.equal( - rawStateTransition.publicKeys.map((rawPublicKey) => new IdentityPublicKey(rawPublicKey)), - ); + expect(stateTransition.getPublicKeys().map((key) => key.toJSON())) + .to.deep.equal( + stateTransitionJS.getPublicKeys().map((key) => key.toJSON()), + ); }); }); - describe.skip('#addPublicKeys', () => { + describe('#addPublicKeys', () => { it('should add more public keys', () => { - const publicKeys = [new IdentityPublicKey(), new IdentityPublicKey()]; + const publicKeys = [ + new IdentityPublicKey(mockRawPublicKey({ id: 0 })), + new IdentityPublicKey(mockRawPublicKey({ id: 1 })), + ]; + + stateTransitionJS.publicKeys = []; + stateTransitionJS.addPublicKeys(publicKeys);// .map((key) => key.toObject())); - stateTransition.publicKeys = []; - stateTransition.addPublicKeys(publicKeys); - expect(stateTransition.getPublicKeys()).to.have.deep.members(publicKeys); + stateTransition.setPublicKeys([]); + stateTransition.addPublicKeys(publicKeys.map((key) => key.toObject())); + + expect(stateTransition.getPublicKeys().map((key) => key.toObject())) + .to.deep.equal(stateTransitionJS.getPublicKeys().map((key) => key.toObject())); }); }); - describe.skip('#getIdentityId', () => { + describe('#getIdentityId', () => { it('should return identity id', () => { - expect(stateTransition.getIdentityId()).to.deep.equal( - stateTransition.getAssetLockProof().createIdentifier(), + expect(stateTransition.getIdentityId().toBuffer()) + .to.deep.equal(stateTransitionJS.getIdentityId()); + + expect(stateTransition.getIdentityId().toBuffer()).to.deep.equal( + stateTransition.getAssetLockProof().createIdentifier().toBuffer(), ); }); }); - describe.skip('#getOwnerId', () => { + describe('#getOwnerId', () => { it('should return owner id', () => { - expect(stateTransition.getOwnerId()).to.equal( - stateTransition.getIdentityId(), + expect(stateTransition.getOwnerId().toBuffer()) + .to.deep.equal(stateTransitionJS.getOwnerId()); + + expect(stateTransition.getOwnerId().toBuffer()).to.deep.equal( + stateTransition.getIdentityId().toBuffer(), ); }); }); From ef0816bb3d19fd1898f9eddcb7a1861a77395c4e Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Mon, 12 Dec 2022 20:05:21 +0400 Subject: [PATCH 14/66] feat(wasm-dpp): IdentityCreateTransition toObject, toJSON --- .../src/identity/identity_public_key/mod.rs | 6 + .../identity_create_transition.rs | 186 +++++++++++++++++- .../IdentityCreateTransition.spec.js | 87 ++++---- 3 files changed, 236 insertions(+), 43 deletions(-) diff --git a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs index 20f12b34ce6..fdde3fd2e52 100644 --- a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs +++ b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs @@ -148,6 +148,12 @@ impl IdentityPublicKeyWasm { let json = val.to_string(); let js_object = js_sys::JSON::parse(&json)?; + js_sys::Reflect::set( + &js_object, + &JsValue::from_str("type"), + &JsValue::from(self.get_type()), + )?; + js_sys::Reflect::set( &js_object, &"data".to_owned().into(), diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index 8ec2fc3011f..b38700d6c9e 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -1,9 +1,13 @@ +use std::default::Default; + use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; +use crate::errors::from_dpp_err; use crate::identifier::IdentifierWrapper; use crate::state_transition::AssetLockProofWasm; use crate::{ + buffer::Buffer, errors::RustConversionError, identity::{ state_transition::asset_lock_proof::{ChainAssetLockProofWasm, InstantAssetLockProofWasm}, @@ -11,19 +15,45 @@ use crate::{ }, with_js_error, }; -use dpp::identity::state_transition::asset_lock_proof::AssetLockProof; -use dpp::identity::{ - state_transition::identity_create_transition::IdentityCreateTransition, IdentityPublicKey, + +use dpp::{ + identity::{ + state_transition::{ + asset_lock_proof::AssetLockProof, + identity_create_transition::{IdentityCreateTransition, SerializationOptions}, + }, + IdentityPublicKey, + }, + state_transition::StateTransitionLike, + util::string_encoding, + util::string_encoding::Encoding, }; #[wasm_bindgen(js_name=IdentityCreateTransition)] pub struct IdentityCreateTransitionWasm(IdentityCreateTransition); +#[derive(Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct SerializationOptionsJS { + pub skip_signature: Option, + pub skip_identifiers_conversion: Option, +} + +impl From for SerializationOptions { + fn from(options: SerializationOptionsJS) -> Self { + Self { + skip_signature: options.skip_signature.unwrap_or(false), + skip_identifiers_conversion: options.skip_identifiers_conversion.unwrap_or(false), + } + } +} + #[derive(Deserialize, Serialize)] #[serde(rename_all = "camelCase")] struct IdentityCreateTransitionParams { asset_lock_proof: InstantAssetLockProofWasm, public_keys: Vec, + signature: Option>, } impl From for IdentityCreateTransitionWasm { @@ -41,9 +71,13 @@ impl IdentityCreateTransitionWasm { let raw_state_transition = with_js_error!(serde_json::to_value(¶meters))?; - let identity_create_transition = IdentityCreateTransition::new(raw_state_transition) + let mut identity_create_transition = IdentityCreateTransition::new(raw_state_transition) .map_err(|e| RustConversionError::Error(e.to_string()).to_js_value())?; + if let Some(signature) = parameters.signature { + identity_create_transition.set_signature(signature); + } + Ok(identity_create_transition.into()) } @@ -144,8 +178,144 @@ impl IdentityCreateTransitionWasm { self.0.get_owner_id().clone().into() } - // pub fn to_object(&self) -> JsValue { - // let json_object = self.0.to_json_object() - // serde_wasm_bindgen::to_value(&self.0).unwrap() - // } + #[wasm_bindgen(js_name=toObject)] + pub fn to_object(&self, options: JsValue) -> Result { + let opts: SerializationOptionsJS = if options.is_object() { + with_js_error!(serde_wasm_bindgen::from_value(options))? + } else { + Default::default() + }; + + let js_object = js_sys::Object::new(); + + // Add signature + if !opts.skip_signature.unwrap_or(false) { + let signature = self.0.get_signature(); + let signature_buffer = Buffer::from_bytes(signature.as_slice()); + + js_sys::Reflect::set( + &js_object, + &"signature".to_owned().into(), + &signature_buffer.into(), + )?; + } + + // Add identityId (following to_json_object example if rs-dpp IdentityCreateTransition) + if !opts.skip_identifiers_conversion.unwrap_or(false) { + let signature = self.0.get_signature(); + let signature_buffer = Buffer::from_bytes(signature.as_slice()); + js_sys::Reflect::set( + &js_object, + &"identityId".to_owned().into(), + &signature_buffer.into(), + )?; + } else { + js_sys::Reflect::set( + &js_object, + &"identityId".to_owned().into(), + &self.get_identity_id().into(), + )?; + } + + // Write asset lock proof wasm object + let asset_lock_proof = self.get_asset_lock_proof(); + js_sys::Reflect::set( + &js_object, + &"assetLockProof".to_owned().into(), + &asset_lock_proof.into(), + )?; + + // Write array of public keys + let public_keys = self.get_public_keys(); + let js_public_keys = js_sys::Array::new(); + + for pk in public_keys { + js_public_keys.push(&pk); + } + js_sys::Reflect::set( + &js_object, + &"publicKeys".to_owned().into(), + &JsValue::from(&js_public_keys), + )?; + + // Write ST type + let transition_type = self.get_type(); + js_sys::Reflect::set( + &js_object, + &"type".to_owned().into(), + &JsValue::from(transition_type), + )?; + + Ok(js_object.into()) + } + + #[wasm_bindgen(js_name=toJSON)] + pub fn to_json(&self) -> Result { + let js_object = js_sys::Object::new(); + + // Write signature + let signature = self.0.get_signature(); + let signature_base64 = string_encoding::encode(signature.as_slice(), Encoding::Base64); + + js_sys::Reflect::set( + &js_object, + &"signature".to_owned().into(), + &JsValue::from(&signature_base64), + )?; + + // Write identityId (following to_json_object example if rs-dpp IdentityCreateTransition) + js_sys::Reflect::set( + &js_object, + &"identityId".to_owned().into(), + &JsValue::from(&signature_base64), + )?; + + // Write asset lock proof JSON + let asset_lock_proof = self.0.get_asset_lock_proof().to_owned(); + let asset_lock_proof_json = match asset_lock_proof { + AssetLockProof::Instant(instant_asset_lock_proof) => { + InstantAssetLockProofWasm::from(instant_asset_lock_proof).to_json() + } + AssetLockProof::Chain(chain_asset_lock_proof) => { + ChainAssetLockProofWasm::from(chain_asset_lock_proof).to_json() + } + }?; + + js_sys::Reflect::set( + &js_object, + &"assetLockProof".to_owned().into(), + &asset_lock_proof_json, + )?; + + // Write public keys JSON values + let public_keys: Vec = self + .0 + .get_public_keys() + .iter() + .map(IdentityPublicKey::to_owned) + .map(|key| IdentityPublicKeyWasm::from(key).to_json().ok()) + .map(JsValue::from) + .collect(); + + let js_public_keys = js_sys::Array::new(); + + for pk in public_keys { + js_public_keys.push(&pk); + } + js_sys::Reflect::set( + &js_object, + &"publicKeys".to_owned().into(), + &JsValue::from(&js_public_keys), + )?; + + // Write type value + let transition_type = self.get_type(); + js_sys::Reflect::set( + &js_object, + &"type".to_owned().into(), + &JsValue::from(transition_type), + )?; + + Ok(js_object.into()) + } } diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js index 3f483d8fb2b..fa277037cf2 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js @@ -1,4 +1,4 @@ -// const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); +const IdentityPublicKeyJS = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); const stateTransitionTypes = require( '@dashevo/dpp/lib/stateTransition/stateTransitionTypes', @@ -28,6 +28,7 @@ describe('IdentityCreateTransition', () => { data: Buffer.from('AkVuTKyF3YgKLAQlLEtaUL2HTditwGILfWUVqjzYnIgH', 'base64'), purpose: KeyPurpose.AUTHENTICATION, securityLevel: KeySecurityLevel.MASTER, + signature: Buffer.alloc(32).fill(1), readOnly: false, ...params, }); @@ -40,9 +41,14 @@ describe('IdentityCreateTransition', () => { beforeEach(() => { stateTransitionJS = getIdentityCreateTransitionFixture(); - rawStateTransition = stateTransitionJS.toObject(); - - stateTransition = new IdentityCreateTransition(rawStateTransition); + // TODO: revisit + // Provide publicKeys that have mocked signature, because in case of absence, + // JS returns signature as undefined and wasm binding returns empty buffer + // and we can not do deep.equal directly + stateTransitionJS.publicKeys = [new IdentityPublicKeyJS(mockRawPublicKey())]; + // For the same reason we need to mock signature + stateTransitionJS.signature = Buffer.alloc(32).fill(1); + stateTransition = new IdentityCreateTransition(stateTransitionJS.toObject()); }); describe('#constructor', () => { @@ -74,6 +80,7 @@ describe('IdentityCreateTransition', () => { it('should set `identityId`', () => { stateTransition.setAssetLockProof( + // TODO: test with instance of binding assetLockProof stateTransitionJS.assetLockProof.toObject(), ); @@ -94,8 +101,8 @@ describe('IdentityCreateTransition', () => { describe('#setPublicKeys', () => { it('should set public keys', () => { const publicKeys = [ - new IdentityPublicKey(mockRawPublicKey({ id: 0 })), - new IdentityPublicKey(mockRawPublicKey({ id: 1 })), + new IdentityPublicKeyJS(mockRawPublicKey({ id: 0 })), + new IdentityPublicKeyJS(mockRawPublicKey({ id: 1 })), ]; stateTransition.setPublicKeys(publicKeys.map((key) => key.toObject())); @@ -118,12 +125,12 @@ describe('IdentityCreateTransition', () => { describe('#addPublicKeys', () => { it('should add more public keys', () => { const publicKeys = [ - new IdentityPublicKey(mockRawPublicKey({ id: 0 })), - new IdentityPublicKey(mockRawPublicKey({ id: 1 })), + new IdentityPublicKeyJS(mockRawPublicKey({ id: 0 })), + new IdentityPublicKeyJS(mockRawPublicKey({ id: 1 })), ]; stateTransitionJS.publicKeys = []; - stateTransitionJS.addPublicKeys(publicKeys);// .map((key) => key.toObject())); + stateTransitionJS.addPublicKeys(publicKeys); stateTransition.setPublicKeys([]); stateTransition.addPublicKeys(publicKeys.map((key) => key.toObject())); @@ -155,42 +162,52 @@ describe('IdentityCreateTransition', () => { }); }); - describe.skip('#toObject', () => { + describe('#toObject', () => { it('should return raw state transition', () => { - rawStateTransition = stateTransition.toObject(); + const stObject = stateTransition.toObject(); + const stObjectJS = stateTransitionJS.toObject(); + + expect(stObject.signature).to.deep.equal(stObjectJS.signature); + + // TODO: identityId is missing in JS object. + // compare to `signature` option because it's returned as identityId + // in case skipIdentifiersConversion is true + expect(stObject.identityId).to.deep.equal(stObjectJS.signature); + expect(stObject.assetLockProof.toObject()).to + .deep.equal(stObjectJS.assetLockProof); + expect(stObject.publicKeys.map((key) => key.toObject())) + .to.deep.equal(stObjectJS.publicKeys); + expect(stObject.type).to.equal(stObjectJS.type); - expect(rawStateTransition).to.deep.equal({ - protocolVersion: protocolVersion.latestVersion, - type: stateTransitionTypes.IDENTITY_CREATE, - assetLockProof: rawStateTransition.assetLockProof, - publicKeys: rawStateTransition.publicKeys, - signature: undefined, - }); + // TODO: wasm-dpp version is 0 while JS version is 1 + // expect(stObject.protocolVersion).to.equal(stObjectJS.protocolVersion); }); it('should return raw state transition without signature', () => { - rawStateTransition = stateTransition.toObject({ skipSignature: true }); + const stObject = stateTransition.toObject({ skipSignature: true }); - expect(rawStateTransition).to.deep.equal({ - protocolVersion: protocolVersion.latestVersion, - type: stateTransitionTypes.IDENTITY_CREATE, - assetLockProof: rawStateTransition.assetLockProof, - publicKeys: rawStateTransition.publicKeys, - }); + expect(stObject.signature).to.not.exist(); }); }); - describe.skip('#toJSON', () => { + describe('#toJSON', () => { it('should return JSON representation of state transition', () => { - const jsonStateTransition = stateTransition.toJSON(); - - expect(jsonStateTransition).to.deep.equal({ - protocolVersion: protocolVersion.latestVersion, - type: stateTransitionTypes.IDENTITY_CREATE, - assetLockProof: stateTransition.getAssetLockProof().toJSON(), - publicKeys: stateTransition.getPublicKeys().map((k) => k.toJSON()), - signature: undefined, - }); + const stJson = stateTransition.toJSON(); + const stJsonJS = stateTransitionJS.toJSON(); + + expect(stJson.signature).to.deep.equal(stJsonJS.signature); + + // TODO: identityId is missing in JS object. + // compare to `signature` option because it's returned as identityId + // in case skipIdentifiersConversion is true + expect(stJson.identityId).to.deep.equal(stJsonJS.signature); + expect(stJson.assetLockProof).to.deep.equal(stJsonJS.assetLockProof); + expect(stJson.publicKeys).to.deep.equal(stJsonJS.publicKeys); + expect(stJson.type).to.equal(stJsonJS.type); + + // TODO: wasm-dpp version is 0 while JS version is 1 + // expect(stJson.protocolVersion).to.equal(stJsonJS.protocolVersion); + // console.log(stJsonJS); }); }); From f7624d5d80fc480eb2d8a070352c58ec3183c780 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Mon, 12 Dec 2022 20:49:05 +0400 Subject: [PATCH 15/66] feat(wasm-dpp): IdentityCreateTransition getModifiedDataIds --- .../identity_create_transition.rs | 13 ++++++++++++- .../IdentityCreateTransition.spec.js | 16 +++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index b38700d6c9e..b1302bffa2a 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -3,7 +3,6 @@ use std::default::Default; use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; -use crate::errors::from_dpp_err; use crate::identifier::IdentifierWrapper; use crate::state_transition::AssetLockProofWasm; use crate::{ @@ -17,6 +16,7 @@ use crate::{ }; use dpp::{ + identifier::Identifier, identity::{ state_transition::{ asset_lock_proof::AssetLockProof, @@ -318,4 +318,15 @@ impl IdentityCreateTransitionWasm { Ok(js_object.into()) } + + #[wasm_bindgen(js_name=getModifiedDataIds)] + pub fn get_modified_data_ids(&self) -> Vec { + let ids = self.0.get_modified_data_ids(); + + ids.into_iter() + .map(|id| { + >::from(id.clone()).into() + }) + .collect() + } } diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js index fa277037cf2..747a6b34559 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js @@ -5,7 +5,7 @@ const stateTransitionTypes = require( ); const protocolVersion = require('@dashevo/dpp/lib/version/protocolVersion'); -const Identifier = require('@dashevo/dpp/lib/identifier/Identifier'); +const IdentifierJS = require('@dashevo/dpp/lib/identifier/Identifier'); const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); const InstantAssetLockProof = require('@dashevo/dpp/lib/identity/stateTransition/assetLockProof/instant/InstantAssetLockProof'); @@ -21,6 +21,7 @@ describe('IdentityCreateTransition', () => { let KeyType; let KeyPurpose; let KeySecurityLevel; + let Identifier; const mockRawPublicKey = (params = {}) => ({ id: 0, @@ -35,7 +36,7 @@ describe('IdentityCreateTransition', () => { before(async () => { ({ - IdentityCreateTransition, IdentityPublicKey, KeyType, KeyPurpose, KeySecurityLevel, + IdentityCreateTransition, IdentityPublicKey, KeyType, KeyPurpose, KeySecurityLevel, Identifier, } = await loadWasmDpp()); }); @@ -211,16 +212,17 @@ describe('IdentityCreateTransition', () => { }); }); - describe.skip('#getModifiedDataIds', () => { + describe('#getModifiedDataIds', () => { it('should return ids of created identities', () => { const result = stateTransition.getModifiedDataIds(); + const resultJS = stateTransitionJS.getModifiedDataIds(); - expect(result.length).to.be.equal(1); + expect(result.length).to.equal(resultJS.length); + expect(result.map((id) => id.toBuffer())).to.deep.equal(resultJS); const identityId = result[0]; - expect(identityId).to.be.an.instanceOf(Identifier); - expect(identityId).to.be.deep.equal( - new IdentityCreateTransition(rawStateTransition).getIdentityId(), + expect(identityId.toBuffer()).to.be.deep.equal( + stateTransition.getIdentityId().toBuffer(), ); }); }); From ec73c285d619e52344d24f7f490b6e2d7e6c6382 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 13 Dec 2022 13:09:06 +0400 Subject: [PATCH 16/66] test(wasm-dpp): lint tests --- .../IdentityCreateTransition.spec.js | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js index 747a6b34559..e75597f99ca 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js @@ -1,27 +1,16 @@ const IdentityPublicKeyJS = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); - -const stateTransitionTypes = require( - '@dashevo/dpp/lib/stateTransition/stateTransitionTypes', -); - -const protocolVersion = require('@dashevo/dpp/lib/version/protocolVersion'); -const IdentifierJS = require('@dashevo/dpp/lib/identifier/Identifier'); - const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); -const InstantAssetLockProof = require('@dashevo/dpp/lib/identity/stateTransition/assetLockProof/instant/InstantAssetLockProof'); const { default: loadWasmDpp } = require('../../../../../dist'); describe('IdentityCreateTransition', () => { - let rawStateTransition; let stateTransitionJS; let stateTransition; let IdentityCreateTransition; - let IdentityPublicKey; let KeyType; let KeyPurpose; let KeySecurityLevel; - let Identifier; + let IdentityPublicKey; const mockRawPublicKey = (params = {}) => ({ id: 0, @@ -36,7 +25,7 @@ describe('IdentityCreateTransition', () => { before(async () => { ({ - IdentityCreateTransition, IdentityPublicKey, KeyType, KeyPurpose, KeySecurityLevel, Identifier, + IdentityCreateTransition, IdentityPublicKey, KeyType, KeyPurpose, KeySecurityLevel, } = await loadWasmDpp()); }); @@ -102,10 +91,11 @@ describe('IdentityCreateTransition', () => { describe('#setPublicKeys', () => { it('should set public keys', () => { const publicKeys = [ - new IdentityPublicKeyJS(mockRawPublicKey({ id: 0 })), - new IdentityPublicKeyJS(mockRawPublicKey({ id: 1 })), + new IdentityPublicKey(mockRawPublicKey({ id: 0 })), + new IdentityPublicKey(mockRawPublicKey({ id: 1 })), ]; + // TODO: fix issue with passing public keys directly instead of toObject() stateTransition.setPublicKeys(publicKeys.map((key) => key.toObject())); stateTransitionJS.setPublicKeys(publicKeys); @@ -126,14 +116,15 @@ describe('IdentityCreateTransition', () => { describe('#addPublicKeys', () => { it('should add more public keys', () => { const publicKeys = [ - new IdentityPublicKeyJS(mockRawPublicKey({ id: 0 })), - new IdentityPublicKeyJS(mockRawPublicKey({ id: 1 })), + new IdentityPublicKey(mockRawPublicKey({ id: 0 })), + new IdentityPublicKey(mockRawPublicKey({ id: 1 })), ]; stateTransitionJS.publicKeys = []; stateTransitionJS.addPublicKeys(publicKeys); stateTransition.setPublicKeys([]); + // TODO: fix issue with passing public keys directly instead of toObject() stateTransition.addPublicKeys(publicKeys.map((key) => key.toObject())); expect(stateTransition.getPublicKeys().map((key) => key.toObject())) From ff2d61fa63104b4bd6eb7aad36bd471f4e74b1c2 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 20 Dec 2022 14:13:01 +0400 Subject: [PATCH 17/66] fix(wasm-dpp): identity_create_transition unknown asset lock proof --- .../identity_create_transition.rs | 42 ++++++++++++++++++- .../IdentityCreateTransition.spec.js | 14 +++++-- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index b1302bffa2a..f66418c0085 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -1,6 +1,7 @@ use std::default::Default; use serde::{Deserialize, Serialize}; +use serde_json::Value as JsonValue; use wasm_bindgen::prelude::*; use crate::identifier::IdentifierWrapper; @@ -35,10 +36,12 @@ pub struct IdentityCreateTransitionWasm(IdentityCreateTransition); #[derive(Deserialize, Default)] #[serde(rename_all = "camelCase")] pub struct SerializationOptionsJS { + // TODO: remove JS pub skip_signature: Option, pub skip_identifiers_conversion: Option, } +// TODO: remove? impl From for SerializationOptions { fn from(options: SerializationOptionsJS) -> Self { Self { @@ -48,12 +51,39 @@ impl From for SerializationOptions { } } +#[derive(Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct RawInstantAssetLockProof { + #[serde(rename = "type")] + lock_type: u8, + instant_lock: Vec, + transaction: Vec, + output_index: u32, +} + +#[derive(Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct RawChainAssetLockProof { + #[serde(rename = "type")] + lock_type: u8, + core_chain_locked_height: u32, + out_point: Vec, +} + +#[derive(Deserialize, Serialize)] +#[serde(untagged)] +pub enum RawAssetLockProof { + Instant(RawInstantAssetLockProof), + Chain(RawChainAssetLockProof), +} + #[derive(Deserialize, Serialize)] #[serde(rename_all = "camelCase")] struct IdentityCreateTransitionParams { - asset_lock_proof: InstantAssetLockProofWasm, + // Omitting asset lock proof because it gets parsed separately depending on it's type public_keys: Vec, signature: Option>, + // Add protocol version } impl From for IdentityCreateTransitionWasm { @@ -65,7 +95,10 @@ impl From for IdentityCreateTransitionWasm { #[wasm_bindgen(js_class = IdentityCreateTransition)] impl IdentityCreateTransitionWasm { #[wasm_bindgen(constructor)] - pub fn new(raw_parameters: JsValue) -> Result { + pub fn new(mut raw_parameters: JsValue) -> Result { + let raw_asset_lock_proof = + js_sys::Reflect::get(&raw_parameters, &"assetLockProof".to_owned().into())?; + let parameters: IdentityCreateTransitionParams = with_js_error!(serde_wasm_bindgen::from_value(raw_parameters))?; @@ -74,6 +107,11 @@ impl IdentityCreateTransitionWasm { let mut identity_create_transition = IdentityCreateTransition::new(raw_state_transition) .map_err(|e| RustConversionError::Error(e.to_string()).to_js_value())?; + let asset_lock_proof = AssetLockProofWasm::new(raw_asset_lock_proof)?; + identity_create_transition + .set_asset_lock_proof(asset_lock_proof.into()) + .map_err(|e| RustConversionError::Error(e.to_string()).to_js_value())?; + if let Some(signature) = parameters.signature { identity_create_transition.set_signature(signature); } diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js index e75597f99ca..57ea1d8ee4f 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js @@ -1,5 +1,6 @@ const IdentityPublicKeyJS = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); +const getChainAssetLockProofFixture = require('@dashevo/dpp/lib/test/fixtures/getChainAssetLockProofFixture'); const { default: loadWasmDpp } = require('../../../../../dist'); @@ -42,14 +43,21 @@ describe('IdentityCreateTransition', () => { }); describe('#constructor', () => { - it('should create an instance with specified data', () => { - // console.log(stateTransition.getAssetLockProof().toObject()); + it('should create instance with instant asset lock proof', () => { expect(stateTransition.getAssetLockProof().toObject()) - .to.deep.equal(stateTransition.getAssetLockProof().toObject()); + .to.deep.equal(stateTransitionJS.getAssetLockProof().toObject()); expect(stateTransition.publicKeys.map((key) => key.toJSON())) .to.deep.equal(stateTransitionJS.publicKeys.map((key) => key.toJSON())); }); + + it('should create instance with chain asset lock proof', () => { + const stObject = stateTransitionJS.toObject(); + stObject.assetLockProof = getChainAssetLockProofFixture().toObject(); + stateTransition = new IdentityCreateTransition(stObject); + expect(stateTransition.getAssetLockProof().toObject()) + .to.deep.equal(stObject.assetLockProof); + }); }); describe('#getType', () => { From 50f959de1ac3fd9d910cce67c9b857cafc5b015f Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 20 Dec 2022 14:54:27 +0400 Subject: [PATCH 18/66] fix(wasm-dpp): missing protocol version --- .../identity_create_transition.rs | 4 ++ .../identity_create_transition.rs | 38 +++++++++---------- .../IdentityCreateTransition.spec.js | 28 +++++++------- 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index 0c87efdb842..eacd0928fc0 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -111,6 +111,10 @@ impl IdentityCreateTransition { state_transition.set_asset_lock_proof(AssetLockProof::try_from(proof)?)?; } + if let Some(protocol_version) = transition_map.get(property_names::PROTOCOL_VERSION) { + state_transition.protocol_version = protocol_version.as_u64().unwrap() as u32; + } + Ok(state_transition) } diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index f66418c0085..d2c9fc27a6c 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -1,7 +1,6 @@ use std::default::Default; use serde::{Deserialize, Serialize}; -use serde_json::Value as JsonValue; use wasm_bindgen::prelude::*; use crate::identifier::IdentifierWrapper; @@ -20,8 +19,7 @@ use dpp::{ identifier::Identifier, identity::{ state_transition::{ - asset_lock_proof::AssetLockProof, - identity_create_transition::{IdentityCreateTransition, SerializationOptions}, + asset_lock_proof::AssetLockProof, identity_create_transition::IdentityCreateTransition, }, IdentityPublicKey, }, @@ -35,22 +33,11 @@ pub struct IdentityCreateTransitionWasm(IdentityCreateTransition); #[derive(Deserialize, Default)] #[serde(rename_all = "camelCase")] -pub struct SerializationOptionsJS { - // TODO: remove JS +pub struct SerializationOptions { pub skip_signature: Option, pub skip_identifiers_conversion: Option, } -// TODO: remove? -impl From for SerializationOptions { - fn from(options: SerializationOptionsJS) -> Self { - Self { - skip_signature: options.skip_signature.unwrap_or(false), - skip_identifiers_conversion: options.skip_identifiers_conversion.unwrap_or(false), - } - } -} - #[derive(Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RawInstantAssetLockProof { @@ -80,10 +67,9 @@ pub enum RawAssetLockProof { #[derive(Deserialize, Serialize)] #[serde(rename_all = "camelCase")] struct IdentityCreateTransitionParams { - // Omitting asset lock proof because it gets parsed separately depending on it's type public_keys: Vec, signature: Option>, - // Add protocol version + protocol_version: u32, } impl From for IdentityCreateTransitionWasm { @@ -95,7 +81,7 @@ impl From for IdentityCreateTransitionWasm { #[wasm_bindgen(js_class = IdentityCreateTransition)] impl IdentityCreateTransitionWasm { #[wasm_bindgen(constructor)] - pub fn new(mut raw_parameters: JsValue) -> Result { + pub fn new(raw_parameters: JsValue) -> Result { let raw_asset_lock_proof = js_sys::Reflect::get(&raw_parameters, &"assetLockProof".to_owned().into())?; @@ -218,7 +204,7 @@ impl IdentityCreateTransitionWasm { #[wasm_bindgen(js_name=toObject)] pub fn to_object(&self, options: JsValue) -> Result { - let opts: SerializationOptionsJS = if options.is_object() { + let opts: SerializationOptions = if options.is_object() { with_js_error!(serde_wasm_bindgen::from_value(options))? } else { Default::default() @@ -284,6 +270,13 @@ impl IdentityCreateTransitionWasm { &JsValue::from(transition_type), )?; + let protocol_version = self.0.get_protocol_version(); + js_sys::Reflect::set( + &js_object, + &"protocolVersion".to_owned().into(), + &protocol_version.into(), + )?; + Ok(js_object.into()) } @@ -354,6 +347,13 @@ impl IdentityCreateTransitionWasm { &JsValue::from(transition_type), )?; + let protocol_version = self.0.get_protocol_version(); + js_sys::Reflect::set( + &js_object, + &"protocolVersion".to_owned().into(), + &protocol_version.into(), + )?; + Ok(js_object.into()) } diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js index 57ea1d8ee4f..b17331129ca 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js @@ -32,7 +32,7 @@ describe('IdentityCreateTransition', () => { beforeEach(() => { stateTransitionJS = getIdentityCreateTransitionFixture(); - // TODO: revisit + // TODO: revisit? // Provide publicKeys that have mocked signature, because in case of absence, // JS returns signature as undefined and wasm binding returns empty buffer // and we can not do deep.equal directly @@ -78,8 +78,9 @@ describe('IdentityCreateTransition', () => { it('should set `identityId`', () => { stateTransition.setAssetLockProof( - // TODO: test with instance of binding assetLockProof - stateTransitionJS.assetLockProof.toObject(), + // TODO: method accepts JS value and errors if we pass instances of wasm's AssetLockProof + // Should it be fixed? + stateTransition.assetLockProof.toObject(), ); expect(stateTransition.identityId.toBuffer()).to.deep.equal( @@ -103,7 +104,8 @@ describe('IdentityCreateTransition', () => { new IdentityPublicKey(mockRawPublicKey({ id: 1 })), ]; - // TODO: fix issue with passing public keys directly instead of toObject() + // TODO: method accepts JS value and errors if we pass instances of IdentityPublicKey + // Should it be fixed? stateTransition.setPublicKeys(publicKeys.map((key) => key.toObject())); stateTransitionJS.setPublicKeys(publicKeys); @@ -132,7 +134,8 @@ describe('IdentityCreateTransition', () => { stateTransitionJS.addPublicKeys(publicKeys); stateTransition.setPublicKeys([]); - // TODO: fix issue with passing public keys directly instead of toObject() + // TODO: method accepts JS value and errors if we pass instances of wasm IdentityPublicKey + // Should it be fixed? stateTransition.addPublicKeys(publicKeys.map((key) => key.toObject())); expect(stateTransition.getPublicKeys().map((key) => key.toObject())) @@ -169,7 +172,7 @@ describe('IdentityCreateTransition', () => { expect(stObject.signature).to.deep.equal(stObjectJS.signature); - // TODO: identityId is missing in JS object. + // TODO: identityId is missing in JS object. Fix? // compare to `signature` option because it's returned as identityId // in case skipIdentifiersConversion is true expect(stObject.identityId).to.deep.equal(stObjectJS.signature); @@ -178,9 +181,7 @@ describe('IdentityCreateTransition', () => { expect(stObject.publicKeys.map((key) => key.toObject())) .to.deep.equal(stObjectJS.publicKeys); expect(stObject.type).to.equal(stObjectJS.type); - - // TODO: wasm-dpp version is 0 while JS version is 1 - // expect(stObject.protocolVersion).to.equal(stObjectJS.protocolVersion); + expect(stObject.protocolVersion).to.equal(stObjectJS.protocolVersion); }); it('should return raw state transition without signature', () => { @@ -197,17 +198,14 @@ describe('IdentityCreateTransition', () => { expect(stJson.signature).to.deep.equal(stJsonJS.signature); - // TODO: identityId is missing in JS object. - // compare to `signature` option because it's returned as identityId + // TODO: identityId is missing in JS object. Fix? + // Instead compare to `signature` option because it's returned as identityId // in case skipIdentifiersConversion is true expect(stJson.identityId).to.deep.equal(stJsonJS.signature); expect(stJson.assetLockProof).to.deep.equal(stJsonJS.assetLockProof); expect(stJson.publicKeys).to.deep.equal(stJsonJS.publicKeys); expect(stJson.type).to.equal(stJsonJS.type); - - // TODO: wasm-dpp version is 0 while JS version is 1 - // expect(stJson.protocolVersion).to.equal(stJsonJS.protocolVersion); - // console.log(stJsonJS); + expect(stJson.protocolVersion).to.equal(stJsonJS.protocolVersion); }); }); From 4dc54724d2c3d5c0ac721b36300e18cc55f67a89 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 20 Dec 2022 20:31:15 +0400 Subject: [PATCH 19/66] feat(wasm-dpp): implement validateIdentityCreateTransitionStateFactory --- .../reward_share_data_triggers/mod.rs | 4 +- packages/rs-dpp/src/errors/errors.rs | 8 ++ .../rs-dpp/src/errors/non_consensus_error.rs | 5 +- .../validation/state/mod.rs | 9 +- ...ty_credit_withdrawal_transition_factory.rs | 10 ++- ...tity_credit_withdrawal_transition_state.rs | 11 ++- .../apply_identity_topup_transition.rs | 11 ++- .../apply_identity_update_transition.rs | 10 ++- ...lidate_identity_update_transition_state.rs | 9 +- packages/rs-dpp/src/state_repository.rs | 7 +- .../validate_state_transition_fee.rs | 23 +++-- ...ate_state_transition_identity_signature.rs | 10 ++- ...validate_state_transition_key_signature.rs | 3 +- packages/wasm-dpp/src/identity/mod.rs | 8 +- .../identity_create_transition.rs | 15 +++- .../identity_create_transition/mod.rs | 2 + .../identity_create_transition/validation.rs | 21 +++++ packages/wasm-dpp/src/state_repository.rs | 31 +++++-- ...entityCreateTransitionStateFactory.spec.js | 89 +++++++++++-------- 19 files changed, 198 insertions(+), 88 deletions(-) create mode 100644 packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs diff --git a/packages/rs-dpp/src/data_trigger/reward_share_data_triggers/mod.rs b/packages/rs-dpp/src/data_trigger/reward_share_data_triggers/mod.rs index 81d6ea4cf45..dd57b0475d2 100644 --- a/packages/rs-dpp/src/data_trigger/reward_share_data_triggers/mod.rs +++ b/packages/rs-dpp/src/data_trigger/reward_share_data_triggers/mod.rs @@ -69,8 +69,8 @@ where } // payToId identity exists - let pay_to_identifier = Identifier::from_bytes(&pay_to_id_bytes)?; - let maybe_identifier: Option> = context + let pay_to_identifier = Identifier::from_string(pay_to_id, Encoding::Base58)?; + let maybe_identifier = context .state_repository .fetch_identity( &pay_to_identifier, diff --git a/packages/rs-dpp/src/errors/errors.rs b/packages/rs-dpp/src/errors/errors.rs index fcd9deae1f3..5f148927a35 100644 --- a/packages/rs-dpp/src/errors/errors.rs +++ b/packages/rs-dpp/src/errors/errors.rs @@ -106,6 +106,14 @@ pub enum ProtocolError { #[error("Public key is disabled")] PublicKeyIsDisabledError { public_key: IdentityPublicKey }, + + #[error("Document was not provided for apply of state transition")] + DocumentNotProvided { + document_transition: DocumentTransition, + }, + + #[error("Identity is not present")] + IdentityNotPresentError { id: Identifier }, } impl From for ProtocolError { diff --git a/packages/rs-dpp/src/errors/non_consensus_error.rs b/packages/rs-dpp/src/errors/non_consensus_error.rs index 3e54407a1e1..44ad0a627d1 100644 --- a/packages/rs-dpp/src/errors/non_consensus_error.rs +++ b/packages/rs-dpp/src/errors/non_consensus_error.rs @@ -4,7 +4,7 @@ use crate::{ CompatibleProtocolVersionIsNotDefinedError, InvalidVectorSizeError, SerdeParsingError, }; -#[derive(Debug, Error, Clone)] +#[derive(Debug, Error)] pub enum NonConsensusError { #[error("Unexpected serde parsing error: {0:#}")] SerdeParsingError(SerdeParsingError), @@ -34,6 +34,9 @@ pub enum NonConsensusError { object_name: &'static str, details: String, }, + + #[error(transparent)] + Error(#[from] anyhow::Error), } pub mod object_names { diff --git a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/state/mod.rs b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/state/mod.rs index 69ff0aa0d01..5e1f38a73d6 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/state/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/state/mod.rs @@ -1,10 +1,10 @@ use crate::consensus::state::identity::IdentityAlreadyExistsError; use crate::identity::state_transition::identity_create_transition::IdentityCreateTransition; -use crate::prelude::Identity; use crate::state_repository::StateRepositoryLike; use crate::state_transition::StateTransitionLike; use crate::validation::ValidationResult; use crate::NonConsensusError; +use std::convert::TryInto; /// Validate that identity exists /// @@ -21,8 +21,11 @@ pub async fn validate_identity_create_transition_state( let identity_id = state_transition.get_identity_id(); let maybe_identity = state_repository - .fetch_identity::(identity_id, state_transition.get_execution_context()) - .await + .fetch_identity(identity_id, state_transition.get_execution_context()) + .await? + .map(TryInto::try_into) + .transpose() + .map_err(Into::into) .map_err(|e| NonConsensusError::StateRepositoryFetchError(e.to_string()))?; if state_transition.get_execution_context().is_dry_run() { diff --git a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/apply_identity_credit_withdrawal_transition_factory.rs b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/apply_identity_credit_withdrawal_transition_factory.rs index 36a11505bf0..ec63d880dde 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/apply_identity_credit_withdrawal_transition_factory.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/apply_identity_credit_withdrawal_transition_factory.rs @@ -7,9 +7,10 @@ use dashcore::{ Script, TxOut, }; use lazy_static::__Deref; +use std::convert::TryInto; use crate::{ - identity::convert_credits_to_satoshi, prelude::Identity, state_repository::StateRepositoryLike, + identity::convert_credits_to_satoshi, state_repository::StateRepositoryLike, state_transition::StateTransitionLike, }; @@ -67,13 +68,16 @@ where .enqueue_withdrawal_transaction(latest_withdrawal_index, transaction_buffer) .await?; - let maybe_existing_identity: Option = self + let maybe_existing_identity = self .state_repository .fetch_identity( &state_transition.identity_id, state_transition.get_execution_context(), ) - .await?; + .await? + .map(TryInto::try_into) + .transpose() + .map_err(Into::into)?; let mut existing_identity = maybe_existing_identity.ok_or_else(|| anyhow!("Identity not found"))?; diff --git a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_transition_state.rs b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_transition_state.rs index bd4c98a892f..47ffc48f528 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_transition_state.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_transition_state.rs @@ -1,3 +1,4 @@ +use std::convert::TryInto; use std::sync::Arc; use anyhow::Result; @@ -5,7 +6,6 @@ use anyhow::Result; use crate::{ consensus::basic::{identity::IdentityInsufficientBalanceError, BasicError}, identity::state_transition::identity_credit_withdrawal_transition::IdentityCreditWithdrawalTransition, - prelude::Identity, state_repository::StateRepositoryLike, state_transition::StateTransitionLike, validation::ValidationResult, @@ -33,14 +33,17 @@ where ) -> Result, NonConsensusError> { let mut result: ValidationResult<()> = ValidationResult::default(); - let maybe_existing_identity: Option = self + let maybe_existing_identity = self .state_repository .fetch_identity( &state_transition.identity_id, state_transition.get_execution_context(), ) - .await - .map_err(|err| NonConsensusError::StateRepositoryFetchError(err.to_string()))?; + .await? + .map(TryInto::try_into) + .transpose() + .map_err(Into::into) + .map_err(|e| NonConsensusError::StateRepositoryFetchError(e.to_string()))?; let existing_identity = match maybe_existing_identity { None => { diff --git a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/apply_identity_topup_transition.rs b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/apply_identity_topup_transition.rs index 805b22826b2..ebb108199ab 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/apply_identity_topup_transition.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/apply_identity_topup_transition.rs @@ -1,10 +1,11 @@ +use std::convert::TryInto; use std::sync::Arc; use anyhow::{anyhow, Result}; use crate::identity::state_transition::asset_lock_proof::AssetLockTransactionOutputFetcher; use crate::identity::state_transition::identity_topup_transition::IdentityTopUpTransition; -use crate::identity::{convert_satoshi_to_credits, get_biggest_possible_identity, Identity}; +use crate::identity::{convert_satoshi_to_credits, get_biggest_possible_identity}; use crate::state_repository::StateRepositoryLike; use crate::state_transition::StateTransitionLike; @@ -47,11 +48,13 @@ where .out_point() .ok_or_else(|| anyhow!("Out point is missing from asset lock proof"))?; let identity_id = state_transition.get_identity_id(); - let mut maybe_identity = self .state_repository - .fetch_identity::(identity_id, state_transition.get_execution_context()) - .await?; + .fetch_identity(identity_id, state_transition.get_execution_context()) + .await? + .map(TryInto::try_into) + .transpose() + .map_err(Into::into)?; if is_dry_run { maybe_identity = Some(get_biggest_possible_identity()) diff --git a/packages/rs-dpp/src/identity/state_transition/identity_update_transition/apply_identity_update_transition.rs b/packages/rs-dpp/src/identity/state_transition/identity_update_transition/apply_identity_update_transition.rs index 84ba3a3b743..bb436958c00 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_update_transition/apply_identity_update_transition.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_update_transition/apply_identity_update_transition.rs @@ -1,9 +1,10 @@ +use std::convert::TryInto; use std::sync::Arc; use crate::{ consensus::{basic::BasicError, ConsensusError}, identity::get_biggest_possible_identity, - prelude::{Identifier, Identity}, + prelude::Identifier, state_repository::StateRepositoryLike, state_transition::StateTransitionLike, ProtocolError, @@ -33,12 +34,15 @@ pub async fn apply_identity_update_transition( state_repository: &impl StateRepositoryLike, state_transition: IdentityUpdateTransition, ) -> Result<(), ProtocolError> { - let mut maybe_identity: Option = state_repository + let mut maybe_identity = state_repository .fetch_identity( state_transition.get_identity_id(), state_transition.get_execution_context(), ) - .await?; + .await? + .map(TryInto::try_into) + .transpose() + .map_err(Into::into)?; if state_transition.get_execution_context().is_dry_run() { maybe_identity = Some(get_biggest_possible_identity()) diff --git a/packages/rs-dpp/src/identity/state_transition/identity_update_transition/validate_identity_update_transition_state.rs b/packages/rs-dpp/src/identity/state_transition/identity_update_transition/validate_identity_update_transition_state.rs index 7d40e69a0fe..75ffaef5837 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_update_transition/validate_identity_update_transition_state.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_update_transition/validate_identity_update_transition_state.rs @@ -1,12 +1,12 @@ use dashcore::BlockHeader; use serde_json::Value; +use std::convert::TryInto; use std::sync::Arc; use crate::{ block_time_window::validate_time_in_block_time_window::validate_time_in_block_time_window, consensus::basic::BasicError, identity::validation::{RequiredPurposeAndSecurityLevelValidator, TPublicKeysValidator}, - prelude::Identity, state_repository::StateRepositoryLike, state_transition::StateTransitionLike, validation::SimpleValidationResult, @@ -38,13 +38,16 @@ where ) -> Result { let mut validation_result = SimpleValidationResult::default(); - let maybe_stored_identity: Option = self + let maybe_stored_identity = self .state_repository .fetch_identity( state_transition.get_identity_id(), state_transition.get_execution_context(), ) - .await + .await? + .map(TryInto::try_into) + .transpose() + .map_err(Into::into) .map_err(|e| NonConsensusError::StateRepositoryFetchError(e.to_string()))?; if state_transition.get_execution_context().is_dry_run() { diff --git a/packages/rs-dpp/src/state_repository.rs b/packages/rs-dpp/src/state_repository.rs index 1aa13ffcf3f..4011fc7f442 100644 --- a/packages/rs-dpp/src/state_repository.rs +++ b/packages/rs-dpp/src/state_repository.rs @@ -24,6 +24,7 @@ impl From for ProtocolError { pub trait StateRepositoryLike: Send + Sync { type ConversionError: Into; type FetchDataContract: TryInto; + type FetchIdentity: TryInto; /// Fetch the Data Contract by ID /// By default, the method should return data as bytes (`Vec`), but the deserialization to [`DataContract`] should be also possible @@ -87,13 +88,11 @@ pub trait StateRepositoryLike: Send + Sync { /// Fetch Identity by ID /// By default, the method should return data as bytes (`Vec`), but the deserialization to [`Identity`] should be also possible - async fn fetch_identity( + async fn fetch_identity( &self, id: &Identifier, execution_context: &StateTransitionExecutionContext, - ) -> AnyResult> - where - T: for<'de> serde::de::Deserialize<'de> + 'static; + ) -> AnyResult>; /// Store Public Key hashes and Identity id pair async fn store_identity_public_key_hashes( diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs index edaac1cc1ad..b9fcdf39e90 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs @@ -1,4 +1,5 @@ use anyhow::Context; +use std::convert::TryInto; use crate::{ consensus::fee::FeeError, @@ -6,7 +7,6 @@ use crate::{ convert_satoshi_to_credits, state_transition::asset_lock_proof::AssetLockTransactionOutputFetcher, }, - prelude::Identity, state_repository::StateRepositoryLike, state_transition::{StateTransition, StateTransitionIdentitySigned, StateTransitionLike}, validation::SimpleValidationResult, @@ -66,11 +66,17 @@ where })?; let balance = convert_satoshi_to_credits(output.value); let identity_id = st.get_owner_id(); - let identity: Identity = self + let identity = self .state_repository - .fetch_identity(identity_id, execution_context) + .fetch_identity(identity_id, st.get_execution_context()) .await? - .with_context(|| format!("identity with ID {}' doesn't exist", identity_id))?; + .map(TryInto::try_into) + .transpose() + .map_err(Into::into)? + .ok_or_else(|| ProtocolError::IdentityNotPresentError { + id: identity_id.clone(), + })?; + if execution_context.is_dry_run() { return Ok(result); } @@ -128,11 +134,16 @@ where st: &impl StateTransitionIdentitySigned, ) -> Result { let identity_id = st.get_owner_id(); - let identity: Identity = self + let identity = self .state_repository .fetch_identity(identity_id, st.get_execution_context()) .await? - .with_context(|| format!("identity with ID {}' doesn't exist", identity_id))?; + .map(TryInto::try_into) + .transpose() + .map_err(Into::into)? + .ok_or_else(|| ProtocolError::IdentityNotPresentError { + id: identity_id.clone(), + })?; Ok(identity.get_balance()) } diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs index 83129c46ddc..fe4f0e41c24 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs @@ -1,4 +1,4 @@ -use std::collections::HashSet; +use std::{collections::HashSet, convert::TryInto}; use anyhow::Context; use lazy_static::lazy_static; @@ -6,7 +6,6 @@ use lazy_static::lazy_static; use crate::{ consensus::{signature::SignatureError, ConsensusError}, identity::KeyType, - prelude::Identity, state_repository::StateRepositoryLike, state_transition::{ fee::operations::{Operation, SignatureVerificationOperation}, @@ -41,8 +40,11 @@ pub async fn validate_state_transition_identity_signature( // Owner must exist let maybe_identity = state_repository - .fetch_identity::(state_transition.get_owner_id(), &tmp_execution_context) - .await?; + .fetch_identity(state_transition.get_owner_id(), &tmp_execution_context) + .await? + .map(TryInto::try_into) + .transpose() + .map_err(Into::into)?; // Collect operations back from temporary context state_transition diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_key_signature.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_key_signature.rs index 0d532f9a872..79ecc8b82df 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_key_signature.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_key_signature.rs @@ -10,7 +10,6 @@ use crate::{ state_transition::asset_lock_proof::{AssetLockProof, AssetLockPublicKeyHashFetcher}, KeyType, }, - prelude::Identity, state_repository::StateRepositoryLike, state_transition::{ fee::operations::{Operation, SignatureVerificationOperation}, @@ -76,7 +75,7 @@ pub async fn validate_state_transition_key_signature( // Target identity must exist let identity = state_repository - .fetch_identity::(target_identity_id, &tmp_execution_context) + .fetch_identity(target_identity_id, &tmp_execution_context) .await?; // Collect operations back from temporary context diff --git a/packages/wasm-dpp/src/identity/mod.rs b/packages/wasm-dpp/src/identity/mod.rs index be4641a7820..9ea48377e63 100644 --- a/packages/wasm-dpp/src/identity/mod.rs +++ b/packages/wasm-dpp/src/identity/mod.rs @@ -19,7 +19,7 @@ use crate::utils::to_vec_of_serde_values; use crate::MetadataWasm; pub use identity_public_key::*; -use state_transition::*; +pub use state_transition::*; pub mod state_transition; @@ -27,6 +27,12 @@ pub mod state_transition; #[derive(Clone)] pub struct IdentityWasm(Identity); +impl From for Identity { + fn from(identity: IdentityWasm) -> Self { + identity.0 + } +} + #[wasm_bindgen(js_class=Identity)] impl IdentityWasm { #[wasm_bindgen(constructor)] diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index d2c9fc27a6c..1df486c94a7 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -4,7 +4,8 @@ use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; use crate::identifier::IdentifierWrapper; -use crate::state_transition::AssetLockProofWasm; +use crate::identity::state_transition::AssetLockProofWasm; + use crate::{ buffer::Buffer, errors::RustConversionError, @@ -12,6 +13,7 @@ use crate::{ state_transition::asset_lock_proof::{ChainAssetLockProofWasm, InstantAssetLockProofWasm}, IdentityPublicKeyWasm, }, + state_transition::StateTransitionExecutionContextWasm, with_js_error, }; @@ -78,6 +80,12 @@ impl From for IdentityCreateTransitionWasm { } } +impl From for IdentityCreateTransition { + fn from(v: IdentityCreateTransitionWasm) -> Self { + v.0 + } +} + #[wasm_bindgen(js_class = IdentityCreateTransition)] impl IdentityCreateTransitionWasm { #[wasm_bindgen(constructor)] @@ -367,4 +375,9 @@ impl IdentityCreateTransitionWasm { }) .collect() } + + #[wasm_bindgen(js_name=setExecutionContext)] + pub fn set_execution_context(&mut self, context: &StateTransitionExecutionContextWasm) { + self.0.set_execution_context(context.into()) + } } diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs index 1de908f2b11..499a2cd691a 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs @@ -1,3 +1,5 @@ pub use identity_create_transition::*; +pub use validation::*; pub mod identity_create_transition; +pub mod validation; diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs new file mode 100644 index 00000000000..7a941e886fe --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs @@ -0,0 +1,21 @@ +use dpp::identity::state_transition::identity_create_transition::validation::state::validate_identity_create_transition_state; +use wasm_bindgen::prelude::*; + +use crate::{ + errors::from_dpp_err, + state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, + validation_result::ValidationResultWasm, + IdentityCreateTransitionWasm, +}; + +#[wasm_bindgen(js_name=validateIdentityCreateTransitionState)] +pub async fn validate_identity_create_transition_state_wasm( + state_repository: ExternalStateRepositoryLike, + state_transition: IdentityCreateTransitionWasm, +) -> Result { + let wrapped_state_repository = ExternalStateRepositoryLikeWrapper::new(state_repository); + validate_identity_create_transition_state(&wrapped_state_repository, state_transition.into()) + .await + .map(Into::into) + .map_err(|e| from_dpp_err(e.into())) +} diff --git a/packages/wasm-dpp/src/state_repository.rs b/packages/wasm-dpp/src/state_repository.rs index 072081b9352..59d0c2ecd9d 100644 --- a/packages/wasm-dpp/src/state_repository.rs +++ b/packages/wasm-dpp/src/state_repository.rs @@ -13,7 +13,10 @@ use dpp::{ }; use wasm_bindgen::prelude::*; -use crate::{identifier::IdentifierWrapper, DataContractWasm, StateTransitionExecutionContextWasm}; +use crate::{ + identifier::IdentifierWrapper, DataContractWasm, IdentityWasm, + StateTransitionExecutionContextWasm, +}; #[wasm_bindgen] extern "C" { @@ -33,6 +36,13 @@ extern "C" { execution_context: StateTransitionExecutionContextWasm, ) -> JsValue; + #[wasm_bindgen(structural, method, js_name=fetchIdentity)] + pub fn fetch_identity( + this: &ExternalStateRepositoryLike, + id: IdentifierWrapper, + execution_context: StateTransitionExecutionContextWasm, + ) -> Option; + // TODO add missing declarations } @@ -53,6 +63,7 @@ impl ExternalStateRepositoryLikeWrapper { impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper { type ConversionError = Infallible; type FetchDataContract = DataContractWasm; + type FetchIdentity = IdentityWasm; async fn fetch_data_contract( &self, @@ -132,15 +143,17 @@ impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper { todo!() } - async fn fetch_identity( + async fn fetch_identity( &self, - _id: &Identifier, - _execution_context: &StateTransitionExecutionContext, - ) -> anyhow::Result> - where - T: for<'de> serde::de::Deserialize<'de> + 'static, - { - todo!() + id: &Identifier, + execution_context: &StateTransitionExecutionContext, + ) -> anyhow::Result> { + Ok(self + .0 + .lock() + .expect("unexpected concurrency issue!") + .fetch_identity(id.clone().into(), execution_context.clone().into()) + .map(Into::into)) } async fn store_identity_public_key_hashes( diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js index 83b8d6b3162..557c77b958b 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js @@ -1,70 +1,83 @@ -const { expectValidationError } = require( - '@dashevo/dpp/lib/test/expect/expectError', -); - -const validateIdentityCreateTransitionStateFactory = require( - '@dashevo/dpp/lib/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory', -); +// const { expectValidationError } = require( +// '@dashevo/dpp/lib/test/expect/expectError', +// ); const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); -const IdentityAlreadyExistsError = require( - '@dashevo/dpp/lib/errors/consensus/state/identity/IdentityAlreadyExistsError', -); +// const IdentityAlreadyExistsError = require( +// '@dashevo/dpp/lib/errors/consensus/state/identity/IdentityAlreadyExistsError', +// ); const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); +// const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); + +const { default: loadWasmDpp } = require('../../../../../../../dist'); describe('validateIdentityCreateTransitionStateFactory', () => { + let IdentityCreateTransition; + let StateTransitionExecutionContext; + // let ValidationResult; let validateIdentityCreateTransitionState; + let validate; + let executionContext; + let stateTransition; let stateRepositoryMock; - beforeEach(async function beforeEach() { - const privateKey = 'af432c476f65211f45f48f1d42c9c0b497e56696aa1736b40544ef1a496af837'; - stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); + before(async () => { + ({ + IdentityCreateTransition, + StateTransitionExecutionContext, + // ValidationResult, + validateIdentityCreateTransitionState, + } = await loadWasmDpp()); + }); - validateIdentityCreateTransitionState = validateIdentityCreateTransitionStateFactory( - stateRepositoryMock, - ); + beforeEach(async function () { + const stFixture = getIdentityCreateTransitionFixture(); + stateTransition = new IdentityCreateTransition(stFixture.toObject()); - stateTransition = getIdentityCreateTransitionFixture(); + executionContext = new StateTransitionExecutionContext(); + stateTransition.setExecutionContext(executionContext); - await stateTransition.signByPrivateKey(privateKey, IdentityPublicKey.TYPES.ECDSA_SECP256K1); + // const privateKey = 'af432c476f65211f45f48f1d42c9c0b497e56696aa1736b40544ef1a496af837'; + // await stateTransition.signByPrivateKey(privateKey, IdentityPublicKey.TYPES.ECDSA_SECP256K1); + stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); const rawTransaction = '030000000137feb5676d0851337ea3c9a992496aab7a0b3eee60aeeb9774000b7f4bababa5000000006b483045022100d91557de37645c641b948c6cd03b4ae3791a63a650db3e2fee1dcf5185d1b10402200e8bd410bf516ca61715867666d31e44495428ce5c1090bf2294a829ebcfa4ef0121025c3cc7fbfc52f710c941497fd01876c189171ea227458f501afcb38a297d65b4ffffffff021027000000000000166a14152073ca2300a86b510fa2f123d3ea7da3af68dcf77cb0090a0000001976a914152073ca2300a86b510fa2f123d3ea7da3af68dc88ac00000000'; - stateRepositoryMock.fetchTransaction.resolves(rawTransaction); - }); - - it('should return invalid result if identity already exists', async () => { - stateRepositoryMock.fetchIdentity.resolves({}); - - const result = await validateIdentityCreateTransitionState(stateTransition); - expectValidationError(result, IdentityAlreadyExistsError, 1); - - const [error] = result.getErrors(); + validate = (st) => validateIdentityCreateTransitionState(stateRepositoryMock, st); + }); - expect(error.getCode()).to.equal(4011); - expect(Buffer.isBuffer(error.getIdentityId())).to.be.true(); - expect(error.getIdentityId()).to.deep.equal(stateTransition.getIdentityId()); + // TODO: wait for error types? + it.skip('should return invalid result if identity already exists', async () => { + // stateRepositoryMock.fetchIdentity.resolves({}); + // + // const result = await validateIdentityCreateTransitionState(stateTransition); + // + // expectValidationError(result, IdentityAlreadyExistsError, 1); + // + // const [error] = result.getErrors(); + // + // expect(error.getCode()).to.equal(4011); + // expect(Buffer.isBuffer(error.getIdentityId())).to.be.true(); + // expect(error.getIdentityId()).to.deep.equal(stateTransition.getIdentityId()); }); it('should return valid result if state transition is valid', async () => { - const result = await validateIdentityCreateTransitionState(stateTransition); + const result = await validate(stateTransition); expect(result.isValid()).to.be.true(); }); it('should return valid result on dry run', async () => { - stateRepositoryMock.fetchIdentity.resolves({}); - - stateTransition.getExecutionContext().enableDryRun(); + executionContext.enableDryRun(); - const result = await validateIdentityCreateTransitionState(stateTransition); + const result = await validate(stateTransition); - stateTransition.getExecutionContext().disableDryRun(); + executionContext.disableDryRun(); + expect(stateRepositoryMock.fetchIdentity).to.have.been.called(); expect(result.isValid()).to.be.true(); }); From a7c6cc331ee2fc87d66fef2f3170a464d67e5b8a Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Thu, 22 Dec 2022 15:10:53 +0400 Subject: [PATCH 20/66] feat(wasm-dpp): remaining unit tests for IdentityCreateTransition.spec.js --- .../identity_create_transition.rs | 15 +++++++++++++++ .../IdentityCreateTransition.spec.js | 6 +++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index 1df486c94a7..b6dd4b4b4e2 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -376,6 +376,21 @@ impl IdentityCreateTransitionWasm { .collect() } + #[wasm_bindgen(js_name=isDataContractStateTransition)] + pub fn is_data_contract_state_transition(&self) -> bool { + self.0.is_data_contract_state_transition() + } + + #[wasm_bindgen(js_name=isDocumentStateTransition)] + pub fn is_document_state_transition(&self) -> bool { + self.0.is_document_state_transition() + } + + #[wasm_bindgen(js_name=isIdentityStateTransition)] + pub fn is_identity_state_transition(&self) -> bool { + self.0.is_identity_state_transition() + } + #[wasm_bindgen(js_name=setExecutionContext)] pub fn set_execution_context(&mut self, context: &StateTransitionExecutionContextWasm) { self.0.set_execution_context(context.into()) diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js index b17331129ca..0c1019d45ae 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js @@ -224,19 +224,19 @@ describe('IdentityCreateTransition', () => { }); }); - describe.skip('#isDataContractStateTransition', () => { + describe('#isDataContractStateTransition', () => { it('should return false', () => { expect(stateTransition.isDataContractStateTransition()).to.be.false(); }); }); - describe.skip('#isDocumentStateTransition', () => { + describe('#isDocumentStateTransition', () => { it('should return false', () => { expect(stateTransition.isDocumentStateTransition()).to.be.false(); }); }); - describe.skip('#isIdentityStateTransition', () => { + describe('#isIdentityStateTransition', () => { it('should return true', () => { expect(stateTransition.isIdentityStateTransition()).to.be.true(); }); From afbd271b7f1e5335e11b540657b4e91572967c48 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Mon, 26 Dec 2022 12:07:39 +0400 Subject: [PATCH 21/66] refactor(wasm-dpp): to_object.rs of identity_create_transition.rs --- .../identity_create_transition.rs | 118 ++++++------------ .../identity_create_transition/mod.rs | 1 + .../IdentityCreateTransition.spec.js | 22 ++-- 3 files changed, 46 insertions(+), 95 deletions(-) diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index b6dd4b4b4e2..bceafee6abc 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -33,39 +33,6 @@ use dpp::{ #[wasm_bindgen(js_name=IdentityCreateTransition)] pub struct IdentityCreateTransitionWasm(IdentityCreateTransition); -#[derive(Deserialize, Default)] -#[serde(rename_all = "camelCase")] -pub struct SerializationOptions { - pub skip_signature: Option, - pub skip_identifiers_conversion: Option, -} - -#[derive(Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct RawInstantAssetLockProof { - #[serde(rename = "type")] - lock_type: u8, - instant_lock: Vec, - transaction: Vec, - output_index: u32, -} - -#[derive(Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct RawChainAssetLockProof { - #[serde(rename = "type")] - lock_type: u8, - core_chain_locked_height: u32, - out_point: Vec, -} - -#[derive(Deserialize, Serialize)] -#[serde(untagged)] -pub enum RawAssetLockProof { - Instant(RawInstantAssetLockProof), - Chain(RawChainAssetLockProof), -} - #[derive(Deserialize, Serialize)] #[serde(rename_all = "camelCase")] struct IdentityCreateTransitionParams { @@ -192,7 +159,7 @@ impl IdentityCreateTransitionWasm { #[wasm_bindgen(js_name=getType)] pub fn get_type(&self) -> u8 { - IdentityCreateTransition::get_type() as u8 + self.0.get_type() as u8 } #[wasm_bindgen(getter, js_name=identityId)] @@ -212,78 +179,65 @@ impl IdentityCreateTransitionWasm { #[wasm_bindgen(js_name=toObject)] pub fn to_object(&self, options: JsValue) -> Result { - let opts: SerializationOptions = if options.is_object() { + let opts: super::to_object::ToObjectOptions = if options.is_object() { with_js_error!(serde_wasm_bindgen::from_value(options))? } else { Default::default() }; + let skip_signature = opts.skip_signature.clone(); + let object = super::to_object::to_object_struct(&self.0, opts); let js_object = js_sys::Object::new(); - // Add signature - if !opts.skip_signature.unwrap_or(false) { - let signature = self.0.get_signature(); - let signature_buffer = Buffer::from_bytes(signature.as_slice()); + js_sys::Reflect::set( + &js_object, + &"type".to_owned().into(), + &object.transition_type.into(), + )?; - js_sys::Reflect::set( - &js_object, - &"signature".to_owned().into(), - &signature_buffer.into(), - )?; - } + js_sys::Reflect::set( + &js_object, + &"protocolVersion".to_owned().into(), + &object.protocol_version.into(), + )?; - // Add identityId (following to_json_object example if rs-dpp IdentityCreateTransition) - if !opts.skip_identifiers_conversion.unwrap_or(false) { - let signature = self.0.get_signature(); - let signature_buffer = Buffer::from_bytes(signature.as_slice()); - js_sys::Reflect::set( - &js_object, - &"identityId".to_owned().into(), - &signature_buffer.into(), - )?; - } else { + if let Some(signature) = object.signature { js_sys::Reflect::set( &js_object, - &"identityId".to_owned().into(), - &self.get_identity_id().into(), + &"signature".to_owned().into(), + &Buffer::from_bytes(signature.as_slice()), )?; } - // Write asset lock proof wasm object - let asset_lock_proof = self.get_asset_lock_proof(); js_sys::Reflect::set( &js_object, - &"assetLockProof".to_owned().into(), - &asset_lock_proof.into(), + &"identityId".to_owned().into(), + &Buffer::from_bytes(object.identity_id.buffer.as_slice()), )?; - // Write array of public keys - let public_keys = self.get_public_keys(); - let js_public_keys = js_sys::Array::new(); + let asset_lock_proof_object = match object.asset_lock_proof { + AssetLockProof::Instant(instant_asset_lock_proof) => { + InstantAssetLockProofWasm::from(instant_asset_lock_proof).to_object()? + } + AssetLockProof::Chain(chain_asset_lock_proof) => { + ChainAssetLockProofWasm::from(chain_asset_lock_proof).to_object()? + } + }; - for pk in public_keys { - js_public_keys.push(&pk); - } js_sys::Reflect::set( &js_object, - &"publicKeys".to_owned().into(), - &JsValue::from(&js_public_keys), + &"assetLockProof".to_owned().into(), + &asset_lock_proof_object, )?; - // Write ST type - let transition_type = self.get_type(); - js_sys::Reflect::set( - &js_object, - &"type".to_owned().into(), - &JsValue::from(transition_type), - )?; + let keys_objects = object + .public_keys + .into_iter() + .map(IdentityPublicKeyWasm::from) + .map(|key| key.to_object(skip_signature)) + .collect::>()?; - let protocol_version = self.0.get_protocol_version(); - js_sys::Reflect::set( - &js_object, - &"protocolVersion".to_owned().into(), - &protocol_version.into(), - )?; + js_sys::Reflect::set(&js_object, &"publicKeys".to_owned().into(), &keys_objects)?; Ok(js_object.into()) } diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs index 499a2cd691a..8c8134af522 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs @@ -2,4 +2,5 @@ pub use identity_create_transition::*; pub use validation::*; pub mod identity_create_transition; +mod to_object; pub mod validation; diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js index 0c1019d45ae..5f406e69907 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js @@ -165,29 +165,25 @@ describe('IdentityCreateTransition', () => { }); }); - describe('#toObject', () => { + describe.only('#toObject', () => { it('should return raw state transition', () => { const stObject = stateTransition.toObject(); const stObjectJS = stateTransitionJS.toObject(); + // TODO: fix? stObjectJS missing identityId. + delete stObject.identityId; - expect(stObject.signature).to.deep.equal(stObjectJS.signature); - - // TODO: identityId is missing in JS object. Fix? - // compare to `signature` option because it's returned as identityId - // in case skipIdentifiersConversion is true - expect(stObject.identityId).to.deep.equal(stObjectJS.signature); - expect(stObject.assetLockProof.toObject()).to - .deep.equal(stObjectJS.assetLockProof); - expect(stObject.publicKeys.map((key) => key.toObject())) - .to.deep.equal(stObjectJS.publicKeys); - expect(stObject.type).to.equal(stObjectJS.type); - expect(stObject.protocolVersion).to.equal(stObjectJS.protocolVersion); + expect(stObject).to.deep.equal(stObjectJS); }); it('should return raw state transition without signature', () => { const stObject = stateTransition.toObject({ skipSignature: true }); + const stObjectJS = stateTransitionJS.toObject({ skipSignature: true }); + + // TODO: fix? stObjectJS missing identityId. + delete stObject.identityId; expect(stObject.signature).to.not.exist(); + expect(stObject).to.deep.equal(stObjectJS); }); }); From 082f8ae75f890c367db2fbae6d300a916b261eb8 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Mon, 26 Dec 2022 12:16:15 +0400 Subject: [PATCH 22/66] refactor(wasm-dpp): to_json in identity_create_transition.rs --- .../identity_create_transition.rs | 2 +- .../identity_create_transition.rs | 76 +++++++------------ .../IdentityCreateTransition.spec.js | 14 +--- 3 files changed, 34 insertions(+), 58 deletions(-) diff --git a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index eacd0928fc0..f9bf1ceaba1 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -296,7 +296,7 @@ impl StateTransitionLike for IdentityCreateTransition { } /// returns the type of State Transition fn get_type(&self) -> StateTransitionType { - StateTransitionType::IdentityTopUp + StateTransitionType::IdentityCreate } /// returns the signature as a byte-array fn get_signature(&self) -> &Vec { diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index bceafee6abc..e4c5c9cd70a 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -244,35 +244,44 @@ impl IdentityCreateTransitionWasm { #[wasm_bindgen(js_name=toJSON)] pub fn to_json(&self) -> Result { + let object = super::to_object::to_object_struct(&self.0, Default::default()); let js_object = js_sys::Object::new(); - // Write signature - let signature = self.0.get_signature(); - let signature_base64 = string_encoding::encode(signature.as_slice(), Encoding::Base64); + js_sys::Reflect::set( + &js_object, + &"type".to_owned().into(), + &object.transition_type.into(), + )?; js_sys::Reflect::set( &js_object, - &"signature".to_owned().into(), - &JsValue::from(&signature_base64), + &"protocolVersion".to_owned().into(), + &object.protocol_version.into(), )?; - // Write identityId (following to_json_object example if rs-dpp IdentityCreateTransition) + if let Some(signature) = object.signature { + let signature_base64 = string_encoding::encode(signature.as_slice(), Encoding::Base64); + js_sys::Reflect::set( + &js_object, + &"signature".to_owned().into(), + &signature_base64.into(), + )?; + } + js_sys::Reflect::set( &js_object, &"identityId".to_owned().into(), - &JsValue::from(&signature_base64), + &object.identity_id.to_string(Encoding::Base58).into(), )?; - // Write asset lock proof JSON - let asset_lock_proof = self.0.get_asset_lock_proof().to_owned(); - let asset_lock_proof_json = match asset_lock_proof { + let asset_lock_proof_json = match object.asset_lock_proof { AssetLockProof::Instant(instant_asset_lock_proof) => { - InstantAssetLockProofWasm::from(instant_asset_lock_proof).to_json() + InstantAssetLockProofWasm::from(instant_asset_lock_proof).to_json()? } AssetLockProof::Chain(chain_asset_lock_proof) => { - ChainAssetLockProofWasm::from(chain_asset_lock_proof).to_json() + ChainAssetLockProofWasm::from(chain_asset_lock_proof).to_json()? } - }?; + }; js_sys::Reflect::set( &js_object, @@ -280,41 +289,14 @@ impl IdentityCreateTransitionWasm { &asset_lock_proof_json, )?; - // Write public keys JSON values - let public_keys: Vec = self - .0 - .get_public_keys() - .iter() - .map(IdentityPublicKey::to_owned) - .map(|key| IdentityPublicKeyWasm::from(key).to_json().ok()) - .map(JsValue::from) - .collect(); - - let js_public_keys = js_sys::Array::new(); - - for pk in public_keys { - js_public_keys.push(&pk); - } - js_sys::Reflect::set( - &js_object, - &"publicKeys".to_owned().into(), - &JsValue::from(&js_public_keys), - )?; - - // Write type value - let transition_type = self.get_type(); - js_sys::Reflect::set( - &js_object, - &"type".to_owned().into(), - &JsValue::from(transition_type), - )?; + let keys_objects = object + .public_keys + .into_iter() + .map(IdentityPublicKeyWasm::from) + .map(|key| key.to_json()) + .collect::>()?; - let protocol_version = self.0.get_protocol_version(); - js_sys::Reflect::set( - &js_object, - &"protocolVersion".to_owned().into(), - &protocol_version.into(), - )?; + js_sys::Reflect::set(&js_object, &"publicKeys".to_owned().into(), &keys_objects)?; Ok(js_object.into()) } diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js index 5f406e69907..3ce5852bbb9 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js @@ -165,7 +165,7 @@ describe('IdentityCreateTransition', () => { }); }); - describe.only('#toObject', () => { + describe('#toObject', () => { it('should return raw state transition', () => { const stObject = stateTransition.toObject(); const stObjectJS = stateTransitionJS.toObject(); @@ -192,16 +192,10 @@ describe('IdentityCreateTransition', () => { const stJson = stateTransition.toJSON(); const stJsonJS = stateTransitionJS.toJSON(); - expect(stJson.signature).to.deep.equal(stJsonJS.signature); + // TODO: fix? stObjectJS missing identityId. + delete stJson.identityId; - // TODO: identityId is missing in JS object. Fix? - // Instead compare to `signature` option because it's returned as identityId - // in case skipIdentifiersConversion is true - expect(stJson.identityId).to.deep.equal(stJsonJS.signature); - expect(stJson.assetLockProof).to.deep.equal(stJsonJS.assetLockProof); - expect(stJson.publicKeys).to.deep.equal(stJsonJS.publicKeys); - expect(stJson.type).to.equal(stJsonJS.type); - expect(stJson.protocolVersion).to.equal(stJsonJS.protocolVersion); + expect(stJson).to.deep.equal(stJsonJS); }); }); From 04bfd02e9ed03560791165951c7d96b1fe5e842f Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Mon, 26 Dec 2022 12:19:20 +0400 Subject: [PATCH 23/66] fix(rs-dpp): signature instead of identity --- .../identity_topup_transition/identity_topup_transition.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs index 5bd5bff781a..0f006a9747d 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs @@ -143,7 +143,7 @@ impl IdentityTopUpTransition { } if !options.skip_identifiers_conversion { - let bytes = self.signature.iter().map(|num| JsonValue::from(*num)); + let bytes = self.identity_id.iter().map(|num| JsonValue::from(*num)); json_map.insert( property_names::IDENTITY_ID.to_string(), JsonValue::Array(bytes.collect()), From cdbc6a0f87e8c8837b9cdebb6f992debf1ad38d8 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Mon, 26 Dec 2022 12:25:34 +0400 Subject: [PATCH 24/66] fix(rs-dpp): signature instead of identity --- .../identity_topup_transition/identity_topup_transition.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs index 0f006a9747d..f9538a3aaf4 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs @@ -143,7 +143,11 @@ impl IdentityTopUpTransition { } if !options.skip_identifiers_conversion { - let bytes = self.identity_id.iter().map(|num| JsonValue::from(*num)); + let bytes = self + .identity_id + .buffer + .iter() + .map(|num| JsonValue::from(*num)); json_map.insert( property_names::IDENTITY_ID.to_string(), JsonValue::Array(bytes.collect()), From d29bec584aec66eefbe531071719d7ba926eaae4 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Mon, 26 Dec 2022 12:32:12 +0400 Subject: [PATCH 25/66] fix(wasm-dpp): return undefined signatures in case buffer len is zero --- .../identity_create_transition.rs | 25 +++++++++++-------- .../IdentityCreateTransition.spec.js | 8 +++--- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index e4c5c9cd70a..069ffccdcdc 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -202,11 +202,13 @@ impl IdentityCreateTransitionWasm { )?; if let Some(signature) = object.signature { - js_sys::Reflect::set( - &js_object, - &"signature".to_owned().into(), - &Buffer::from_bytes(signature.as_slice()), - )?; + let signature_value: JsValue = if signature.len() == 0 { + JsValue::undefined() + } else { + Buffer::from_bytes(signature.as_slice()).into() + }; + + js_sys::Reflect::set(&js_object, &"signature".to_owned().into(), &signature_value)?; } js_sys::Reflect::set( @@ -260,12 +262,13 @@ impl IdentityCreateTransitionWasm { )?; if let Some(signature) = object.signature { - let signature_base64 = string_encoding::encode(signature.as_slice(), Encoding::Base64); - js_sys::Reflect::set( - &js_object, - &"signature".to_owned().into(), - &signature_base64.into(), - )?; + let signature_value: JsValue = if signature.len() == 0 { + JsValue::undefined() + } else { + string_encoding::encode(signature.as_slice(), Encoding::Base64).into() + }; + + js_sys::Reflect::set(&js_object, &"signature".to_owned().into(), &signature_value)?; } js_sys::Reflect::set( diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js index 3ce5852bbb9..30300f6aecb 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js @@ -32,12 +32,9 @@ describe('IdentityCreateTransition', () => { beforeEach(() => { stateTransitionJS = getIdentityCreateTransitionFixture(); - // TODO: revisit? - // Provide publicKeys that have mocked signature, because in case of absence, - // JS returns signature as undefined and wasm binding returns empty buffer - // and we can not do deep.equal directly + // Fill public keys with signatures (to test skipSignature later) stateTransitionJS.publicKeys = [new IdentityPublicKeyJS(mockRawPublicKey())]; - // For the same reason we need to mock signature + // Fill signature (to test skipSignature later) stateTransitionJS.signature = Buffer.alloc(32).fill(1); stateTransition = new IdentityCreateTransition(stateTransitionJS.toObject()); }); @@ -169,6 +166,7 @@ describe('IdentityCreateTransition', () => { it('should return raw state transition', () => { const stObject = stateTransition.toObject(); const stObjectJS = stateTransitionJS.toObject(); + // TODO: fix? stObjectJS missing identityId. delete stObject.identityId; From 57b4697d3bfb7e6271dcef56bd72b84afdbd6e90 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Mon, 26 Dec 2022 15:44:40 +0400 Subject: [PATCH 26/66] fix(wasm-dpp): identity_create_transition accept asset lock proof instance in setter method --- .../state_transition/asset_lock_proof/mod.rs | 51 ++++++++++++++++--- .../identity_create_transition.rs | 21 +++----- .../IdentityCreateTransition.spec.js | 21 ++++---- .../InstantAssetLockProof.spec.js | 1 - 4 files changed, 63 insertions(+), 31 deletions(-) diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index 4eb39b922ff..bf7211c3c48 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -7,10 +7,11 @@ pub use instant::*; use crate::errors::RustConversionError; use wasm_bindgen::prelude::*; +use crate::identifier::IdentifierWrapper; use crate::Deserialize; use dpp::identity::state_transition::asset_lock_proof::AssetLockProof; -#[derive(Deserialize)] +#[derive(Deserialize, Clone)] #[wasm_bindgen(js_name=AssetLockProof)] pub struct AssetLockProofWasm(AssetLockProof); @@ -26,6 +27,22 @@ impl From for AssetLockProof { } } +impl From for AssetLockProofWasm { + fn from(f: InstantAssetLockProofWasm) -> Self { + AssetLockProof::Instant(f.into()).into() + } +} + +impl From for AssetLockProofWasm { + fn from(f: ChainAssetLockProofWasm) -> Self { + AssetLockProof::Chain(f.into()).into() + } +} + +pub trait AssetLockProofLike { + fn to_object(&self) -> Result; +} + #[wasm_bindgen(js_class = AssetLockProof)] impl AssetLockProofWasm { #[wasm_bindgen(constructor)] @@ -33,18 +50,38 @@ impl AssetLockProofWasm { let lock_type = get_lock_type(&raw_asset_lock_proof)?; match lock_type { - 0 => Ok(Self::from(AssetLockProof::Instant( - InstantAssetLockProofWasm::new(raw_asset_lock_proof)?.into(), - ))), - 1 => Ok(Self::from(AssetLockProof::Chain( - ChainAssetLockProofWasm::new(raw_asset_lock_proof)?.into(), - ))), + 0 => Ok(InstantAssetLockProofWasm::new(raw_asset_lock_proof)?.into()), + 1 => Ok(ChainAssetLockProofWasm::new(raw_asset_lock_proof)?.into()), _ => Err( RustConversionError::Error(String::from("unrecognized asset lock type")) .to_js_value(), ), } } + + #[wasm_bindgen(js_name=createIdentifier)] + pub fn create_identifier(&self) -> Result { + match &self.0 { + AssetLockProof::Instant(instant) => { + InstantAssetLockProofWasm::from(instant.to_owned().clone()).create_identifier() + } + AssetLockProof::Chain(chain) => { + ChainAssetLockProofWasm::from(chain.to_owned().clone()).create_identifier() + } + } + } + + #[wasm_bindgen(js_name=toObject)] + pub fn to_object(&self) -> Result { + match &self.0 { + AssetLockProof::Instant(instant) => { + InstantAssetLockProofWasm::from(instant.to_owned().clone()).to_object() + } + AssetLockProof::Chain(chain) => { + ChainAssetLockProofWasm::from(chain.to_owned().clone()).to_object() + } + } + } } fn get_lock_type(raw_asset_lock_proof: &JsValue) -> Result { diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index 069ffccdcdc..7b0047088ab 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -81,9 +81,10 @@ impl IdentityCreateTransitionWasm { } #[wasm_bindgen(js_name=setAssetLockProof)] - pub fn set_asset_lock_proof(&mut self, asset_lock_proof: JsValue) -> Result<(), JsValue> { - let asset_lock_proof = AssetLockProofWasm::new(asset_lock_proof)?; - + pub fn set_asset_lock_proof( + &mut self, + asset_lock_proof: AssetLockProofWasm, + ) -> Result<(), JsValue> { self.0 .set_asset_lock_proof(asset_lock_proof.into()) .map_err(|e| RustConversionError::Error(e.to_string()).to_js_value())?; @@ -92,21 +93,13 @@ impl IdentityCreateTransitionWasm { } #[wasm_bindgen(getter, js_name=assetLockProof)] - pub fn asset_lock_proof(&self) -> JsValue { + pub fn asset_lock_proof(&self) -> AssetLockProofWasm { self.get_asset_lock_proof() } #[wasm_bindgen(js_name=getAssetLockProof)] - pub fn get_asset_lock_proof(&self) -> JsValue { - let asset_lock_proof = self.0.get_asset_lock_proof().to_owned(); - match asset_lock_proof { - AssetLockProof::Instant(instant_asset_lock_proof) => { - InstantAssetLockProofWasm::from(instant_asset_lock_proof).into() - } - AssetLockProof::Chain(chain_asset_lock_proof) => { - ChainAssetLockProofWasm::from(chain_asset_lock_proof).into() - } - } + pub fn get_asset_lock_proof(&self) -> AssetLockProofWasm { + self.0.get_asset_lock_proof().to_owned().into() } #[wasm_bindgen(js_name=setPublicKeys)] diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js index 30300f6aecb..b3151d8d286 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js @@ -12,6 +12,7 @@ describe('IdentityCreateTransition', () => { let KeyPurpose; let KeySecurityLevel; let IdentityPublicKey; + let AssetLockProof; const mockRawPublicKey = (params = {}) => ({ id: 0, @@ -27,6 +28,7 @@ describe('IdentityCreateTransition', () => { before(async () => { ({ IdentityCreateTransition, IdentityPublicKey, KeyType, KeyPurpose, KeySecurityLevel, + AssetLockProof, } = await loadWasmDpp()); }); @@ -64,20 +66,21 @@ describe('IdentityCreateTransition', () => { }); describe('#setAssetLockProof', () => { - it('should set asset lock proof', () => { - stateTransition.setAssetLockProof( - stateTransitionJS.assetLockProof.toObject(), - ); + let assetLockProofObject; + beforeEach(() => { + const assetLockProof = new AssetLockProof(getChainAssetLockProofFixture().toObject()); + assetLockProofObject = assetLockProof.toObject(); + stateTransition.setAssetLockProof(assetLockProof); + }); + it('should set asset lock proof', () => { expect(stateTransition.assetLockProof.toObject()) - .to.deep.equal(stateTransitionJS.assetLockProof.toObject()); + .to.deep.equal(assetLockProofObject); }); it('should set `identityId`', () => { stateTransition.setAssetLockProof( - // TODO: method accepts JS value and errors if we pass instances of wasm's AssetLockProof - // Should it be fixed? - stateTransition.assetLockProof.toObject(), + stateTransition.assetLockProof, ); expect(stateTransition.identityId.toBuffer()).to.deep.equal( @@ -87,7 +90,7 @@ describe('IdentityCreateTransition', () => { }); describe('#getAssetLockProof', () => { - it('should return currently set locked OutPoint', () => { + it('should return currently set locked asset lock proof', () => { expect(stateTransition.getAssetLockProof().toObject()).to.deep.equal( stateTransitionJS.assetLockProof.toObject(), ); diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js index 3e16bcf10ef..f83c6c904f1 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js @@ -45,7 +45,6 @@ describe('InstantAssetLockProof', () => { }); describe('#getOutPoint', () => { - // Buffers mismatch it('should return correct outPoint', () => { expect(instantAssetLockProof.getOutPoint()) .to.deep.equal(instantAssetLockProofJS.getOutPoint()); From 54d525ccfbc2ee71f8926d07364a52da61ce7e19 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Mon, 26 Dec 2022 16:18:11 +0400 Subject: [PATCH 27/66] fix(wasm-dpp): identity_create_transition accept public key instances in setter method --- .../identity_create_transition.rs | 24 ++++++------- .../IdentityCreateTransition.spec.js | 36 +++++++++---------- 2 files changed, 27 insertions(+), 33 deletions(-) diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index 7b0047088ab..d2cfdfe31ba 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -103,29 +103,27 @@ impl IdentityCreateTransitionWasm { } #[wasm_bindgen(js_name=setPublicKeys)] - pub fn set_public_keys(&mut self, public_keys: Vec) -> Result<(), JsValue> { + pub fn set_public_keys(&mut self, public_keys: js_sys::Array) -> Result<(), JsValue> { let public_keys = public_keys + .to_vec() .into_iter() - .map(|key| IdentityPublicKeyWasm::new(key)) - .collect::, _>>()?; + .map(|key| key.to_serde_json_value().unwrap()) + .map(|key_json| IdentityPublicKey::from_json_object(key_json).unwrap()) + .collect::>(); - self.0 - .set_public_keys(public_keys.into_iter().map(|key| key.into()).collect()); + self.0.set_public_keys(public_keys); // TODO: consider returning self as it's done in the internal set_public_keys method Ok(()) } #[wasm_bindgen(js_name=addPublicKeys)] - pub fn add_public_keys(&mut self, public_keys: Vec) -> Result<(), JsValue> { - let public_keys_wasm: Vec = public_keys - .into_iter() - .map(|key| IdentityPublicKeyWasm::new(key)) - .collect::, _>>()?; - - let mut public_keys = public_keys_wasm + pub fn add_public_keys(&mut self, public_keys: js_sys::Array) -> Result<(), JsValue> { + let mut public_keys = public_keys + .to_vec() .into_iter() - .map(|key| key.into()) + .map(|key| key.to_serde_json_value().unwrap()) + .map(|key_json| IdentityPublicKey::from_json_object(key_json).unwrap()) .collect::>(); self.0.add_public_keys(&mut public_keys); diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js index b3151d8d286..3bb25000e1d 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js @@ -99,15 +99,14 @@ describe('IdentityCreateTransition', () => { describe('#setPublicKeys', () => { it('should set public keys', () => { - const publicKeys = [ - new IdentityPublicKey(mockRawPublicKey({ id: 0 })), - new IdentityPublicKey(mockRawPublicKey({ id: 1 })), - ]; + const rawKeyOne = mockRawPublicKey({ id: 0 }); + const rawKeyTwo = mockRawPublicKey({ id: 1 }); - // TODO: method accepts JS value and errors if we pass instances of IdentityPublicKey - // Should it be fixed? - stateTransition.setPublicKeys(publicKeys.map((key) => key.toObject())); - stateTransitionJS.setPublicKeys(publicKeys); + const publicKeys = [new IdentityPublicKey(rawKeyOne), new IdentityPublicKey(rawKeyTwo)]; + const publicKeysJS = [new IdentityPublicKeyJS(rawKeyOne), new IdentityPublicKeyJS(rawKeyTwo)]; + + stateTransition.setPublicKeys(publicKeys); + stateTransitionJS.setPublicKeys(publicKeysJS); expect(stateTransition.publicKeys.map((key) => key.toObject())) .to.deep.equal(stateTransitionJS.publicKeys.map((key) => key.toObject())); @@ -116,27 +115,24 @@ describe('IdentityCreateTransition', () => { describe('#getPublicKeys', () => { it('should return set public keys', () => { - expect(stateTransition.getPublicKeys().map((key) => key.toJSON())) - .to.deep.equal( - stateTransitionJS.getPublicKeys().map((key) => key.toJSON()), - ); + expect(stateTransition.getPublicKeys().map((key) => key.toObject())) + .to.deep.equal(stateTransitionJS.getPublicKeys().map((key) => key.toObject())); }); }); describe('#addPublicKeys', () => { it('should add more public keys', () => { - const publicKeys = [ - new IdentityPublicKey(mockRawPublicKey({ id: 0 })), - new IdentityPublicKey(mockRawPublicKey({ id: 1 })), - ]; + const rawKeyOne = mockRawPublicKey({ id: 0 }); + const rawKeyTwo = mockRawPublicKey({ id: 1 }); + + const publicKeys = [new IdentityPublicKey(rawKeyOne), new IdentityPublicKey(rawKeyTwo)]; + const publicKeysJS = [new IdentityPublicKeyJS(rawKeyOne), new IdentityPublicKeyJS(rawKeyTwo)]; stateTransitionJS.publicKeys = []; - stateTransitionJS.addPublicKeys(publicKeys); + stateTransitionJS.addPublicKeys(publicKeysJS); stateTransition.setPublicKeys([]); - // TODO: method accepts JS value and errors if we pass instances of wasm IdentityPublicKey - // Should it be fixed? - stateTransition.addPublicKeys(publicKeys.map((key) => key.toObject())); + stateTransition.addPublicKeys(publicKeys); expect(stateTransition.getPublicKeys().map((key) => key.toObject())) .to.deep.equal(stateTransitionJS.getPublicKeys().map((key) => key.toObject())); From 9b593b0c7fb710b4e3b2de80c9ff8f08690ae3df Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Mon, 26 Dec 2022 16:44:51 +0400 Subject: [PATCH 28/66] fix(wasm-dpp): broken import --- .../identity_create_transition/identity_create_transition.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index d2cfdfe31ba..04566be9472 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -17,6 +17,7 @@ use crate::{ with_js_error, }; +use crate::utils::ToSerdeJSONExt; use dpp::{ identifier::Identifier, identity::{ From a354806820e3dfe3478f69705b0ce807714f53fa Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Mon, 26 Dec 2022 17:33:02 +0400 Subject: [PATCH 29/66] test(rs-dpp): fix identity related tests that uses state repository --- .../reward_share_data_triggers/mod.rs | 61 ++++++++++--------- .../apply_identity_topup_transition.rs | 3 +- ...ate_state_transition_identity_signature.rs | 2 +- ...validate_state_transition_key_signature.rs | 3 +- ...edit_withdrawal_transition_factory_spec.rs | 2 +- ...e_identity_credit_withdrawal_state_spec.rs | 8 +-- .../apply_identity_udpate_transition_spec.rs | 3 +- ...e_identity_update_transition_basic_spec.rs | 1 - ...e_identity_update_transition_state_spec.rs | 2 +- 9 files changed, 42 insertions(+), 43 deletions(-) diff --git a/packages/rs-dpp/src/data_trigger/reward_share_data_triggers/mod.rs b/packages/rs-dpp/src/data_trigger/reward_share_data_triggers/mod.rs index dd57b0475d2..dcac84a4650 100644 --- a/packages/rs-dpp/src/data_trigger/reward_share_data_triggers/mod.rs +++ b/packages/rs-dpp/src/data_trigger/reward_share_data_triggers/mod.rs @@ -21,7 +21,7 @@ const MAX_DOCUMENTS: usize = 16; pub async fn create_masternode_reward_shares_data_trigger<'a, SR>( document_transition: &DocumentTransition, context: &DataTriggerExecutionContext<'a, SR>, - _top_level_identity: Option<&Identifier>, + _top_level_identifier: Option<&Identifier>, ) -> Result where SR: StateRepositoryLike, @@ -70,7 +70,7 @@ where // payToId identity exists let pay_to_identifier = Identifier::from_string(pay_to_id, Encoding::Base58)?; - let maybe_identifier = context + let maybe_identity = context .state_repository .fetch_identity( &pay_to_identifier, @@ -78,7 +78,7 @@ where ) .await?; - if !is_dry_run && maybe_identifier.is_none() { + if !is_dry_run && maybe_identity.is_none() { let err = create_error( context, dt_create, @@ -139,6 +139,7 @@ mod test { use itertools::Itertools; use serde_json::json; + use crate::identity::Identity; use crate::{ data_contract::DataContract, data_trigger::DataTriggerExecutionContext, @@ -160,22 +161,23 @@ mod test { }; struct TestData { - top_level_identity: Identifier, + top_level_identifier: Identifier, data_contract: DataContract, sml_store: SMLStore, documents: Vec, document_transition: DocumentTransition, + identity: Identity, } fn setup_test() -> TestData { - let top_level_identity_hex = + let top_level_identifier_hex = "c286807d463b06c7aba3b9a60acf64c1fc03da8c1422005cd9b4293f08cf0562"; - let top_level_identity = - Identifier::from_bytes(&hex::decode(top_level_identity_hex).unwrap()).unwrap(); + let top_level_identifier = + Identifier::from_bytes(&hex::decode(top_level_identifier_hex).unwrap()).unwrap(); let sml_entries: Vec = vec![ SMLEntry { - pro_reg_tx_hash: top_level_identity_hex.to_string(), + pro_reg_tx_hash: top_level_identifier_hex.to_string(), confirmed_hash: "4eb56228c535db3b234907113fd41d57bcc7cdcb8e0e00e57590af27ee88c119".to_string(), service: "192.168.65.2:20101".to_string(), pub_key_operator: "809519c5f6f3be1c08782ac42ae9a83b6c7205eba43f9a96a4f032ec7a73f1a7c25fa78cce0d6d9c135f7e2c28527179".to_string(), @@ -208,9 +210,10 @@ mod test { TestData { documents, data_contract, - top_level_identity, + top_level_identifier, sml_store, document_transition: document_transitions[0].clone(), + identity: Identity::default(), } } @@ -238,7 +241,7 @@ mod test { documents, sml_store, data_contract, - top_level_identity, + top_level_identifier, .. } = setup_test(); @@ -247,7 +250,7 @@ mod test { .expect_fetch_sml_store() .returning(move || Ok(sml_store.clone())); state_repository_mock - .expect_fetch_identity::>() + .expect_fetch_identity() .returning(|_, _| Ok(None)); state_repository_mock .expect_fetch_documents() @@ -259,7 +262,7 @@ mod test { let execution_context = StateTransitionExecutionContext::default(); let context = DataTriggerExecutionContext { data_contract: &data_contract, - owner_id: &top_level_identity, + owner_id: &top_level_identifier, state_repository: &state_repository_mock, state_transition_execution_context: &execution_context, }; @@ -281,7 +284,7 @@ mod test { document_transition, sml_store, data_contract, - top_level_identity, + top_level_identifier, .. } = setup_test(); @@ -290,7 +293,7 @@ mod test { .expect_fetch_sml_store() .returning(move || Ok(sml_store.clone())); state_repository_mock - .expect_fetch_identity::>() + .expect_fetch_identity() .returning(move |_, _| Ok(None)); state_repository_mock .expect_fetch_documents::() @@ -299,7 +302,7 @@ mod test { let execution_context = StateTransitionExecutionContext::default(); let context = DataTriggerExecutionContext { data_contract: &data_contract, - owner_id: &top_level_identity, + owner_id: &top_level_identifier, state_repository: &state_repository_mock, state_transition_execution_context: &execution_context, }; @@ -338,7 +341,7 @@ mod test { .expect_fetch_sml_store() .returning(move || Ok(sml_store.clone())); state_repository_mock - .expect_fetch_identity::>() + .expect_fetch_identity() .returning(move |_, _| Ok(None)); state_repository_mock .expect_fetch_documents::() @@ -368,18 +371,18 @@ mod test { document_transition, sml_store, data_contract, - top_level_identity, + top_level_identifier, + identity, .. } = setup_test(); let mut state_repository_mock = MockStateRepositoryLike::new(); - let identity_to_return = top_level_identity.as_bytes().to_vec(); state_repository_mock .expect_fetch_sml_store() .returning(move || Ok(sml_store.clone())); state_repository_mock - .expect_fetch_identity::>() - .returning(move |_, _| Ok(Some(identity_to_return.clone()))); + .expect_fetch_identity() + .returning(move |_, _| Ok(Some(identity.clone()))); state_repository_mock .expect_fetch_documents::() .returning(move |_, _, _, _| Ok(vec![])); @@ -387,7 +390,7 @@ mod test { let execution_context = StateTransitionExecutionContext::default(); let context = DataTriggerExecutionContext { data_contract: &data_contract, - owner_id: &top_level_identity, + owner_id: &top_level_identifier, state_repository: &state_repository_mock, state_transition_execution_context: &execution_context, }; @@ -404,18 +407,18 @@ mod test { document_transition, sml_store, data_contract, - top_level_identity, + top_level_identifier, + identity, .. } = setup_test(); let mut state_repository_mock = MockStateRepositoryLike::new(); - let identity_to_return = top_level_identity.as_bytes().to_vec(); state_repository_mock .expect_fetch_sml_store() .returning(move || Ok(sml_store.clone())); state_repository_mock - .expect_fetch_identity::>() - .returning(move |_, _| Ok(Some(identity_to_return.clone()))); + .expect_fetch_identity() + .returning(move |_, _| Ok(Some(identity.clone()))); let documents_to_return: Vec = (0..16).map(|_| Document::default()).collect(); state_repository_mock .expect_fetch_documents::() @@ -424,7 +427,7 @@ mod test { let execution_context = StateTransitionExecutionContext::default(); let context = DataTriggerExecutionContext { data_contract: &data_contract, - owner_id: &top_level_identity, + owner_id: &top_level_identifier, state_repository: &state_repository_mock, state_transition_execution_context: &execution_context, }; @@ -445,13 +448,13 @@ mod test { let TestData { document_transition, data_contract, - top_level_identity, + top_level_identifier, .. } = setup_test(); let mut state_repository_mock = MockStateRepositoryLike::new(); state_repository_mock - .expect_fetch_identity::>() + .expect_fetch_identity() .returning(move |_, _| Ok(None)); state_repository_mock .expect_fetch_documents::() @@ -462,7 +465,7 @@ mod test { let context = DataTriggerExecutionContext { data_contract: &data_contract, - owner_id: &top_level_identity, + owner_id: &top_level_identifier, state_repository: &state_repository_mock, state_transition_execution_context: &execution_context, }; diff --git a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/apply_identity_topup_transition.rs b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/apply_identity_topup_transition.rs index ebb108199ab..b1526ad7248 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/apply_identity_topup_transition.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_topup_transition/apply_identity_topup_transition.rs @@ -89,7 +89,6 @@ mod test { asset_lock_proof::AssetLockTransactionOutputFetcher, identity_topup_transition::IdentityTopUpTransition, }, - prelude::Identity, state_repository::MockStateRepositoryLike, state_transition::StateTransitionLike, tests::fixtures::identity_topup_transition_fixture_json, @@ -106,7 +105,7 @@ mod test { let state_repository_for_fetcher = MockStateRepositoryLike::new(); state_repository_for_apply - .expect_fetch_identity::() + .expect_fetch_identity() .return_once(|_, _| Ok(None)); state_repository_for_apply .expect_update_identity() diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs index fe4f0e41c24..b21714ef049 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_identity_signature.rs @@ -329,7 +329,7 @@ mod test { state_transition.owner_id = owner_id.clone(); state_repository_mock - .expect_fetch_identity::() + .expect_fetch_identity() .returning(move |_, _| Ok(None)); let result = validate_state_transition_identity_signature( diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_key_signature.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_key_signature.rs index 79ecc8b82df..49471cc7ffc 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_key_signature.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_key_signature.rs @@ -145,7 +145,6 @@ mod test { }, KeyType, }, - prelude::Identity, state_repository::MockStateRepositoryLike, state_transition::{StateTransition, StateTransitionConvert, StateTransitionLike}, tests::{ @@ -301,7 +300,7 @@ mod test { .into(); state_repository - .expect_fetch_identity::() + .expect_fetch_identity() .return_once(|_, _| Ok(None)); let result = validate_state_transition_key_signature( diff --git a/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/apply_identity_credit_withdrawal_transition_factory_spec.rs b/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/apply_identity_credit_withdrawal_transition_factory_spec.rs index 49e9fbd5395..292e0835ea5 100644 --- a/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/apply_identity_credit_withdrawal_transition_factory_spec.rs +++ b/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/apply_identity_credit_withdrawal_transition_factory_spec.rs @@ -25,7 +25,7 @@ mod apply_identity_credit_withdrawal_transition_factory { .returning(|_, _| anyhow::Ok(())); state_repository - .expect_fetch_identity::() + .expect_fetch_identity() .times(1) .withf(|id, _| *id == Identifier::default()) .returning(|_, _| { diff --git a/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_state_spec.rs b/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_state_spec.rs index 9bfdff46f49..43457371d21 100644 --- a/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_state_spec.rs +++ b/packages/rs-dpp/src/tests/identity/state_transition/identity_credit_withdrawal_transition/validation/state/validate_identity_credit_withdrawal_state_spec.rs @@ -43,7 +43,7 @@ mod validate_identity_credit_withdrawal_transition_state_factory { let mut state_repository = MockStateRepositoryLike::default(); state_repository - .expect_fetch_identity::() + .expect_fetch_identity() .times(1) .withf(|id, _| *id == Identifier::default()) .returning(|_, _| anyhow::Ok(None)); @@ -67,7 +67,7 @@ mod validate_identity_credit_withdrawal_transition_state_factory { let mut state_repository = MockStateRepositoryLike::default(); state_repository - .expect_fetch_identity::() + .expect_fetch_identity() .times(1) .withf(|id, _| *id == Identifier::default()) .returning(|_, _| { @@ -97,7 +97,7 @@ mod validate_identity_credit_withdrawal_transition_state_factory { let mut state_repository = MockStateRepositoryLike::default(); state_repository - .expect_fetch_identity::() + .expect_fetch_identity() .times(1) .withf(|id, _| *id == Identifier::default()) .returning(|_, _| Err(Error::msg("Some error"))); @@ -119,7 +119,7 @@ mod validate_identity_credit_withdrawal_transition_state_factory { let mut state_repository = MockStateRepositoryLike::default(); state_repository - .expect_fetch_identity::() + .expect_fetch_identity() .times(1) .withf(|id, _| *id == Identifier::default()) .returning(|_, _| { diff --git a/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/apply_identity_udpate_transition_spec.rs b/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/apply_identity_udpate_transition_spec.rs index fd39d5ea825..49f359cc89d 100644 --- a/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/apply_identity_udpate_transition_spec.rs +++ b/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/apply_identity_udpate_transition_spec.rs @@ -3,7 +3,6 @@ use crate::{ apply_identity_update_transition::apply_identity_update_transition, identity_update_transition::IdentityUpdateTransition, }, - prelude::Identity, state_repository::MockStateRepositoryLike, state_transition::StateTransitionLike, tests::fixtures::{get_identity_update_transition_fixture, identity_fixture}, @@ -66,7 +65,7 @@ async fn should_use_max_identity_on_dry_run() { let mut state_repository_mock = MockStateRepositoryLike::new(); state_repository_mock - .expect_fetch_identity::() + .expect_fetch_identity() .returning(|_, _| Ok(None)); state_repository_mock .expect_store_identity_public_key_hashes() diff --git a/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_basic_spec.rs b/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_basic_spec.rs index 43ad97fb8cd..d6f171951ba 100644 --- a/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_basic_spec.rs +++ b/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_basic_spec.rs @@ -116,7 +116,6 @@ fn property_should_be_present(property: &str) { let TestData { protocol_version_validator, validate_public_keys_mock, - public_keys_signatures_validator, mut raw_state_transition, .. } = setup_test(); diff --git a/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_state_spec.rs b/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_state_spec.rs index a07ed282af1..f3a3d23dace 100644 --- a/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_state_spec.rs +++ b/packages/rs-dpp/src/tests/identity/state_transition/identity_update_transition/validate_identity_update_transition_state_spec.rs @@ -397,7 +397,7 @@ async fn should_return_valid_result_on_dry_run() { let mut state_repository_mock = MockStateRepositoryLike::new(); state_repository_mock - .expect_fetch_identity::() + .expect_fetch_identity() .return_once(|_, _| Ok(None)); let validator = IdentityUpdateTransitionStateValidator::new( From bff8d4b85074379574d9bd9dfb9fe00d28617b17 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Mon, 26 Dec 2022 18:27:25 +0400 Subject: [PATCH 30/66] test(rs-dpp): finish test for validateIdentityCreateTransitionStateFactory.spec.js --- .../js-dpp/lib/test/expect/expectError.js | 10 ++- .../identity_create_transition.rs | 1 + .../identity_create_transition/to_object.rs | 45 ++++++++++++ .../identity_create_transition/validation.rs | 13 ++-- ...entityCreateTransitionStateFactory.spec.js | 73 ++++++++++++------- 5 files changed, 107 insertions(+), 35 deletions(-) create mode 100644 packages/wasm-dpp/src/identity/state_transition/identity_create_transition/to_object.rs diff --git a/packages/js-dpp/lib/test/expect/expectError.js b/packages/js-dpp/lib/test/expect/expectError.js index b8ad446b1d5..9212202438d 100644 --- a/packages/js-dpp/lib/test/expect/expectError.js +++ b/packages/js-dpp/lib/test/expect/expectError.js @@ -9,9 +9,15 @@ const expectError = { * @param {ValidationResult} result * @param {AbstractConsensusError} [errorClass] * @param {number} [count] + * @param [validationErrorClass] */ - expectValidationError(result, errorClass = AbstractConsensusError, count = 1) { - expect(result).to.be.an.instanceOf(ValidationResult); + expectValidationError( + result, + errorClass = AbstractConsensusError, + count = 1, + validationErrorClass = ValidationResult, + ) { + expect(result).to.be.an.instanceOf(validationErrorClass); expect(result.getErrors()).to.have.lengthOf(count); result.getErrors().forEach((error) => expect(error).to.be.an.instanceOf(errorClass)); diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index 04566be9472..e724c6cd1d8 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -32,6 +32,7 @@ use dpp::{ }; #[wasm_bindgen(js_name=IdentityCreateTransition)] +#[derive(Clone)] pub struct IdentityCreateTransitionWasm(IdentityCreateTransition); #[derive(Deserialize, Serialize)] diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/to_object.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/to_object.rs new file mode 100644 index 00000000000..dbecc03f90b --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/to_object.rs @@ -0,0 +1,45 @@ +use dpp::identity::state_transition::asset_lock_proof::AssetLockProof; +use dpp::{ + identifier::Identifier, + identity::{ + state_transition::identity_create_transition::IdentityCreateTransition, IdentityPublicKey, + }, + state_transition::StateTransitionLike, +}; +use serde::Deserialize; +use std::default::Default; + +#[derive(Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct ToObjectOptions { + pub skip_signature: Option, +} + +#[derive(Default)] +pub struct ToObject { + pub transition_type: u8, + pub protocol_version: u32, + pub identity_id: Identifier, + pub asset_lock_proof: AssetLockProof, + pub public_keys: Vec, + pub signature: Option>, +} + +pub fn to_object_struct( + transition: &IdentityCreateTransition, + options: ToObjectOptions, +) -> ToObject { + let mut to_object = ToObject::default(); + to_object.transition_type = transition.get_type() as u8; + to_object.protocol_version = transition.get_protocol_version(); + + if !options.skip_signature.unwrap_or(false) { + to_object.signature = Some(transition.get_signature().to_owned()); + } + + to_object.public_keys = transition.get_public_keys().to_owned(); + to_object.asset_lock_proof = transition.get_asset_lock_proof().to_owned(); + to_object.identity_id = transition.get_identity_id().to_owned(); + + to_object +} diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs index 7a941e886fe..44b9032cfd4 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs @@ -11,11 +11,14 @@ use crate::{ #[wasm_bindgen(js_name=validateIdentityCreateTransitionState)] pub async fn validate_identity_create_transition_state_wasm( state_repository: ExternalStateRepositoryLike, - state_transition: IdentityCreateTransitionWasm, + state_transition: &IdentityCreateTransitionWasm, ) -> Result { let wrapped_state_repository = ExternalStateRepositoryLikeWrapper::new(state_repository); - validate_identity_create_transition_state(&wrapped_state_repository, state_transition.into()) - .await - .map(Into::into) - .map_err(|e| from_dpp_err(e.into())) + validate_identity_create_transition_state( + &wrapped_state_repository, + state_transition.to_owned().clone().into(), + ) + .await + .map(Into::into) + .map_err(|e| from_dpp_err(e.into())) } diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js index 557c77b958b..0bac3a533f1 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js @@ -1,25 +1,26 @@ -// const { expectValidationError } = require( -// '@dashevo/dpp/lib/test/expect/expectError', -// ); +const { expectValidationError } = require( + '@dashevo/dpp/lib/test/expect/expectError', +); const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); -// const IdentityAlreadyExistsError = require( -// '@dashevo/dpp/lib/errors/consensus/state/identity/IdentityAlreadyExistsError', -// ); - const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); -// const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); +const protocolVersion = require('@dashevo/dpp/lib/version/protocolVersion'); const { default: loadWasmDpp } = require('../../../../../../../dist'); +const generateRandomIdentifierAsync = require('../../../../../../../lib/test/utils/generateRandomIdentifierAsync'); describe('validateIdentityCreateTransitionStateFactory', () => { let IdentityCreateTransition; let StateTransitionExecutionContext; - // let ValidationResult; + let IdentityAlreadyExistsError; + let Identity; + let ValidationResult; + let validateIdentityCreateTransitionState; let validate; let executionContext; + let rawIdentity; let stateTransition; let stateRepositoryMock; @@ -28,7 +29,9 @@ describe('validateIdentityCreateTransitionStateFactory', () => { ({ IdentityCreateTransition, StateTransitionExecutionContext, - // ValidationResult, + ValidationResult, + IdentityAlreadyExistsError, + Identity, validateIdentityCreateTransitionState, } = await loadWasmDpp()); }); @@ -40,29 +43,43 @@ describe('validateIdentityCreateTransitionStateFactory', () => { executionContext = new StateTransitionExecutionContext(); stateTransition.setExecutionContext(executionContext); - // const privateKey = 'af432c476f65211f45f48f1d42c9c0b497e56696aa1736b40544ef1a496af837'; - // await stateTransition.signByPrivateKey(privateKey, IdentityPublicKey.TYPES.ECDSA_SECP256K1); - stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); - const rawTransaction = '030000000137feb5676d0851337ea3c9a992496aab7a0b3eee60aeeb9774000b7f4bababa5000000006b483045022100d91557de37645c641b948c6cd03b4ae3791a63a650db3e2fee1dcf5185d1b10402200e8bd410bf516ca61715867666d31e44495428ce5c1090bf2294a829ebcfa4ef0121025c3cc7fbfc52f710c941497fd01876c189171ea227458f501afcb38a297d65b4ffffffff021027000000000000166a14152073ca2300a86b510fa2f123d3ea7da3af68dcf77cb0090a0000001976a914152073ca2300a86b510fa2f123d3ea7da3af68dc88ac00000000'; - stateRepositoryMock.fetchTransaction.resolves(rawTransaction); + + rawIdentity = { + protocolVersion: protocolVersion.latestVersion, + id: await generateRandomIdentifierAsync(), + publicKeys: [ + { + id: 0, + type: 0, + data: Buffer.alloc(36).fill('a'), + purpose: 0, + securityLevel: 0, + readOnly: false, + signature: Buffer.alloc(36).fill('a'), + }, + ], + balance: 0, + revision: 0, + }; validate = (st) => validateIdentityCreateTransitionState(stateRepositoryMock, st); }); - // TODO: wait for error types? - it.skip('should return invalid result if identity already exists', async () => { - // stateRepositoryMock.fetchIdentity.resolves({}); - // - // const result = await validateIdentityCreateTransitionState(stateTransition); - // - // expectValidationError(result, IdentityAlreadyExistsError, 1); - // - // const [error] = result.getErrors(); - // - // expect(error.getCode()).to.equal(4011); - // expect(Buffer.isBuffer(error.getIdentityId())).to.be.true(); - // expect(error.getIdentityId()).to.deep.equal(stateTransition.getIdentityId()); + it('should return invalid result if identity already exists', async () => { + const identity = new Identity(rawIdentity); + + stateRepositoryMock.fetchIdentity.returns(identity); + + const result = await validate(stateTransition); + + expectValidationError(result, IdentityAlreadyExistsError, 1, ValidationResult); + + const [error] = result.getErrors(); + + expect(error.getCode()).to.equal(4011); + expect(error.getIdentityId()).to.exist(); + expect(error.getIdentityId()).to.deep.equal(stateTransition.getIdentityId().toBuffer()); }); it('should return valid result if state transition is valid', async () => { From 3c009f2a53c90f8b2d6abfbd50d053640f254a54 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 27 Dec 2022 13:27:53 +0400 Subject: [PATCH 31/66] fix(rs-dpp): signature population for identity_public_key binding --- .../src/identity/identity_public_key/mod.rs | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs index fdde3fd2e52..a7a63b47cd0 100644 --- a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs +++ b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs @@ -108,11 +108,13 @@ impl IdentityPublicKeyWasm { self.0.get_readonly() } + // TODO: fix - make timestamp js_sys::Date #[wasm_bindgen(js_name=setDisabledAt)] pub fn set_disabled_at(&mut self, timestamp: u32) { self.0.set_disabled_at(timestamp as u64); } + // TODO: fix - return js_sys::Date #[wasm_bindgen(js_name=getDisabledAt)] pub fn get_disabled_at(&self) -> Option { self.0.get_disabled_at().map(|timestamp| timestamp as u32) @@ -136,14 +138,13 @@ impl IdentityPublicKeyWasm { } #[wasm_bindgen(js_name=toObject)] - pub fn to_object(&self, some_option: Option) -> Result { + pub fn to_object(&self, skip_signatures: Option) -> Result { let val = self .0 - .to_raw_json_object(some_option.unwrap_or(false)) + .to_raw_json_object(skip_signatures.unwrap_or(false)) .map_err(|e| from_dpp_err(e.into()))?; let data_buffer = Buffer::from_bytes(self.0.get_data()); - let signature_buffer = Buffer::from_bytes(self.0.get_signature()); let json = val.to_string(); let js_object = js_sys::JSON::parse(&json)?; @@ -160,11 +161,16 @@ impl IdentityPublicKeyWasm { &JsValue::from(data_buffer), )?; - js_sys::Reflect::set( - &js_object, - &"signature".to_owned().into(), - &JsValue::from(signature_buffer), - )?; + if skip_signatures.unwrap_or(false) != true { + let signature = self.0.get_signature(); + if signature.len() != 0 { + js_sys::Reflect::set( + &js_object, + &"signature".to_owned().into(), + &JsValue::from(Buffer::from_bytes(signature)), + )?; + } + } Ok(js_object) } From 07270876914bfdeead22f7fad4eb2575521e0629 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 27 Dec 2022 15:56:38 +0400 Subject: [PATCH 32/66] wip(wasm-dpp): generic validation result --- .../chain/chain_asset_lock_proof.rs | 1 + .../asset_lock_proof/chain/mod.rs | 2 + .../asset_lock_proof/chain/validation.rs | 51 +++++++++++++++++++ .../identity_create_transition/validation.rs | 4 +- .../src/validation/validation_result.rs | 34 ++++++++++--- 5 files changed, 83 insertions(+), 9 deletions(-) create mode 100644 packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs index f62ffa7ed61..bb44c708435 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -13,6 +13,7 @@ use dpp::util::string_encoding; use dpp::util::string_encoding::Encoding; #[wasm_bindgen(js_name=ChainAssetLockProof)] +#[derive(Clone)] pub struct ChainAssetLockProofWasm(ChainAssetLockProof); #[derive(Debug, Serialize, Deserialize)] diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs index 6f0470d5794..ac6d7dc626f 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs @@ -1,3 +1,5 @@ pub use chain_asset_lock_proof::*; +pub use validation::*; pub mod chain_asset_lock_proof; +pub mod validation; diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs new file mode 100644 index 00000000000..2a02d829668 --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs @@ -0,0 +1,51 @@ +use dpp::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; +use dpp::identity::state_transition::asset_lock_proof::{ + AssetLockTransactionValidator, ChainAssetLockProofStructureValidator, PublicKeyHash, +}; +use dpp::identity::state_transition::identity_create_transition::validation::state::validate_identity_create_transition_state; +use dpp::state_transition::state_transition_execution_context::StateTransitionExecutionContext; +use dpp::validation::ValidationResult; +use dpp::ProtocolError; +use std::sync::Arc; +use wasm_bindgen::prelude::*; +use web_sys::console::log_1; + +use crate::{ + errors::from_dpp_err, + state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, + validation::ValidationResultWasm, + AssetLockProofWasm, ChainAssetLockProofWasm, IdentityCreateTransitionWasm, + StateTransitionExecutionContextWasm, +}; + +#[wasm_bindgen(js_name=validateChainAssetLockProofStructure)] +pub async fn validate_chain_asset_lock_proof_structure( + state_repository: ExternalStateRepositoryLike, // TODO: test with wrapper? + asset_lock_proof: &ChainAssetLockProofWasm, // TODO: should be AssetLockProofWasm? + execution_context: StateTransitionExecutionContextWasm, +) -> Result { + let state_repository_wrapper = + Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository)); + + let asset_lock_proof: ChainAssetLockProof = asset_lock_proof.to_owned().into(); + let asset_lock_proof_json = + serde_json::to_value(asset_lock_proof.clone()).map_err(|e| from_dpp_err(e.into()))?; + + let tx_validator = Arc::new(AssetLockTransactionValidator::new( + state_repository_wrapper.clone(), + )); + + let validator = + ChainAssetLockProofStructureValidator::new(state_repository_wrapper, tx_validator) + .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; + + let validation_result = validator + .validate(&asset_lock_proof_json, &execution_context.into()) + .await + .map(|value| { + let test: ValidationResultWasm = value.into(); + test + }) + .map_err(|e| from_dpp_err(e.into()))?; + Ok(validation_result.into()) +} diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs index 44b9032cfd4..9fb54ef769f 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs @@ -4,7 +4,7 @@ use wasm_bindgen::prelude::*; use crate::{ errors::from_dpp_err, state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, - validation_result::ValidationResultWasm, + validation::ValidationResultWasm, IdentityCreateTransitionWasm, }; @@ -19,6 +19,6 @@ pub async fn validate_identity_create_transition_state_wasm( state_transition.to_owned().clone().into(), ) .await - .map(Into::into) + .map(Into::::into) .map_err(|e| from_dpp_err(e.into())) } diff --git a/packages/wasm-dpp/src/validation/validation_result.rs b/packages/wasm-dpp/src/validation/validation_result.rs index fa096239420..60d57aef828 100644 --- a/packages/wasm-dpp/src/validation/validation_result.rs +++ b/packages/wasm-dpp/src/validation/validation_result.rs @@ -1,10 +1,36 @@ use crate::errors::consensus_error::from_consensus_error_ref; +use dpp::identity::state_transition::asset_lock_proof::PublicKeyHash; use dpp::validation::ValidationResult; use js_sys::JsString; use wasm_bindgen::prelude::*; +#[wasm_bindgen] +pub struct EmptyValidationData; + +impl From<()> for EmptyValidationData { + fn from(_: ()) -> Self { + EmptyValidationData + } +} + #[wasm_bindgen(js_name=ValidationResult)] -pub struct ValidationResultWasm(ValidationResult<()>); +pub struct ValidationResultWasm(ValidationResult); + +impl From> for ValidationResultWasm +where + T: Into + Clone, + // ValidationResult: From>, +{ + fn from(validation_result: ValidationResult) -> Self { + ValidationResultWasm(validation_result.into()) + } +} + +// impl From> for ValidationResultWasm { +// fn from(validation_result: ValidationResult<()>) { +// // ValidationResultWasm(validation_result) +// } +// } #[wasm_bindgen(js_class=ValidationResult)] impl ValidationResultWasm { @@ -33,9 +59,3 @@ impl ValidationResultWasm { .collect() } } - -impl From> for ValidationResultWasm { - fn from(validation_result: ValidationResult<()>) -> Self { - ValidationResultWasm(validation_result) - } -} From 75441faf5c9df32f07594cf30851989300b9c880 Mon Sep 17 00:00:00 2001 From: Evgeny Fomin Date: Tue, 27 Dec 2022 13:44:31 +0100 Subject: [PATCH 33/66] feat: validation result map fn --- .../src/validation/validation_result.rs | 10 ++++++++ .../validation.rs | 6 ++--- .../data_contract_factory.rs | 7 +++--- .../wasm-dpp/src/identity/identity_facade.rs | 6 ++--- .../asset_lock_proof/chain/validation.rs | 6 +---- .../identity_create_transition/validation.rs | 7 +++--- .../validation/public_keys_validator.rs | 24 ++++++++++++------- .../src/validation/validation_result.rs | 18 +------------- 8 files changed, 39 insertions(+), 45 deletions(-) diff --git a/packages/rs-dpp/src/validation/validation_result.rs b/packages/rs-dpp/src/validation/validation_result.rs index a5b9ab0342e..386518a3312 100644 --- a/packages/rs-dpp/src/validation/validation_result.rs +++ b/packages/rs-dpp/src/validation/validation_result.rs @@ -17,6 +17,16 @@ impl ValidationResult { } } + pub fn map(self, f: F) -> ValidationResult + where + F: FnOnce(TData) -> U, + { + ValidationResult { + errors: self.errors, + data: self.data.map(f), + } + } + pub fn add_error(&mut self, error: T) where T: Into, diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/validation.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/validation.rs index 74c754d1aa5..cafee55de3f 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/validation.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/validation.rs @@ -14,11 +14,11 @@ pub async fn validate_data_contract_create_transition_state( state_transition: DataContractCreateTransitionWasm, ) -> Result { let wrapped_state_repository = ExternalStateRepositoryLikeWrapper::new(state_repository); - dpp_validate_data_contract_create_transition_state( + let validation_result = dpp_validate_data_contract_create_transition_state( &wrapped_state_repository, &state_transition.into(), ) .await - .map(Into::::into) - .map_err(from_dpp_err) + .map_err(from_dpp_err)?; + Ok(validation_result.map(|_| JsValue::undefined()).into()) } diff --git a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs index 00d3ed8ff03..812a87616a7 100644 --- a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs +++ b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs @@ -47,10 +47,9 @@ impl DataContractValidatorWasm { let parameters: DataContractParameters = with_js_error!(serde_wasm_bindgen::from_value(raw_data_contract))?; let json_object = serde_json::to_value(parameters).expect("Implements Serialize"); - self.0 - .validate(&json_object) - .map(Into::into) - .map_err(from_protocol_error) + let validation_result = self.0.validate(&json_object).map_err(from_protocol_error)?; + + Ok(validation_result.map(|_| JsValue::undefined()).into()) } } diff --git a/packages/wasm-dpp/src/identity/identity_facade.rs b/packages/wasm-dpp/src/identity/identity_facade.rs index 63e0c5cc87f..878c2a663a3 100644 --- a/packages/wasm-dpp/src/identity/identity_facade.rs +++ b/packages/wasm-dpp/src/identity/identity_facade.rs @@ -38,10 +38,8 @@ impl IdentityFacadeWasm { let identity_json = serde_wasm_bindgen::from_value(raw_identity_object) .expect("unable to serialize identity"); // TODO: handle the case when - self.0 - .validate(&identity_json) - .map(|res| res.into()) - .map_err(|err| err.into()) + let validation_result = self.0.validate(&identity_json)?; + Ok(validation_result.map(|_| JsValue::undefined()).into()) } } diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs index 2a02d829668..8409f6b8527 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs @@ -42,10 +42,6 @@ pub async fn validate_chain_asset_lock_proof_structure( let validation_result = validator .validate(&asset_lock_proof_json, &execution_context.into()) .await - .map(|value| { - let test: ValidationResultWasm = value.into(); - test - }) .map_err(|e| from_dpp_err(e.into()))?; - Ok(validation_result.into()) + Ok(validation_result.map(|_| JsValue::undefined()).into()) } diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs index 9fb54ef769f..74c945deda8 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs @@ -14,11 +14,12 @@ pub async fn validate_identity_create_transition_state_wasm( state_transition: &IdentityCreateTransitionWasm, ) -> Result { let wrapped_state_repository = ExternalStateRepositoryLikeWrapper::new(state_repository); - validate_identity_create_transition_state( + let validation_result = validate_identity_create_transition_state( &wrapped_state_repository, state_transition.to_owned().clone().into(), ) .await - .map(Into::::into) - .map_err(|e| from_dpp_err(e.into())) + .map_err(|e| from_dpp_err(e.into()))?; + + Ok(validation_result.map(|_| JsValue::undefined()).into()) } diff --git a/packages/wasm-dpp/src/identity/validation/public_keys_validator.rs b/packages/wasm-dpp/src/identity/validation/public_keys_validator.rs index 6f1b63e9c47..5465793825b 100644 --- a/packages/wasm-dpp/src/identity/validation/public_keys_validator.rs +++ b/packages/wasm-dpp/src/identity/validation/public_keys_validator.rs @@ -36,10 +36,12 @@ impl PublicKeysValidatorWasm { ) -> Result { let raw_public_keys = to_vec_of_serde_values(public_keys.iter())?; - self.public_key_validator + let validation_result = self + .public_key_validator .validate_keys(&raw_public_keys) - .map(ValidationResultWasm::from) - .map_err(|e| JsValue::from(e.to_string())) + .map_err(|e| JsValue::from(e.to_string()))?; + + Ok(validation_result.map(|_| JsValue::undefined()).into()) } #[wasm_bindgen(js_name=validatePublicKeyStructure)] @@ -49,10 +51,12 @@ impl PublicKeysValidatorWasm { ) -> Result { let pk_serde_json = public_key.with_serde_to_json_value()?; - self.public_key_validator + let validation_result = self + .public_key_validator .validate_public_key_structure(&pk_serde_json) - .map(ValidationResultWasm::from) - .map_err(|e| JsValue::from(e.to_string())) + .map_err(|e| JsValue::from(e.to_string()))?; + + Ok(validation_result.map(|_| JsValue::undefined()).into()) } #[wasm_bindgen(js_name=validateKeysInStateTransition)] @@ -62,9 +66,11 @@ impl PublicKeysValidatorWasm { ) -> Result { let raw_public_keys = to_vec_of_serde_values(public_keys.iter())?; - self.public_key_in_state_transition_validator + let validation_result = self + .public_key_in_state_transition_validator .validate_keys(&raw_public_keys) - .map(ValidationResultWasm::from) - .map_err(|e| JsValue::from(e.to_string())) + .map_err(|e| JsValue::from(e.to_string()))?; + + Ok(validation_result.map(|_| JsValue::undefined()).into()) } } diff --git a/packages/wasm-dpp/src/validation/validation_result.rs b/packages/wasm-dpp/src/validation/validation_result.rs index 60d57aef828..07e61fa0ae4 100644 --- a/packages/wasm-dpp/src/validation/validation_result.rs +++ b/packages/wasm-dpp/src/validation/validation_result.rs @@ -4,34 +4,18 @@ use dpp::validation::ValidationResult; use js_sys::JsString; use wasm_bindgen::prelude::*; -#[wasm_bindgen] -pub struct EmptyValidationData; - -impl From<()> for EmptyValidationData { - fn from(_: ()) -> Self { - EmptyValidationData - } -} - #[wasm_bindgen(js_name=ValidationResult)] pub struct ValidationResultWasm(ValidationResult); impl From> for ValidationResultWasm where T: Into + Clone, - // ValidationResult: From>, { fn from(validation_result: ValidationResult) -> Self { - ValidationResultWasm(validation_result.into()) + ValidationResultWasm(validation_result.map(Into::into)) } } -// impl From> for ValidationResultWasm { -// fn from(validation_result: ValidationResult<()>) { -// // ValidationResultWasm(validation_result) -// } -// } - #[wasm_bindgen(js_class=ValidationResult)] impl ValidationResultWasm { /// This is just a test method - doesn't need to be in the resulted binding. Please From 729a5cb4d390181c010a6b6ec14e084da42be890 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Wed, 4 Jan 2023 14:49:50 +0400 Subject: [PATCH 34/66] fix(rs-dpp): out point buffer endianness --- .../chain/chain_asset_lock_proof.rs | 9 +++++++ .../instant/instant_asset_lock_proof.rs | 25 +++++++++++-------- .../chain/chain_asset_lock_proof.rs | 16 ++++++++++++ 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs index 4c78df89502..41eeb0d3485 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -1,5 +1,6 @@ use serde::{Deserialize, Serialize}; use serde_big_array::BigArray; +use std::convert::TryInto; use crate::{ errors::NonConsensusError, identifier::Identifier, util::hash::hash, util::vec::vec_to_array, @@ -35,11 +36,19 @@ impl ChainAssetLockProof { self.core_chain_locked_height } + pub fn set_core_chain_locked_height(&mut self, value: u32) { + self.core_chain_locked_height = value; + } + /// Get out_point pub fn out_point(&self) -> &[u8; 36] { &self.out_point } + pub fn set_out_point(&mut self, out_point: [u8; 36]) { + self.out_point = out_point; + } + /// Create identifier pub fn create_identifier(&self) -> Result { let array = vec_to_array(hash(self.out_point).as_ref())?; diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs index 7fc3b182785..0036d681df3 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs @@ -102,7 +102,16 @@ impl InstantAssetLockProof { } pub fn out_point(&self) -> Option<[u8; 36]> { - self.transaction.out_point_buffer(self.output_index()) + let out_point_buffer = self.transaction.out_point_buffer(self.output_index()); + + // Change tx_id endianness to match js-dpp + if let Some(mut out_point_buffer) = out_point_buffer { + let (tx_id, _) = out_point_buffer.split_at_mut(32); + tx_id.reverse(); + Some(out_point_buffer) + } else { + None + } } pub fn output(&self) -> Option<&TxOut> { @@ -110,15 +119,11 @@ impl InstantAssetLockProof { } pub fn create_identifier(&self) -> Result { - let buffer = hash( - self.transaction() - .out_point_buffer(self.output_index()) - .ok_or_else(|| { - NonConsensusError::IdentifierCreateError(String::from( - "No output at a given index", - )) - })?, - ); + let out_point = self.out_point().ok_or_else(|| { + NonConsensusError::IdentifierCreateError(String::from("No output at a given index")) + })?; + + let buffer = hash(out_point); Ok(Identifier::new(vec_to_array(&buffer)?)) } diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs index bb44c708435..a17de9c2843 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -63,11 +63,27 @@ impl ChainAssetLockProofWasm { self.0.core_chain_locked_height() } + #[wasm_bindgen(js_name=setCoreChainLockedHeight)] + pub fn set_core_chain_locked_height(&mut self, value: u32) { + self.0.set_core_chain_locked_height(value); + } + #[wasm_bindgen(js_name=getOutPoint)] pub fn get_out_point(&self) -> Buffer { Buffer::from_bytes(self.0.out_point().as_slice()) } + #[wasm_bindgen(js_name=setOutPoint)] + pub fn set_out_point(&mut self, out_point: Vec) -> Result<(), JsValue> { + let out_point: [u8; 36] = out_point.try_into().map_err(|_| { + RustConversionError::Error(String::from("outPoint must be a 36 byte array")) + .to_js_value() + })?; + self.0.set_out_point(out_point); + + Ok(()) + } + #[wasm_bindgen(js_name=toJSON)] pub fn to_json(&self) -> Result { let js_object = self.to_object()?; From fa7de0d3f69ae6f6fca4dffec190b5e6434bdfe8 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Wed, 4 Jan 2023 16:34:52 +0400 Subject: [PATCH 35/66] feat(wasm-dpp): validateChainAssetLockProofStructureFactory.spec.js --- Cargo.lock | 85 ++++++ .../js-dpp/lib/test/expect/expectError.js | 6 +- ...set_lock_proof_transaction_height_error.rs | 2 +- .../asset_lock_transaction_output_fetcher.rs | 30 ++- .../chain/chain_asset_lock_proof.rs | 1 - ...in_asset_lock_proof_structure_validator.rs | 70 ++--- packages/rs-dpp/src/state_repository.rs | 22 +- packages/wasm-dpp/Cargo.toml | 1 + ...set_lock_proof_transaction_height_error.rs | 6 +- .../chain/chain_asset_lock_proof.rs | 2 + .../asset_lock_proof/chain/validation.rs | 42 ++- packages/wasm-dpp/src/state_repository.rs | 102 ++++++- packages/wasm-dpp/src/state_transition/mod.rs | 12 + .../src/validation/validation_result.rs | 6 +- ...hainAssetLockProofStructureFactory.spec.js | 249 ++++++++---------- .../ChainAssetLockProof.spec.js | 7 +- 16 files changed, 421 insertions(+), 222 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cc50504a537..3123e5856a2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -475,6 +475,7 @@ dependencies = [ "js-sys", "num-integer", "num-traits", + "serde", "time 0.1.45", "wasm-bindgen", "winapi", @@ -798,6 +799,41 @@ dependencies = [ "syn", ] +[[package]] +name = "darling" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0dd3cd20dc6b5a876612a6e5accfe7f3dd883db6d07acfbf14c128f61550dfa" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a784d2ccaf7c98501746bf0be29b2022ba41fd62a2e622af997a03e9f972859f" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7618812407e9402654622dd402b0a89dff9ba93badd6540781526117b92aab7e" +dependencies = [ + "darling_core", + "quote", + "syn", +] + [[package]] name = "dashcore" version = "0.29.1" @@ -1103,6 +1139,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "form_urlencoded" version = "1.1.0" @@ -1410,6 +1452,12 @@ dependencies = [ "cxx-build", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.3.0" @@ -1428,6 +1476,7 @@ checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" dependencies = [ "autocfg", "hashbrown 0.12.3", + "serde", ] [[package]] @@ -2683,6 +2732,34 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_with" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25bf4a5a814902cd1014dbccfa4d4560fb8432c779471e96e035602519f82eef" +dependencies = [ + "base64 0.13.1", + "chrono", + "hex", + "indexmap", + "serde", + "serde_json", + "serde_with_macros", + "time 0.3.17", +] + +[[package]] +name = "serde_with_macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3452b4c0f6c1e357f73fdb87cd1efabaa12acf328c7a528e252893baeb3f4aa" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "sha2" version = "0.9.9" @@ -2789,6 +2866,12 @@ dependencies = [ "visualize", ] +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "strum" version = "0.24.1" @@ -2960,6 +3043,7 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" dependencies = [ + "itoa 1.0.5", "serde", "time-core", "time-macros", @@ -3269,6 +3353,7 @@ dependencies = [ "serde", "serde-wasm-bindgen", "serde_json", + "serde_with", "thiserror", "wasm-bindgen", "wasm-bindgen-futures", diff --git a/packages/js-dpp/lib/test/expect/expectError.js b/packages/js-dpp/lib/test/expect/expectError.js index 9212202438d..9b7ccfd6687 100644 --- a/packages/js-dpp/lib/test/expect/expectError.js +++ b/packages/js-dpp/lib/test/expect/expectError.js @@ -9,15 +9,15 @@ const expectError = { * @param {ValidationResult} result * @param {AbstractConsensusError} [errorClass] * @param {number} [count] - * @param [validationErrorClass] + * @param [validationResultClass] */ expectValidationError( result, errorClass = AbstractConsensusError, count = 1, - validationErrorClass = ValidationResult, + validationResultClass = ValidationResult, ) { - expect(result).to.be.an.instanceOf(validationErrorClass); + expect(result).to.be.an.instanceOf(validationResultClass); expect(result.getErrors()).to.have.lengthOf(count); result.getErrors().forEach((error) => expect(error).to.be.an.instanceOf(errorClass)); diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_transaction_height_error.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_transaction_height_error.rs index c74cc2fce6f..3ee4535e2f6 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_transaction_height_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_transaction_height_error.rs @@ -21,7 +21,7 @@ impl InvalidAssetLockProofTransactionHeightError { self.proof_core_chain_locked_height } - pub fn current_core_chain_locked_height(&self) -> Option { + pub fn transaction_height(&self) -> Option { self.transaction_height } } diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_output_fetcher.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_output_fetcher.rs index 94919c39f50..ea630b059f2 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_output_fetcher.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_output_fetcher.rs @@ -1,3 +1,4 @@ +use std::convert::TryInto; use std::sync::Arc; use dashcore::hashes::hex::ToHex; @@ -50,8 +51,8 @@ pub async fn fetch_asset_lock_transaction_output( let output_index = out_point.vout as usize; let transaction_hash = out_point.txid; - let maybe_raw_transaction = state_repository - .fetch_transaction::>(&transaction_hash.to_hex(), execution_context) + let maybe_transaction_data = state_repository + .fetch_transaction(&transaction_hash.to_hex(), execution_context) .await .map_err(|_| DPPError::InvalidAssetLockTransaction)?; @@ -62,14 +63,25 @@ pub async fn fetch_asset_lock_transaction_output( }); } - if let Some(raw_transaction) = maybe_raw_transaction { - let transaction = Transaction::deserialize(&raw_transaction) + if let Some(transaction_data) = maybe_transaction_data { + let transaction_data = transaction_data + .try_into() .map_err(|_| DPPError::InvalidAssetLockTransaction)?; - transaction - .output - .get(output_index) - .ok_or_else(|| AssetLockOutputNotFoundError::new().into()) - .cloned() + + if let Some(raw_transaction) = transaction_data.data { + let transaction = Transaction::deserialize(&raw_transaction) + .map_err(|_| DPPError::InvalidAssetLockTransaction)?; + + transaction + .output + .get(output_index) + .ok_or_else(|| AssetLockOutputNotFoundError::new().into()) + .cloned() + } else { + Err(DPPError::from(AssetLockTransactionIsNotFoundError::new( + transaction_hash, + ))) + } } else { Err(DPPError::from(AssetLockTransactionIsNotFoundError::new( transaction_hash, diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs index 41eeb0d3485..a2c659af88b 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -1,6 +1,5 @@ use serde::{Deserialize, Serialize}; use serde_big_array::BigArray; -use std::convert::TryInto; use crate::{ errors::NonConsensusError, identifier::Identifier, util::hash::hash, util::vec::vec_to_array, diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs index 2a0b248ad2a..8a02302330e 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs @@ -1,3 +1,4 @@ +use std::convert::TryInto; use std::sync::Arc; use dashcore::consensus::Decodable; @@ -86,14 +87,12 @@ where let proof_core_chain_locked_height = proof.core_chain_locked_height(); - let latest_platform_block_header: PlatformBlockHeader = self + let current_core_chain_locked_height = self .state_repository - .fetch_latest_platform_block_header() + .fetch_latest_platform_core_chain_locked_height() .await - .map_err(|e| NonConsensusError::StateRepositoryFetchError(e.to_string()))?; - - let current_core_chain_locked_height = - latest_platform_block_header.current_core_chain_locked_height; + .map_err(|e| NonConsensusError::StateRepositoryFetchError(e.to_string()))? + .unwrap_or(0); if current_core_chain_locked_height < proof_core_chain_locked_height { result.add_error(InvalidAssetLockProofCoreChainHeightError::new( @@ -112,13 +111,18 @@ where let transaction_hash = out_point.txid; let transaction_hash_string = transaction_hash.to_hex(); - let maybe_transaction_fetch_result: Option = self + let maybe_transaction_fetch_result = self .state_repository .fetch_transaction(&transaction_hash_string, execution_context) .await .map_err(|e| NonConsensusError::StateRepositoryFetchError(e.to_string()))?; return if let Some(transaction_result) = maybe_transaction_fetch_result { + let transaction_result = transaction_result + .try_into() + .map_err(Into::into) + .map_err(|e| NonConsensusError::StateRepositoryFetchError(e.to_string()))?; + if let Some(tx_height) = transaction_result.height { if proof_core_chain_locked_height < tx_height { result.add_error(InvalidAssetLockProofTransactionHeightError::new( @@ -137,34 +141,38 @@ where return Ok(result); } - let validate_asset_lock_transaction_result = self - .asset_lock_transaction_validator - .validate( - &transaction_result.data, - output_index as usize, - execution_context, - ) - .await?; - - let validation_result_data = if validate_asset_lock_transaction_result.is_valid() { - validate_asset_lock_transaction_result - .data() - .expect("This can not happen due to the logic above") - .clone() - } else { - result.merge(validate_asset_lock_transaction_result); - return Ok(result); - }; + if let Some(raw_tx) = transaction_result.data { + let validate_asset_lock_transaction_result = self + .asset_lock_transaction_validator + .validate(&raw_tx, output_index as usize, execution_context) + .await?; + + let validation_result_data = if validate_asset_lock_transaction_result.is_valid() { + validate_asset_lock_transaction_result + .data() + .expect("This can not happen due to the logic above") + .clone() + } else { + result.merge(validate_asset_lock_transaction_result); + return Ok(result); + }; - let public_key_hash = validation_result_data.public_key_hash; + let public_key_hash = validation_result_data.public_key_hash; - result.set_data(public_key_hash); + result.set_data(public_key_hash); - Ok(result) + Ok(result) + } else { + result.add_error(IdentityAssetLockTransactionIsNotFoundError::new( + transaction_hash.as_hash().into_inner(), + )); + + return Ok(result); + } } else { - result.add_error(IdentityAssetLockTransactionIsNotFoundError::new( - transaction_hash.as_hash().into_inner(), - )); + let mut hash = transaction_hash.as_hash().into_inner(); + hash.reverse(); + result.add_error(IdentityAssetLockTransactionIsNotFoundError::new(hash)); Ok(result) }; diff --git a/packages/rs-dpp/src/state_repository.rs b/packages/rs-dpp/src/state_repository.rs index 4011fc7f442..3faca31bed2 100644 --- a/packages/rs-dpp/src/state_repository.rs +++ b/packages/rs-dpp/src/state_repository.rs @@ -18,6 +18,18 @@ impl From for ProtocolError { } } +#[derive(Clone)] +pub struct FetchTransactionResponse { + pub height: Option, + pub data: Option>, +} + +impl FetchTransactionResponse { + pub fn new(data: Option>, height: Option) -> Self { + Self { height, data } + } +} + // Let StateRepositoryLike mock return DataContracts instead of bytes to simplify things a bit. #[cfg_attr(any(test, feature="mocks"), automock(type ConversionError=Infallible; type FetchDataContract=DataContract;))] #[async_trait] @@ -25,6 +37,7 @@ pub trait StateRepositoryLike: Send + Sync { type ConversionError: Into; type FetchDataContract: TryInto; type FetchIdentity: TryInto; + type FetchTransaction: TryInto; /// Fetch the Data Contract by ID /// By default, the method should return data as bytes (`Vec`), but the deserialization to [`DataContract`] should be also possible @@ -78,13 +91,11 @@ pub trait StateRepositoryLike: Send + Sync { /// Fetch the Transaction /// By default, the method should return data as bytes (`Vec`), but the deserialization to [`Transaction`] should be also possible - async fn fetch_transaction( + async fn fetch_transaction( &self, id: &str, execution_context: &StateTransitionExecutionContext, - ) -> AnyResult> - where - T: for<'de> serde::de::Deserialize<'de> + 'static; + ) -> AnyResult>; /// Fetch Identity by ID /// By default, the method should return data as bytes (`Vec`), but the deserialization to [`Identity`] should be also possible @@ -160,6 +171,9 @@ pub trait StateRepositoryLike: Send + Sync { // Get latest (in a queue) withdrawal transaction index async fn fetch_latest_withdrawal_transaction_index(&self) -> AnyResult; + // Get latest (in a queue) withdrawal transaction index + async fn fetch_latest_platform_core_chain_locked_height(&self) -> AnyResult>; + // Enqueue withdrawal transaction async fn enqueue_withdrawal_transaction( &self, diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 8780683152e..15ca96b5c5e 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -22,6 +22,7 @@ console_error_panic_hook = { version="0.1.7"} wasm-bindgen-futures = "0.4.33" async-trait = "0.1.59" anyhow = "1.0.66" +serde_with = "2.1.0" [profile.release] lto = true diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_transaction_height_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_transaction_height_error.rs index 6a8befc8dbb..d2a54f55e26 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_transaction_height_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/invalid_asset_lock_proof_transaction_height_error.rs @@ -22,9 +22,9 @@ impl InvalidAssetLockProofTransactionHeightErrorWasm { self.inner.proof_core_chain_locked_height() } - #[wasm_bindgen(js_name=getCurrentCoreChainLockedHeight)] - pub fn current_core_chain_locked_height(&self) -> Option { - self.inner.current_core_chain_locked_height() + #[wasm_bindgen(js_name=getTransactionHeight)] + pub fn transaction_height(&self) -> Option { + self.inner.transaction_height() } #[wasm_bindgen(js_name=getCode)] diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs index a17de9c2843..1b0e0b4c2d7 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -19,6 +19,8 @@ pub struct ChainAssetLockProofWasm(ChainAssetLockProof); #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] struct ChainAssetLockProofParams { + #[serde(rename = "type")] + lock_type: u8, core_chain_locked_height: u32, out_point: Vec, } diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs index 8409f6b8527..52fcfd754db 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs @@ -1,35 +1,45 @@ -use dpp::identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof; use dpp::identity::state_transition::asset_lock_proof::{ - AssetLockTransactionValidator, ChainAssetLockProofStructureValidator, PublicKeyHash, + AssetLockTransactionValidator, ChainAssetLockProofStructureValidator, }; -use dpp::identity::state_transition::identity_create_transition::validation::state::validate_identity_create_transition_state; use dpp::state_transition::state_transition_execution_context::StateTransitionExecutionContext; -use dpp::validation::ValidationResult; use dpp::ProtocolError; +use serde::{Deserialize, Serialize}; +use serde_with::skip_serializing_none; use std::sync::Arc; use wasm_bindgen::prelude::*; -use web_sys::console::log_1; +use crate::buffer::Buffer; use crate::{ - errors::from_dpp_err, + errors::{from_dpp_err, RustConversionError}, state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, validation::ValidationResultWasm, - AssetLockProofWasm, ChainAssetLockProofWasm, IdentityCreateTransitionWasm, - StateTransitionExecutionContextWasm, + with_js_error, StateTransitionExecutionContextWasm, }; +#[skip_serializing_none] +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +struct RawChainAssetLockProof { + #[serde(rename = "type")] + lock_type: Option, + core_chain_locked_height: Option, + out_point: Option>, +} + #[wasm_bindgen(js_name=validateChainAssetLockProofStructure)] pub async fn validate_chain_asset_lock_proof_structure( state_repository: ExternalStateRepositoryLike, // TODO: test with wrapper? - asset_lock_proof: &ChainAssetLockProofWasm, // TODO: should be AssetLockProofWasm? - execution_context: StateTransitionExecutionContextWasm, + raw_asset_lock_proof: JsValue, + execution_context: &StateTransitionExecutionContextWasm, ) -> Result { let state_repository_wrapper = Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository)); - let asset_lock_proof: ChainAssetLockProof = asset_lock_proof.to_owned().into(); + let parsed_asset_lock_proof: RawChainAssetLockProof = + with_js_error!(serde_wasm_bindgen::from_value(raw_asset_lock_proof))?; + let asset_lock_proof_json = - serde_json::to_value(asset_lock_proof.clone()).map_err(|e| from_dpp_err(e.into()))?; + serde_json::to_value(parsed_asset_lock_proof).map_err(|e| from_dpp_err(e.into()))?; let tx_validator = Arc::new(AssetLockTransactionValidator::new( state_repository_wrapper.clone(), @@ -39,9 +49,13 @@ pub async fn validate_chain_asset_lock_proof_structure( ChainAssetLockProofStructureValidator::new(state_repository_wrapper, tx_validator) .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; + let context: &StateTransitionExecutionContext = execution_context.into(); let validation_result = validator - .validate(&asset_lock_proof_json, &execution_context.into()) + .validate(&asset_lock_proof_json, context) .await .map_err(|e| from_dpp_err(e.into()))?; - Ok(validation_result.map(|_| JsValue::undefined()).into()) + + Ok(validation_result + .map(|item| JsValue::from(Buffer::from_bytes(&item))) + .into()) } diff --git a/packages/wasm-dpp/src/state_repository.rs b/packages/wasm-dpp/src/state_repository.rs index 59d0c2ecd9d..67de2470ced 100644 --- a/packages/wasm-dpp/src/state_repository.rs +++ b/packages/wasm-dpp/src/state_repository.rs @@ -1,8 +1,11 @@ //! Bindings for state repository -like objects coming from JS. +use anyhow::Result; +use serde::{Deserialize, Serialize}; use std::{convert::Infallible, pin::Pin, sync::Mutex}; use async_trait::async_trait; +use dpp::state_repository::FetchTransactionResponse; use dpp::{ dashcore::InstantLock, data_contract::DataContract, @@ -13,11 +16,48 @@ use dpp::{ }; use wasm_bindgen::prelude::*; +use crate::errors::RustConversionError; use crate::{ - identifier::IdentifierWrapper, DataContractWasm, IdentityWasm, + identifier::IdentifierWrapper, with_js_error, DataContractWasm, IdentityWasm, StateTransitionExecutionContextWasm, }; +#[wasm_bindgen(js_name=FetchTransactionResponse)] +#[derive(Clone)] +pub struct FetchTransactionResponseWasm(FetchTransactionResponse); + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +struct FetchTransactionResponseParams { + height: Option, + data: Option>, +} + +impl From for FetchTransactionResponseWasm { + fn from(v: FetchTransactionResponse) -> Self { + FetchTransactionResponseWasm(v) + } +} + +impl From for FetchTransactionResponse { + fn from(v: FetchTransactionResponseWasm) -> Self { + v.0 + } +} + +#[wasm_bindgen(js_class = FetchTransactionResponse)] +impl FetchTransactionResponseWasm { + #[wasm_bindgen(constructor)] + pub fn new(raw_parameters: JsValue) -> Result { + let parameters: FetchTransactionResponseParams = + with_js_error!(serde_wasm_bindgen::from_value(raw_parameters))?; + + let response = FetchTransactionResponse::new(parameters.data, parameters.height); + + Ok(response.into()) + } +} + #[wasm_bindgen] extern "C" { pub type ExternalStateRepositoryLike; @@ -43,6 +83,25 @@ extern "C" { execution_context: StateTransitionExecutionContextWasm, ) -> Option; + #[wasm_bindgen(structural, method, js_name=fetchLatestPlatformCoreChainLockedHeight)] + pub fn fetch_latest_platform_core_chain_locked_height( + this: &ExternalStateRepositoryLike, + ) -> Option; + + #[wasm_bindgen(structural, method, js_name=fetchTransaction)] + pub fn fetch_transaction( + this: &ExternalStateRepositoryLike, + id: &str, + execution_context: StateTransitionExecutionContextWasm, + ) -> Option; + + #[wasm_bindgen(structural, method, js_name=isAssetLockTransactionOutPointAlreadyUsed)] + pub fn is_asset_lock_transaction_out_point_already_used( + this: &ExternalStateRepositoryLike, + out_point_buffer: &[u8], + execution_context: StateTransitionExecutionContextWasm, + ) -> bool; + // TODO add missing declarations } @@ -64,6 +123,7 @@ impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper { type ConversionError = Infallible; type FetchDataContract = DataContractWasm; type FetchIdentity = IdentityWasm; + type FetchTransaction = FetchTransactionResponseWasm; async fn fetch_data_contract( &self, @@ -132,15 +192,17 @@ impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper { todo!() } - async fn fetch_transaction( + async fn fetch_transaction( &self, - _id: &str, - _execution_context: &StateTransitionExecutionContext, - ) -> anyhow::Result> - where - T: for<'de> serde::de::Deserialize<'de> + 'static, - { - todo!() + id: &str, + execution_context: &StateTransitionExecutionContext, + ) -> anyhow::Result> { + Ok(self + .0 + .lock() + .expect("unexpected concurrency issue!") + .fetch_transaction(id, execution_context.into()) + .map(Into::into)) } async fn fetch_identity( @@ -182,6 +244,15 @@ impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper { todo!() } + async fn fetch_latest_platform_core_chain_locked_height(&self) -> anyhow::Result> { + Ok(self + .0 + .lock() + .expect("unexpected concurrency issue!") + .fetch_latest_platform_core_chain_locked_height() + .map(Into::into)) + } + async fn verify_instant_lock( &self, _instant_lock: &InstantLock, @@ -192,10 +263,17 @@ impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper { async fn is_asset_lock_transaction_out_point_already_used( &self, - _out_point_buffer: &[u8], - _execution_context: &StateTransitionExecutionContext, + out_point_buffer: &[u8], + execution_context: &StateTransitionExecutionContext, ) -> anyhow::Result { - todo!() + Ok(self + .0 + .lock() + .expect("unexpected concurrency issue!") + .is_asset_lock_transaction_out_point_already_used( + out_point_buffer, + execution_context.clone().into(), + )) } async fn mark_asset_lock_transaction_out_point_as_used( diff --git a/packages/wasm-dpp/src/state_transition/mod.rs b/packages/wasm-dpp/src/state_transition/mod.rs index ff568cfa760..9abe0ceeb88 100644 --- a/packages/wasm-dpp/src/state_transition/mod.rs +++ b/packages/wasm-dpp/src/state_transition/mod.rs @@ -22,6 +22,18 @@ impl<'a> From<&'a StateTransitionExecutionContextWasm> for StateTransitionExecut } } +impl<'a> From<&'a StateTransitionExecutionContextWasm> for &'a StateTransitionExecutionContext { + fn from(wa: &'a StateTransitionExecutionContextWasm) -> Self { + &wa.0 + } +} + +impl<'a> From<&'a StateTransitionExecutionContext> for StateTransitionExecutionContextWasm { + fn from(rs: &'a StateTransitionExecutionContext) -> Self { + Self(rs.clone()) + } +} + #[wasm_bindgen(js_class=StateTransitionExecutionContext)] impl StateTransitionExecutionContextWasm { #[wasm_bindgen(constructor)] diff --git a/packages/wasm-dpp/src/validation/validation_result.rs b/packages/wasm-dpp/src/validation/validation_result.rs index 07e61fa0ae4..47d8c412fed 100644 --- a/packages/wasm-dpp/src/validation/validation_result.rs +++ b/packages/wasm-dpp/src/validation/validation_result.rs @@ -1,5 +1,4 @@ use crate::errors::consensus_error::from_consensus_error_ref; -use dpp::identity::state_transition::asset_lock_proof::PublicKeyHash; use dpp::validation::ValidationResult; use js_sys::JsString; use wasm_bindgen::prelude::*; @@ -42,4 +41,9 @@ impl ValidationResultWasm { .map(from_consensus_error_ref) .collect() } + + #[wasm_bindgen(js_name=getData)] + pub fn get_data(&self) -> JsValue { + self.0.data().unwrap_or(&JsValue::undefined()).to_owned() + } } diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js index 61429b09702..ac938f20bad 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js @@ -1,74 +1,75 @@ -const { getRE2Class } = require('@dashevo/wasm-re2'); - -const createAjv = require('@dashevo/dpp/lib/ajv/createAjv'); +const { Transaction, Script, PrivateKey } = require('@dashevo/dashcore-lib'); const getChainAssetLockFixture = require('@dashevo/dpp/lib/test/fixtures/getChainAssetLockProofFixture'); -const JsonSchemaValidator = require('@dashevo/dpp/lib/validation/JsonSchemaValidator'); const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); -const { expectValidationError, expectJsonSchemaError } = require( +const { expectValidationError } = require( '@dashevo/dpp/lib/test/expect/expectError', ); -const validateChainAssetLockProofStructureFactory = require('@dashevo/dpp/lib/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory'); -const ValidationResult = require('@dashevo/dpp/lib/validation/ValidationResult'); -const IdentityAssetLockTransactionIsNotFoundError = require('@dashevo/dpp/lib/errors/consensus/basic/identity/IdentityAssetLockTransactionIsNotFoundError'); -const InvalidAssetLockProofCoreChainHeightError = require('@dashevo/dpp/lib/errors/consensus/basic/identity/InvalidAssetLockProofCoreChainHeightError'); -const InvalidAssetLockProofTransactionHeightError = require('@dashevo/dpp/lib/errors/consensus/basic/identity/InvalidAssetLockProofTransactionHeightError'); -const SomeConsensusError = require('@dashevo/dpp/lib/test/mocks/SomeConsensusError'); -const StateTransitionExecutionContext = require('@dashevo/dpp/lib/stateTransition/StateTransitionExecutionContext'); +const { expect } = require('chai'); + +const { default: loadWasmDpp } = require('../../../../../../dist'); describe('validateChainAssetLockProofStructureFactory', () => { let rawProof; let stateRepositoryMock; - let validateChainAssetLockProofStructure; - let jsonSchemaValidator; - let validateAssetLockTransactionMock; - let validateAssetLockTransactionResult; let publicKeyHash; let rawTransaction; let transactionHash; let executionContext; + let StateTransitionExecutionContext; + let FetchTransactionResponse; + let ValidationResult; + let JsonSchemaError; + let InvalidAssetLockProofCoreChainHeightError; + let IdentityAssetLockTransactionIsNotFoundError; + let InvalidIdentityAssetLockTransactionOutputError; + let InvalidAssetLockProofTransactionHeightError; + let validateChainAssetLockProofStructure; + + before(async () => { + ({ + StateTransitionExecutionContext, + FetchTransactionResponse, + ValidationResult, + JsonSchemaError, + InvalidAssetLockProofCoreChainHeightError, + IdentityAssetLockTransactionIsNotFoundError, + InvalidIdentityAssetLockTransactionOutputError, + InvalidAssetLockProofTransactionHeightError, + validateChainAssetLockProofStructure, + } = await loadWasmDpp()); + }); + beforeEach(async function beforeEach() { rawTransaction = '030000000137feb5676d0851337ea3c9a992496aab7a0b3eee60aeeb9774000b7f4bababa5000000006b483045022100d91557de37645c641b948c6cd03b4ae3791a63a650db3e2fee1dcf5185d1b10402200e8bd410bf516ca61715867666d31e44495428ce5c1090bf2294a829ebcfa4ef0121025c3cc7fbfc52f710c941497fd01876c189171ea227458f501afcb38a297d65b4ffffffff021027000000000000166a14152073ca2300a86b510fa2f123d3ea7da3af68dcf77cb0090a0000001976a914152073ca2300a86b510fa2f123d3ea7da3af68dc88ac00000000'; transactionHash = '6e200d059fb567ba19e92f5c2dcd3dde522fd4e0a50af223752db16158dabb1d'; - const assetLock = getChainAssetLockFixture(); - - rawProof = assetLock.toObject(); - - const RE2 = await getRE2Class(); - const ajv = createAjv(RE2); + rawProof = getChainAssetLockFixture().toObject(); - jsonSchemaValidator = new JsonSchemaValidator(ajv); + // Change endianness of raw txId bytes in outPoint to match expectation of dashcore-rust + const txId = rawProof.outPoint.slice(0, 32); + const outputIndex = rawProof.outPoint.slice(32); + txId.reverse(); + rawProof.outPoint = Buffer.concat([txId, outputIndex]); stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); - stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight.resolves(42); + stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight.returns(42); - stateRepositoryMock.fetchTransaction.resolves({ + // TODO: rework to return object? + const response = new FetchTransactionResponse({ data: Buffer.from(rawTransaction, 'hex'), height: 42, }); + stateRepositoryMock.fetchTransaction.returns(response); + executionContext = new StateTransitionExecutionContext(); publicKeyHash = Buffer.from('152073ca2300a86b510fa2f123d3ea7da3af68dc', 'hex'); - - validateAssetLockTransactionResult = new ValidationResult(); - validateAssetLockTransactionResult.setData({ - publicKeyHash, - }); - validateAssetLockTransactionMock = this.sinonSandbox.stub().resolves( - validateAssetLockTransactionResult, - ); - - validateChainAssetLockProofStructure = validateChainAssetLockProofStructureFactory( - jsonSchemaValidator, - stateRepositoryMock, - validateAssetLockTransactionMock, - ); }); describe('type', () => { @@ -76,11 +77,12 @@ describe('validateChainAssetLockProofStructureFactory', () => { delete rawProof.type; const result = await validateChainAssetLockProofStructure( + stateRepositoryMock, rawProof, executionContext, ); - expectJsonSchemaError(result); + expectValidationError(result, JsonSchemaError, 1, ValidationResult); const [error] = result.getErrors(); @@ -89,24 +91,17 @@ describe('validateChainAssetLockProofStructureFactory', () => { expect(error.getParams().missingProperty).to.equal('type'); expect(stateRepositoryMock.fetchTransaction).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.not.be.called(); }); it('should be equal to 1', async () => { rawProof.type = -1; - const result = await validateChainAssetLockProofStructure( + await expect(validateChainAssetLockProofStructure( + stateRepositoryMock, rawProof, executionContext, - ); - - expectJsonSchemaError(result); - - const [error] = result.getErrors(); - - expect(error.getInstancePath()).to.equal('/type'); - expect(error.getKeyword()).to.equal('const'); + )).to.be.rejectedWith('Conversion Error: Error: invalid type: floating point `-1`, expected u8'); expect(stateRepositoryMock.fetchTransaction).to.not.be.called(); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.not.be.called(); @@ -118,11 +113,12 @@ describe('validateChainAssetLockProofStructureFactory', () => { delete rawProof.coreChainLockedHeight; const result = await validateChainAssetLockProofStructure( + stateRepositoryMock, rawProof, executionContext, ); - expectJsonSchemaError(result); + expectValidationError(result, JsonSchemaError, 1, ValidationResult); const [error] = result.getErrors(); @@ -131,47 +127,32 @@ describe('validateChainAssetLockProofStructureFactory', () => { expect(error.getParams().missingProperty).to.equal('coreChainLockedHeight'); expect(stateRepositoryMock.fetchTransaction).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.not.be.called(); }); it('should be an integer', async () => { rawProof.coreChainLockedHeight = 1.5; - const result = await validateChainAssetLockProofStructure( + await expect(validateChainAssetLockProofStructure( + stateRepositoryMock, rawProof, executionContext, - ); - - expectJsonSchemaError(result); - - const [error] = result.getErrors(); - - expect(error.getInstancePath()).to.equal('/coreChainLockedHeight'); - expect(error.getKeyword()).to.equal('type'); + )).to.be.rejectedWith('Conversion Error: Error: invalid type: floating point `1.5`, expected u32'); expect(stateRepositoryMock.fetchTransaction).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.not.be.called(); }); it('should be a number', async () => { rawProof.coreChainLockedHeight = '42'; - const result = await validateChainAssetLockProofStructure( + await expect(validateChainAssetLockProofStructure( + stateRepositoryMock, rawProof, executionContext, - ); - - expectJsonSchemaError(result); - - const [error] = result.getErrors(); - - expect(error.getInstancePath()).to.equal('/coreChainLockedHeight'); - expect(error.getKeyword()).to.equal('type'); + )).to.be.rejectedWith('Conversion Error: Error: invalid type: string "42", expected u32'); expect(stateRepositoryMock.fetchTransaction).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.not.be.called(); }); @@ -179,11 +160,12 @@ describe('validateChainAssetLockProofStructureFactory', () => { rawProof.coreChainLockedHeight = 0; const result = await validateChainAssetLockProofStructure( + stateRepositoryMock, rawProof, executionContext, ); - expectJsonSchemaError(result); + expectValidationError(result, JsonSchemaError, 1, ValidationResult); const [error] = result.getErrors(); @@ -191,39 +173,32 @@ describe('validateChainAssetLockProofStructureFactory', () => { expect(error.getKeyword()).to.equal('minimum'); expect(stateRepositoryMock.fetchTransaction).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.not.be.called(); }); it('should be less than 4294967296', async () => { rawProof.coreChainLockedHeight = 4294967296; - const result = await validateChainAssetLockProofStructure( + await expect(validateChainAssetLockProofStructure( + stateRepositoryMock, rawProof, executionContext, - ); - - expectJsonSchemaError(result); - - const [error] = result.getErrors(); - - expect(error.instancePath).to.equal('/coreChainLockedHeight'); - expect(error.getKeyword()).to.equal('maximum'); + )).to.be.rejectedWith('Conversion Error: Error: invalid value: integer `4294967296`, expected u32'); expect(stateRepositoryMock.fetchTransaction).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.not.be.called(); }); it('should be less or equal to consensus core height', async () => { - stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight.resolves(41); + stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight.returns(41); const result = await validateChainAssetLockProofStructure( + stateRepositoryMock, rawProof, executionContext, ); - expectValidationError(result, InvalidAssetLockProofCoreChainHeightError); + expectValidationError(result, InvalidAssetLockProofCoreChainHeightError, 1, ValidationResult); const [error] = result.getErrors(); @@ -238,42 +213,33 @@ describe('validateChainAssetLockProofStructureFactory', () => { delete rawProof.outPoint; const result = await validateChainAssetLockProofStructure( + stateRepositoryMock, rawProof, executionContext, ); - expectJsonSchemaError(result); + expectValidationError(result, JsonSchemaError, 1, ValidationResult); const [error] = result.getErrors(); - expect(error.instancePath).to.equal(''); + expect(error.getInstancePath()).to.equal(''); expect(error.getKeyword()).to.equal('required'); expect(error.getParams().missingProperty).to.equal('outPoint'); expect(stateRepositoryMock.fetchTransaction).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.not.be.called(); }); it('should be a byte array', async () => { rawProof.outPoint = new Array(36).fill('string'); - const result = await validateChainAssetLockProofStructure( + await expect(validateChainAssetLockProofStructure( + stateRepositoryMock, rawProof, executionContext, - ); - - expectJsonSchemaError(result, 2); - - const [error, byteArrayError] = result.getErrors(); - - expect(error.instancePath).to.equal('/outPoint/0'); - expect(error.getKeyword()).to.equal('type'); - - expect(byteArrayError.getKeyword()).to.equal('byteArray'); + )).to.be.rejectedWith('Conversion Error: Error: invalid type: string "string", expected u8'); expect(stateRepositoryMock.fetchTransaction).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.not.be.called(); }); @@ -281,19 +247,19 @@ describe('validateChainAssetLockProofStructureFactory', () => { rawProof.outPoint = Buffer.alloc(35); const result = await validateChainAssetLockProofStructure( + stateRepositoryMock, rawProof, executionContext, ); - expectJsonSchemaError(result); + expectValidationError(result, JsonSchemaError, 1, ValidationResult); const [error] = result.getErrors(); - expect(error.instancePath).to.equal('/outPoint'); + expect(error.getInstancePath()).to.equal('/outPoint'); expect(error.getKeyword()).to.equal('minItems'); expect(stateRepositoryMock.fetchTransaction).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.not.be.called(); }); @@ -301,31 +267,33 @@ describe('validateChainAssetLockProofStructureFactory', () => { rawProof.outPoint = Buffer.alloc(37); const result = await validateChainAssetLockProofStructure( + stateRepositoryMock, rawProof, executionContext, ); - expectJsonSchemaError(result); + expectValidationError(result, JsonSchemaError, 1, ValidationResult); const [error] = result.getErrors(); - expect(error.instancePath).to.equal('/outPoint'); + expect(error.getInstancePath()).to.equal('/outPoint'); expect(error.getKeyword()).to.equal('maxItems'); expect(stateRepositoryMock.fetchTransaction).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.not.be.called(); }); it('should point to existing transaction', async () => { - stateRepositoryMock.fetchTransaction.resolves(null); + stateRepositoryMock.fetchTransaction.returns(null); const result = await validateChainAssetLockProofStructure( + stateRepositoryMock, rawProof, executionContext, ); - expectValidationError(result, IdentityAssetLockTransactionIsNotFoundError); + expectValidationError(result, + IdentityAssetLockTransactionIsNotFoundError, 1, ValidationResult); const [error] = result.getErrors(); @@ -334,41 +302,52 @@ describe('validateChainAssetLockProofStructureFactory', () => { Buffer.from(transactionHash, 'hex'), ); - expect(stateRepositoryMock.fetchTransaction).to.be.calledOnceWithExactly( - transactionHash, - executionContext, - ); - expect(validateAssetLockTransactionMock).to.not.be.called(); + const { args } = stateRepositoryMock.fetchTransaction.firstCall; + expect(args[0]).to.equal(transactionHash); + expect(args[1]).to.be.instanceOf(StateTransitionExecutionContext); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.be.calledOnce(); }); it('should point to valid transaction', async () => { - const consensusError = new SomeConsensusError('test'); - - validateAssetLockTransactionResult.addError(consensusError); + const parsedTx = new Transaction(Buffer.from(rawTransaction, 'hex')); + const fromAddress = new PrivateKey().toAddress().toString(); + // TX for this asset lock proof has to have OP_RETURN in it's first output, + // break it + parsedTx.outputs[0].setScript(Script.buildPublicKeyHashOut(fromAddress).toString()); + + // TODO: rework with plain object? + stateRepositoryMock.fetchTransaction.returns(new FetchTransactionResponse({ + data: parsedTx.toBuffer(), + height: 42, + })); const result = await validateChainAssetLockProofStructure( + stateRepositoryMock, rawProof, executionContext, ); - expectValidationError(result, SomeConsensusError); - - const [error] = result.getErrors(); - - expect(error).to.deep.equal(consensusError); + expectValidationError( + result, + InvalidIdentityAssetLockTransactionOutputError, + 1, + ValidationResult, + ); }); it('should point to transaction from block lower than core chain locked height', async () => { rawProof.coreChainLockedHeight = 41; - stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight.resolves(41); + stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight.returns(41); const result = await validateChainAssetLockProofStructure( + stateRepositoryMock, rawProof, executionContext, ); - expectValidationError(result, InvalidAssetLockProofTransactionHeightError); + expectValidationError( + result, InvalidAssetLockProofTransactionHeightError, 1, ValidationResult, + ); const [error] = result.getErrors(); @@ -376,17 +355,16 @@ describe('validateChainAssetLockProofStructureFactory', () => { expect(error.getProofCoreChainLockedHeight()).to.equal(41); expect(error.getTransactionHeight()).to.equal(42); - expect(stateRepositoryMock.fetchTransaction).to.be.calledOnceWithExactly( - transactionHash, - executionContext, - ); - expect(validateAssetLockTransactionMock).to.not.be.called(); + const { args } = stateRepositoryMock.fetchTransaction.firstCall; + expect(args[0]).to.equal(transactionHash); + expect(args[1]).to.be.instanceOf(StateTransitionExecutionContext); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.be.calledOnce(); }); }); it('should return valid result', async () => { const result = await validateChainAssetLockProofStructure( + stateRepositoryMock, rawProof, executionContext, ); @@ -395,15 +373,10 @@ describe('validateChainAssetLockProofStructureFactory', () => { expect(result.isValid()).to.be.true(); expect(result.getData()).to.deep.equal(publicKeyHash); - expect(stateRepositoryMock.fetchTransaction).to.be.calledOnceWithExactly( - transactionHash, - executionContext, - ); - expect(validateAssetLockTransactionMock).to.be.calledOnceWithExactly( - Buffer.from(rawTransaction, 'hex'), - 0, - executionContext, - ); + const { args } = stateRepositoryMock.fetchTransaction.firstCall; + expect(args[0]).to.equal(transactionHash); + expect(args[1]).to.be.instanceOf(StateTransitionExecutionContext); + expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.be.calledOnce(); }); }); diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js index db8e24add2a..bfb80521f65 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js @@ -14,12 +14,9 @@ describe('ChainAssetLockProof', () => { }); beforeEach(() => { - const { coreChainLockedHeight, outPoint } = chainAssetLockProofJS; + const rawObject = chainAssetLockProofJS.toObject(); - chainAssetLockProof = new ChainAssetLockProof({ - coreChainLockedHeight, - outPoint, - }); + chainAssetLockProof = new ChainAssetLockProof(rawObject); }); describe('#getType', () => { From f883a883a616dfb905aa46e71b76b9ed945f5e05 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Wed, 4 Jan 2023 23:59:53 +0400 Subject: [PATCH 36/66] refactor(wasm-dpp): support arbitrary JS object in fetch_transaction --- .../asset_lock_transaction_output_fetcher.rs | 30 +++---- ...in_asset_lock_proof_structure_validator.rs | 78 ++++++++--------- packages/rs-dpp/src/state_repository.rs | 12 +-- packages/wasm-dpp/src/state_repository.rs | 86 +++++++++---------- ...hainAssetLockProofStructureFactory.spec.js | 15 ++-- 5 files changed, 94 insertions(+), 127 deletions(-) diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_output_fetcher.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_output_fetcher.rs index ea630b059f2..601e66bb5ee 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_output_fetcher.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_output_fetcher.rs @@ -51,7 +51,7 @@ pub async fn fetch_asset_lock_transaction_output( let output_index = out_point.vout as usize; let transaction_hash = out_point.txid; - let maybe_transaction_data = state_repository + let transaction_data = state_repository .fetch_transaction(&transaction_hash.to_hex(), execution_context) .await .map_err(|_| DPPError::InvalidAssetLockTransaction)?; @@ -63,25 +63,19 @@ pub async fn fetch_asset_lock_transaction_output( }); } - if let Some(transaction_data) = maybe_transaction_data { - let transaction_data = transaction_data - .try_into() + let transaction_data = transaction_data + .try_into() + .map_err(|_| DPPError::InvalidAssetLockTransaction)?; + + if let Some(raw_transaction) = transaction_data.data { + let transaction = Transaction::deserialize(&raw_transaction) .map_err(|_| DPPError::InvalidAssetLockTransaction)?; - if let Some(raw_transaction) = transaction_data.data { - let transaction = Transaction::deserialize(&raw_transaction) - .map_err(|_| DPPError::InvalidAssetLockTransaction)?; - - transaction - .output - .get(output_index) - .ok_or_else(|| AssetLockOutputNotFoundError::new().into()) - .cloned() - } else { - Err(DPPError::from(AssetLockTransactionIsNotFoundError::new( - transaction_hash, - ))) - } + transaction + .output + .get(output_index) + .ok_or_else(|| AssetLockOutputNotFoundError::new().into()) + .cloned() } else { Err(DPPError::from(AssetLockTransactionIsNotFoundError::new( transaction_hash, diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs index 8a02302330e..9f816d1006a 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs @@ -111,70 +111,62 @@ where let transaction_hash = out_point.txid; let transaction_hash_string = transaction_hash.to_hex(); - let maybe_transaction_fetch_result = self + let transaction_fetch_result = self .state_repository .fetch_transaction(&transaction_hash_string, execution_context) .await .map_err(|e| NonConsensusError::StateRepositoryFetchError(e.to_string()))?; - return if let Some(transaction_result) = maybe_transaction_fetch_result { - let transaction_result = transaction_result - .try_into() - .map_err(Into::into) - .map_err(|e| NonConsensusError::StateRepositoryFetchError(e.to_string()))?; - - if let Some(tx_height) = transaction_result.height { - if proof_core_chain_locked_height < tx_height { - result.add_error(InvalidAssetLockProofTransactionHeightError::new( - proof_core_chain_locked_height, - Some(tx_height), - )); - - return Ok(result); - } - } else { + let transaction_result = transaction_fetch_result + .try_into() + .map_err(Into::into) + .map_err(|e| NonConsensusError::StateRepositoryFetchError(e.to_string()))?; + + if let Some(tx_height) = transaction_result.height { + if proof_core_chain_locked_height < tx_height { result.add_error(InvalidAssetLockProofTransactionHeightError::new( proof_core_chain_locked_height, - None, + Some(tx_height), )); return Ok(result); } + } else { + result.add_error(InvalidAssetLockProofTransactionHeightError::new( + proof_core_chain_locked_height, + None, + )); - if let Some(raw_tx) = transaction_result.data { - let validate_asset_lock_transaction_result = self - .asset_lock_transaction_validator - .validate(&raw_tx, output_index as usize, execution_context) - .await?; - - let validation_result_data = if validate_asset_lock_transaction_result.is_valid() { - validate_asset_lock_transaction_result - .data() - .expect("This can not happen due to the logic above") - .clone() - } else { - result.merge(validate_asset_lock_transaction_result); - return Ok(result); - }; + return Ok(result); + } - let public_key_hash = validation_result_data.public_key_hash; + if let Some(raw_tx) = transaction_result.data { + let validate_asset_lock_transaction_result = self + .asset_lock_transaction_validator + .validate(&raw_tx, output_index as usize, execution_context) + .await?; + + let validation_result_data = if validate_asset_lock_transaction_result.is_valid() { + validate_asset_lock_transaction_result + .data() + .expect("This can not happen due to the logic above") + .clone() + } else { + result.merge(validate_asset_lock_transaction_result); + return Ok(result); + }; - result.set_data(public_key_hash); + let public_key_hash = validation_result_data.public_key_hash; - Ok(result) - } else { - result.add_error(IdentityAssetLockTransactionIsNotFoundError::new( - transaction_hash.as_hash().into_inner(), - )); + result.set_data(public_key_hash); - return Ok(result); - } + Ok(result) } else { let mut hash = transaction_hash.as_hash().into_inner(); hash.reverse(); result.add_error(IdentityAssetLockTransactionIsNotFoundError::new(hash)); Ok(result) - }; + } } } diff --git a/packages/rs-dpp/src/state_repository.rs b/packages/rs-dpp/src/state_repository.rs index 3faca31bed2..2b1954a0e5b 100644 --- a/packages/rs-dpp/src/state_repository.rs +++ b/packages/rs-dpp/src/state_repository.rs @@ -1,11 +1,11 @@ -use std::convert::{Infallible, TryInto}; - use anyhow::Result as AnyResult; use async_trait::async_trait; use dashcore::InstantLock; #[cfg(any(test, feature = "mocks"))] use mockall::{automock, predicate::*}; +use serde::{Deserialize, Serialize}; use serde_json::Value as JsonValue; +use std::convert::{Infallible, TryInto}; use crate::{ prelude::*, @@ -24,12 +24,6 @@ pub struct FetchTransactionResponse { pub data: Option>, } -impl FetchTransactionResponse { - pub fn new(data: Option>, height: Option) -> Self { - Self { height, data } - } -} - // Let StateRepositoryLike mock return DataContracts instead of bytes to simplify things a bit. #[cfg_attr(any(test, feature="mocks"), automock(type ConversionError=Infallible; type FetchDataContract=DataContract;))] #[async_trait] @@ -95,7 +89,7 @@ pub trait StateRepositoryLike: Send + Sync { &self, id: &str, execution_context: &StateTransitionExecutionContext, - ) -> AnyResult>; + ) -> AnyResult; /// Fetch Identity by ID /// By default, the method should return data as bytes (`Vec`), but the deserialization to [`Identity`] should be also possible diff --git a/packages/wasm-dpp/src/state_repository.rs b/packages/wasm-dpp/src/state_repository.rs index 67de2470ced..f0d45eb67b4 100644 --- a/packages/wasm-dpp/src/state_repository.rs +++ b/packages/wasm-dpp/src/state_repository.rs @@ -1,63 +1,26 @@ //! Bindings for state repository -like objects coming from JS. -use anyhow::Result; use serde::{Deserialize, Serialize}; use std::{convert::Infallible, pin::Pin, sync::Mutex}; use async_trait::async_trait; -use dpp::state_repository::FetchTransactionResponse; use dpp::{ dashcore::InstantLock, data_contract::DataContract, document::Document, prelude::{Identifier, Identity}, - state_repository::StateRepositoryLike, + state_repository::{ + FetchTransactionResponse as FetchTransactionResponseDPP, StateRepositoryLike, + }, state_transition::state_transition_execution_context::StateTransitionExecutionContext, }; use wasm_bindgen::prelude::*; -use crate::errors::RustConversionError; use crate::{ - identifier::IdentifierWrapper, with_js_error, DataContractWasm, IdentityWasm, + identifier::IdentifierWrapper, DataContractWasm, IdentityWasm, StateTransitionExecutionContextWasm, }; -#[wasm_bindgen(js_name=FetchTransactionResponse)] -#[derive(Clone)] -pub struct FetchTransactionResponseWasm(FetchTransactionResponse); - -#[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -struct FetchTransactionResponseParams { - height: Option, - data: Option>, -} - -impl From for FetchTransactionResponseWasm { - fn from(v: FetchTransactionResponse) -> Self { - FetchTransactionResponseWasm(v) - } -} - -impl From for FetchTransactionResponse { - fn from(v: FetchTransactionResponseWasm) -> Self { - v.0 - } -} - -#[wasm_bindgen(js_class = FetchTransactionResponse)] -impl FetchTransactionResponseWasm { - #[wasm_bindgen(constructor)] - pub fn new(raw_parameters: JsValue) -> Result { - let parameters: FetchTransactionResponseParams = - with_js_error!(serde_wasm_bindgen::from_value(raw_parameters))?; - - let response = FetchTransactionResponse::new(parameters.data, parameters.height); - - Ok(response.into()) - } -} - #[wasm_bindgen] extern "C" { pub type ExternalStateRepositoryLike; @@ -93,7 +56,7 @@ extern "C" { this: &ExternalStateRepositoryLike, id: &str, execution_context: StateTransitionExecutionContextWasm, - ) -> Option; + ) -> JsValue; #[wasm_bindgen(structural, method, js_name=isAssetLockTransactionOutPointAlreadyUsed)] pub fn is_asset_lock_transaction_out_point_already_used( @@ -118,12 +81,41 @@ impl ExternalStateRepositoryLikeWrapper { } } +// TODO: move to a dedicated module together with all From traits? +#[derive(Clone, Serialize, Deserialize)] +pub struct FetchTransactionResponse { + pub height: Option, + pub data: Option>, +} + +impl From for FetchTransactionResponse { + fn from(v: JsValue) -> Self { + if v.is_falsy() { + FetchTransactionResponse { + height: Some(0), + data: None, + } + } else { + serde_wasm_bindgen::from_value(v).unwrap() + } + } +} + +impl From for FetchTransactionResponseDPP { + fn from(v: FetchTransactionResponse) -> Self { + FetchTransactionResponseDPP { + data: v.data, + height: v.height, + } + } +} + #[async_trait] impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper { type ConversionError = Infallible; type FetchDataContract = DataContractWasm; type FetchIdentity = IdentityWasm; - type FetchTransaction = FetchTransactionResponseWasm; + type FetchTransaction = FetchTransactionResponse; async fn fetch_data_contract( &self, @@ -196,13 +188,13 @@ impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper { &self, id: &str, execution_context: &StateTransitionExecutionContext, - ) -> anyhow::Result> { - Ok(self + ) -> anyhow::Result { + let response = self .0 .lock() .expect("unexpected concurrency issue!") - .fetch_transaction(id, execution_context.into()) - .map(Into::into)) + .fetch_transaction(id, execution_context.into()); + Ok(FetchTransactionResponse::from(response)) } async fn fetch_identity( diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js index ac938f20bad..35a55fa5893 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js @@ -59,14 +59,11 @@ describe('validateChainAssetLockProofStructureFactory', () => { stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight.returns(42); - // TODO: rework to return object? - const response = new FetchTransactionResponse({ + stateRepositoryMock.fetchTransaction.returns({ data: Buffer.from(rawTransaction, 'hex'), height: 42, }); - stateRepositoryMock.fetchTransaction.returns(response); - executionContext = new StateTransitionExecutionContext(); publicKeyHash = Buffer.from('152073ca2300a86b510fa2f123d3ea7da3af68dc', 'hex'); @@ -309,17 +306,15 @@ describe('validateChainAssetLockProofStructureFactory', () => { }); it('should point to valid transaction', async () => { + // Validator expects asset lock proof TX to have OP_RETURN in it's first output, break it const parsedTx = new Transaction(Buffer.from(rawTransaction, 'hex')); - const fromAddress = new PrivateKey().toAddress().toString(); - // TX for this asset lock proof has to have OP_RETURN in it's first output, - // break it + const fromAddress = new PrivateKey().toAddress(); parsedTx.outputs[0].setScript(Script.buildPublicKeyHashOut(fromAddress).toString()); - // TODO: rework with plain object? - stateRepositoryMock.fetchTransaction.returns(new FetchTransactionResponse({ + stateRepositoryMock.fetchTransaction.returns({ data: parsedTx.toBuffer(), height: 42, - })); + }); const result = await validateChainAssetLockProofStructure( stateRepositoryMock, From 50b5efd9311b0c0c1e9dfdb18acaea362198bf82 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Thu, 5 Jan 2023 13:00:47 +0400 Subject: [PATCH 37/66] feat(wasm-dpp): validateInstantAssetLockProofStructureFactory.spec.js --- ...proof_locked_transaction_mismatch_error.rs | 6 +- .../asset_lock_proof/instant/mod.rs | 2 + .../asset_lock_proof/instant/validation.rs | 62 +++++ packages/wasm-dpp/src/state_repository.rs | 25 +- ...hainAssetLockProofStructureFactory.spec.js | 3 +- ...tantAssetLockProofStructureFactory.spec.js | 241 ++++++------------ 6 files changed, 174 insertions(+), 165 deletions(-) create mode 100644 packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs index 2769b8809de..10f1c100d49 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs @@ -1,5 +1,6 @@ use dpp::consensus::basic::identity::IdentityAssetLockProofLockedTransactionMismatchError; use dpp::consensus::ConsensusError; +use dpp::dashcore::hashes::Hash; use wasm_bindgen::prelude::*; use crate::buffer::Buffer; @@ -28,7 +29,10 @@ impl IdentityAssetLockProofLockedTransactionMismatchErrorWasm { #[wasm_bindgen(js_name=getAssetLockTransactionId)] pub fn asset_lock_transaction_id(&self) -> Buffer { let tx_id = self.inner.asset_lock_transaction_id(); - Buffer::from_bytes(tx_id.to_vec().as_ref()) + let mut hash_bytes = tx_id.as_hash().into_inner(); + hash_bytes.reverse(); + + Buffer::from_bytes(hash_bytes.as_slice()) } #[wasm_bindgen(js_name=getCode)] diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/mod.rs index 420bf71d3e7..920a86120b0 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/mod.rs @@ -1,3 +1,5 @@ pub use instant_asset_lock_proof::*; +pub use validation::*; pub mod instant_asset_lock_proof; +pub mod validation; diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs new file mode 100644 index 00000000000..6ce997f207b --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs @@ -0,0 +1,62 @@ +use dpp::identity::state_transition::asset_lock_proof::{ + AssetLockTransactionValidator, InstantAssetLockProofStructureValidator, +}; +use dpp::state_transition::state_transition_execution_context::StateTransitionExecutionContext; +use dpp::ProtocolError; +use serde::{Deserialize, Serialize}; +use serde_with::skip_serializing_none; +use std::sync::Arc; +use wasm_bindgen::prelude::*; + +use crate::buffer::Buffer; +use crate::{ + errors::{from_dpp_err, RustConversionError}, + state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, + validation::ValidationResultWasm, + with_js_error, StateTransitionExecutionContextWasm, +}; + +#[skip_serializing_none] +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +struct RawInstantAssetLockProof { + #[serde(rename = "type")] + lock_type: Option, + instant_lock: Option>, + transaction: Option>, + output_index: Option, +} + +#[wasm_bindgen(js_name=validateInstantAssetLockProofStructure)] +pub async fn validate_instant_asset_lock_proof_structure( + state_repository: ExternalStateRepositoryLike, // TODO: test with wrapper? + raw_asset_lock_proof: JsValue, + execution_context: &StateTransitionExecutionContextWasm, +) -> Result { + let state_repository_wrapper = + Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository)); + + let parsed_asset_lock_proof: RawInstantAssetLockProof = + with_js_error!(serde_wasm_bindgen::from_value(raw_asset_lock_proof))?; + + let asset_lock_proof_json = + serde_json::to_value(parsed_asset_lock_proof).map_err(|e| from_dpp_err(e.into()))?; + + let tx_validator = Arc::new(AssetLockTransactionValidator::new( + state_repository_wrapper.clone(), + )); + + let validator = + InstantAssetLockProofStructureValidator::new(state_repository_wrapper, tx_validator) + .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; + + let context: &StateTransitionExecutionContext = execution_context.into(); + let validation_result = validator + .validate(&asset_lock_proof_json, context) + .await + .map_err(|e| from_dpp_err(e.into()))?; + + Ok(validation_result + .map(|item| JsValue::from(Buffer::from_bytes(&item))) + .into()) +} diff --git a/packages/wasm-dpp/src/state_repository.rs b/packages/wasm-dpp/src/state_repository.rs index f0d45eb67b4..142281e0cdd 100644 --- a/packages/wasm-dpp/src/state_repository.rs +++ b/packages/wasm-dpp/src/state_repository.rs @@ -4,6 +4,7 @@ use serde::{Deserialize, Serialize}; use std::{convert::Infallible, pin::Pin, sync::Mutex}; use async_trait::async_trait; +use dpp::dashcore::consensus; use dpp::{ dashcore::InstantLock, data_contract::DataContract, @@ -65,6 +66,13 @@ extern "C" { execution_context: StateTransitionExecutionContextWasm, ) -> bool; + #[wasm_bindgen(structural, method, js_name=verifyInstantLock)] + pub fn verify_instant_lock( + this: &ExternalStateRepositoryLike, + instant_lock: &[u8], + execution_context: StateTransitionExecutionContextWasm, + ) -> bool; + // TODO add missing declarations } @@ -247,10 +255,21 @@ impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper { async fn verify_instant_lock( &self, - _instant_lock: &InstantLock, - _execution_context: &StateTransitionExecutionContext, + instant_lock: &InstantLock, + execution_context: &StateTransitionExecutionContext, ) -> anyhow::Result { - todo!() + let raw_instant_lock = consensus::serialize(instant_lock); + + let verified = self + .0 + .lock() + .expect("unexpected concurrency issue!") + .verify_instant_lock( + raw_instant_lock.as_slice(), + execution_context.clone().into(), + ); + + Ok(verified) } async fn is_asset_lock_transaction_out_point_already_used( diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js index 35a55fa5893..d52cf95043f 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js @@ -20,19 +20,18 @@ describe('validateChainAssetLockProofStructureFactory', () => { let executionContext; let StateTransitionExecutionContext; - let FetchTransactionResponse; let ValidationResult; let JsonSchemaError; let InvalidAssetLockProofCoreChainHeightError; let IdentityAssetLockTransactionIsNotFoundError; let InvalidIdentityAssetLockTransactionOutputError; let InvalidAssetLockProofTransactionHeightError; + let validateChainAssetLockProofStructure; before(async () => { ({ StateTransitionExecutionContext, - FetchTransactionResponse, ValidationResult, JsonSchemaError, InvalidAssetLockProofCoreChainHeightError, diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js index 6cc4aae5ccd..9ac4eb173de 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js @@ -1,35 +1,45 @@ -const { getRE2Class } = require('@dashevo/wasm-re2'); - const DashCoreLib = require('@dashevo/dashcore-lib'); -const createAjv = require('@dashevo/dpp/lib/ajv/createAjv'); - const getInstantAssetLockFixture = require('@dashevo/dpp/lib/test/fixtures/getInstantAssetLockProofFixture'); -const JsonSchemaValidator = require('@dashevo/dpp/lib/validation/JsonSchemaValidator'); const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); -const InvalidIdentityAssetLockProofError = require('@dashevo/dpp/lib/errors/consensus/basic/identity/InvalidInstantAssetLockProofError'); -const IdentityAssetLockProofLockedTransactionMismatchError = require('@dashevo/dpp/lib/errors/consensus/basic/identity/IdentityAssetLockProofLockedTransactionMismatchError'); -const InvalidIdentityAssetLockProofSignatureError = require('@dashevo/dpp/lib/errors/consensus/basic/identity/InvalidInstantAssetLockProofSignatureError'); -const { expectValidationError, expectJsonSchemaError } = require( +const { expectValidationError } = require( '@dashevo/dpp/lib/test/expect/expectError', ); -const ValidationResult = require('@dashevo/dpp/lib/validation/ValidationResult'); -const InvalidIdentityAssetLockTransactionError = require('@dashevo/dpp/lib/errors/consensus/basic/identity/InvalidIdentityAssetLockTransactionError'); -const validateInstantAssetLockProofStructureFactory = require('@dashevo/dpp/lib/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory'); +const { expect } = require('chai'); + +const { default: loadWasmDpp } = require('../../../../../../dist'); describe('validateInstantAssetLockProofStructureFactory', () => { let rawProof; let transaction; let stateRepositoryMock; - let instantLockFromBufferMock; - let instantLockMock; + let executionContext; + + let StateTransitionExecutionContext; + let ValidationResult; + let InvalidInstantAssetLockProofError; + let IdentityAssetLockProofLockedTransactionMismatchError; + let InvalidInstantAssetLockProofSignatureError; + let InvalidIdentityAssetLockTransactionError; + let JsonSchemaError; + let validateInstantAssetLockProofStructure; - let jsonSchemaValidator; - let validateAssetLockTransactionResult; - let publicKeyHash; - let validateAssetLockTransactionMock; + let validateInstantAssetLockProofStructureDPP; + + before(async () => { + ({ + StateTransitionExecutionContext, + ValidationResult, + JsonSchemaError, + InvalidInstantAssetLockProofError, + IdentityAssetLockProofLockedTransactionMismatchError, + InvalidInstantAssetLockProofSignatureError, + InvalidIdentityAssetLockTransactionError, + validateInstantAssetLockProofStructure: validateInstantAssetLockProofStructureDPP, + } = await loadWasmDpp()); + }); beforeEach(async function beforeEach() { const assetLock = getInstantAssetLockFixture(); @@ -37,50 +47,25 @@ describe('validateInstantAssetLockProofStructureFactory', () => { rawProof = assetLock.toObject(); - const RE2 = await getRE2Class(); - const ajv = createAjv(RE2); - - jsonSchemaValidator = new JsonSchemaValidator(ajv); - stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); - stateRepositoryMock.verifyInstantLock.resolves(true); - - instantLockMock = { - txid: transaction.id, - verify: this.sinonSandbox.stub().resolves(true), - }; + stateRepositoryMock.verifyInstantLock.returns(true); - instantLockFromBufferMock = this.sinonSandbox.stub(DashCoreLib.InstantLock, 'fromBuffer').returns(instantLockMock); + executionContext = new StateTransitionExecutionContext(); - publicKeyHash = Buffer.from('152073ca2300a86b510fa2f123d3ea7da3af68dc', 'hex'); - - validateAssetLockTransactionResult = new ValidationResult(); - validateAssetLockTransactionResult.setData({ - publicKeyHash, - transaction, - }); - validateAssetLockTransactionMock = this.sinonSandbox.stub().resolves( - validateAssetLockTransactionResult, - ); - - validateInstantAssetLockProofStructure = validateInstantAssetLockProofStructureFactory( - jsonSchemaValidator, + validateInstantAssetLockProofStructure = (proof) => validateInstantAssetLockProofStructureDPP( stateRepositoryMock, - validateAssetLockTransactionMock, + proof, + executionContext, ); }); - afterEach(() => { - instantLockFromBufferMock.restore(); - }); - describe('type', () => { it('should be present', async () => { delete rawProof.type; const result = await validateInstantAssetLockProofStructure(rawProof); - expectJsonSchemaError(result); + expectValidationError(result, JsonSchemaError, 1, ValidationResult); const [error] = result.getErrors(); @@ -89,25 +74,15 @@ describe('validateInstantAssetLockProofStructureFactory', () => { expect(error.getParams().missingProperty).to.equal('type'); expect(stateRepositoryMock.verifyInstantLock).to.not.be.called(); - expect(instantLockMock.verify).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); }); it('should be equal to 0', async () => { rawProof.type = -1; - const result = await validateInstantAssetLockProofStructure(rawProof); - - expectJsonSchemaError(result); - - const [error] = result.getErrors(); - - expect(error.getInstancePath()).to.equal('/type'); - expect(error.getKeyword()).to.equal('const'); + await expect(validateInstantAssetLockProofStructure(rawProof)) + .to.be.rejectedWith('Conversion Error: Error: invalid type: floating point `-1`, expected u8'); expect(stateRepositoryMock.verifyInstantLock).to.not.be.called(); - expect(instantLockMock.verify).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); }); }); @@ -117,7 +92,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { const result = await validateInstantAssetLockProofStructure(rawProof); - expectJsonSchemaError(result); + expectValidationError(result, JsonSchemaError, 1, ValidationResult); const [error] = result.getErrors(); @@ -126,27 +101,15 @@ describe('validateInstantAssetLockProofStructureFactory', () => { expect(error.getParams().missingProperty).to.equal('instantLock'); expect(stateRepositoryMock.verifyInstantLock).to.not.be.called(); - expect(instantLockMock.verify).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); }); it('should be a byte array', async () => { rawProof.instantLock = new Array(165).fill('string'); - const result = await validateInstantAssetLockProofStructure(rawProof); - - expectJsonSchemaError(result, 2); - - const [error, byteArrayError] = result.getErrors(); - - expect(error.getInstancePath()).to.equal('/instantLock/0'); - expect(error.getKeyword()).to.equal('type'); - - expect(byteArrayError.getKeyword()).to.equal('byteArray'); + await expect(validateInstantAssetLockProofStructure(rawProof)) + .to.be.rejectedWith('Conversion Error: Error: invalid type: string "string", expected u8'); expect(stateRepositoryMock.verifyInstantLock).to.not.be.called(); - expect(instantLockMock.verify).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); }); it('should not be shorter than 160 bytes', async () => { @@ -154,7 +117,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { const result = await validateInstantAssetLockProofStructure(rawProof); - expectJsonSchemaError(result); + expectValidationError(result, JsonSchemaError, 1, ValidationResult); const [error] = result.getErrors(); @@ -162,8 +125,6 @@ describe('validateInstantAssetLockProofStructureFactory', () => { expect(error.getKeyword()).to.equal('minItems'); expect(stateRepositoryMock.verifyInstantLock).to.not.be.called(); - expect(instantLockMock.verify).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); }); it('should not be longer than 100 Kb', async () => { @@ -171,7 +132,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { const result = await validateInstantAssetLockProofStructure(rawProof); - expectJsonSchemaError(result); + expectValidationError(result, JsonSchemaError, 1, ValidationResult); const [error] = result.getErrors(); @@ -179,37 +140,36 @@ describe('validateInstantAssetLockProofStructureFactory', () => { expect(error.getKeyword()).to.equal('maxItems'); expect(stateRepositoryMock.verifyInstantLock).to.not.be.called(); - expect(instantLockMock.verify).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); }); it('should be valid', async () => { - const instantLockError = new Error('something is wrong'); - - instantLockFromBufferMock.throws(instantLockError); - rawProof.instantLock = Buffer.alloc(200); const result = await validateInstantAssetLockProofStructure(rawProof); - expectValidationError(result, InvalidIdentityAssetLockProofError); + expectValidationError(result, InvalidInstantAssetLockProofError, 1, ValidationResult); const [error] = result.getErrors(); expect(error.getCode()).to.equal(1041); - expect(error.getValidationError()).to.equal(instantLockError); expect(stateRepositoryMock.verifyInstantLock).to.not.be.called(); - expect(instantLockMock.verify).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); }); it('should lock the same transaction', async () => { const txId = Buffer.alloc(32); - instantLockMock.txid = txId.toString('hex'); + + const instantLockParsed = new DashCoreLib.InstantLock(rawProof.instantLock); + instantLockParsed.txid = txId.toString('hex'); + rawProof.instantLock = instantLockParsed.toBuffer(); const result = await validateInstantAssetLockProofStructure(rawProof); - expectValidationError(result, IdentityAssetLockProofLockedTransactionMismatchError); + expectValidationError( + result, + IdentityAssetLockProofLockedTransactionMismatchError, + 1, + ValidationResult, + ); const [error] = result.getErrors(); @@ -217,9 +177,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { expect(error.getInstantLockTransactionId()).to.deep.equal(txId); expect(error.getAssetLockTransactionId()).to.deep.equal(Buffer.from(transaction.id, 'hex')); - // expect(stateRepositoryMock.verifyInstantLock).to.be.calledOnce(); - expect(instantLockMock.verify).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.be.calledOnce(); + expect(stateRepositoryMock.verifyInstantLock).to.be.calledOnce(); }); it('should have valid signature', async () => { @@ -227,14 +185,18 @@ describe('validateInstantAssetLockProofStructureFactory', () => { const result = await validateInstantAssetLockProofStructure(rawProof); - expectValidationError(result, InvalidIdentityAssetLockProofSignatureError); + expectValidationError( + result, + InvalidInstantAssetLockProofSignatureError, + 1, + ValidationResult, + ); const [error] = result.getErrors(); expect(error.getCode()).to.equal(1042); expect(stateRepositoryMock.verifyInstantLock).to.be.calledOnce(); - expect(validateAssetLockTransactionMock).to.not.be.called(); }); }); @@ -244,7 +206,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { const result = await validateInstantAssetLockProofStructure(rawProof); - expectJsonSchemaError(result); + expectValidationError(result, JsonSchemaError, 1, ValidationResult); const [error] = result.getErrors(); @@ -253,27 +215,15 @@ describe('validateInstantAssetLockProofStructureFactory', () => { expect(error.getParams().missingProperty).to.equal('transaction'); expect(stateRepositoryMock.verifyInstantLock).to.not.be.called(); - expect(instantLockMock.verify).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); }); it('should be a byte array', async () => { rawProof.transaction = new Array(65).fill('string'); - const result = await validateInstantAssetLockProofStructure(rawProof); - - expectJsonSchemaError(result, 2); - - const [error, byteArrayError] = result.getErrors(); - - expect(error.getInstancePath()).to.equal('/transaction/0'); - expect(error.getKeyword()).to.equal('type'); - - expect(byteArrayError.getKeyword()).to.equal('byteArray'); + await expect(validateInstantAssetLockProofStructure(rawProof)) + .to.be.rejectedWith('Conversion Error: Error: invalid type: string "string", expected u8'); expect(stateRepositoryMock.verifyInstantLock).to.not.be.called(); - expect(instantLockMock.verify).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); }); it('should not be shorter than 1 byte', async () => { @@ -281,16 +231,14 @@ describe('validateInstantAssetLockProofStructureFactory', () => { const result = await validateInstantAssetLockProofStructure(rawProof); - expectJsonSchemaError(result); + expectValidationError(result, JsonSchemaError, 1, ValidationResult); const [error] = result.getErrors(); - expect(error.instancePath).to.equal('/transaction'); + expect(error.getInstancePath()).to.equal('/transaction'); expect(error.getKeyword()).to.equal('minItems'); expect(stateRepositoryMock.verifyInstantLock).to.not.be.called(); - expect(instantLockMock.verify).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); }); it('should not be longer than 100 Kb', async () => { @@ -298,43 +246,29 @@ describe('validateInstantAssetLockProofStructureFactory', () => { const result = await validateInstantAssetLockProofStructure(rawProof); - expectJsonSchemaError(result); + expectValidationError(result, JsonSchemaError, 1, ValidationResult); const [error] = result.getErrors(); - expect(error.instancePath).to.equal('/transaction'); + expect(error.getInstancePath()).to.equal('/transaction'); expect(error.getKeyword()).to.equal('maxItems'); expect(stateRepositoryMock.verifyInstantLock).to.not.be.called(); - expect(instantLockMock.verify).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.not.be.called(); }); it('should should be valid', async () => { - const validationError = new Error('parsing failed'); - - const consensusError = new InvalidIdentityAssetLockTransactionError(validationError.message); - - consensusError.setValidationError(validationError); - - validateAssetLockTransactionResult.addError(consensusError); - validateAssetLockTransactionMock.resolves(validateAssetLockTransactionResult); + rawProof.transaction = Buffer.alloc(1000); const result = await validateInstantAssetLockProofStructure(rawProof); - expectValidationError(result, InvalidIdentityAssetLockTransactionError); + expectValidationError(result, InvalidIdentityAssetLockTransactionError, 1, ValidationResult); const [error] = result.getErrors(); expect(error.getCode()).to.equal(1038); + expect(error.getValidationError()).to.exist(); - expect(error).to.equal(consensusError); - - expect(error.getValidationError()).to.equal(validationError); - - // expect(stateRepositoryMock.verifyInstantLock).to.be.calledOnce(); - expect(instantLockMock.verify).to.not.be.called(); - expect(validateAssetLockTransactionMock).to.be.calledOnce(); + expect(stateRepositoryMock.verifyInstantLock).to.be.calledOnce(); }); }); @@ -344,58 +278,47 @@ describe('validateInstantAssetLockProofStructureFactory', () => { const result = await validateInstantAssetLockProofStructure(rawProof); - expectJsonSchemaError(result); + expectValidationError(result, JsonSchemaError, 1, ValidationResult); const [error] = result.getErrors(); - expect(error.instancePath).to.equal(''); + expect(error.getInstancePath()).to.equal(''); expect(error.getKeyword()).to.equal('required'); expect(error.getParams().missingProperty).to.equal('outputIndex'); expect(stateRepositoryMock.verifyInstantLock).to.not.be.called(); - expect(instantLockMock.verify).to.not.be.called(); }); it('should be an integer', async () => { rawProof.outputIndex = 1.1; - const result = await validateInstantAssetLockProofStructure(rawProof); - - expectJsonSchemaError(result, 1); - - const [error] = result.getErrors(); - - expect(error.instancePath).to.equal('/outputIndex'); - expect(error.getKeyword()).to.equal('type'); + await expect(validateInstantAssetLockProofStructure(rawProof)) + .to.be.rejectedWith('Conversion Error: Error: invalid type: floating point `1.1`, expected u32'); expect(stateRepositoryMock.verifyInstantLock).to.not.be.called(); - expect(instantLockMock.verify).to.not.be.called(); }); it('should not be less than 0', async () => { rawProof.outputIndex = -1; - const result = await validateInstantAssetLockProofStructure(rawProof); - - expectJsonSchemaError(result); - - const [error] = result.getErrors(); - - expect(error.instancePath).to.equal('/outputIndex'); - expect(error.getKeyword()).to.equal('minimum'); + await expect(validateInstantAssetLockProofStructure(rawProof)) + .to.be.rejectedWith('Conversion Error: Error: invalid type: floating point `-1`, expected u32'); expect(stateRepositoryMock.verifyInstantLock).to.not.be.called(); - expect(instantLockMock.verify).to.not.be.called(); }); }); it('should return valid result', async () => { - const result = await validateInstantAssetLockProofStructure(rawProof); + const result = await validateInstantAssetLockProofStructure( + rawProof, + ); expect(result).to.be.an.instanceOf(ValidationResult); expect(result.isValid()).to.be.true(); + + const publicKeyHash = transaction.outputs[0].script.getData(); expect(result.getData()).to.deep.equal(publicKeyHash); - // expect(stateRepositoryMock.verifyInstantLock).to.be.calledOnce(); + expect(stateRepositoryMock.verifyInstantLock).to.be.calledOnce(); }); }); From f991a8b836bad526280eb1e7d49c7145f7da4116 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Thu, 5 Jan 2023 17:04:00 +0400 Subject: [PATCH 38/66] feat(wasm-dpp): validateAssetLockTransactionFactory.spec.js --- .../asset_lock_transaction_validator.rs | 5 +- ...nsaction_out_point_already_exists_error.rs | 7 +- .../state_transition/asset_lock_proof/mod.rs | 59 +++++++- packages/wasm-dpp/src/state_repository.rs | 6 +- ...alidateAssetLockTransactionFactory.spec.js | 133 +++++++++--------- 5 files changed, 134 insertions(+), 76 deletions(-) diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_validator.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_validator.rs index de6b356c37e..fab089df2f5 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_validator.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_validator.rs @@ -1,6 +1,7 @@ use std::sync::Arc; use dashcore::consensus; +use dashcore::hashes::Hash; use dashcore::{OutPoint, Transaction}; use crate::consensus::basic::identity::{ @@ -83,7 +84,9 @@ where } let out_point = OutPoint::new(transaction.txid(), output_index as u32); - let out_point_buf = consensus::serialize(&out_point); + let mut out_point_buf = consensus::serialize(&out_point); + let (tx_id, _) = out_point_buf.split_at_mut(32); + tx_id.reverse(); let is_out_point_used = self .state_repository diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs index cea35f0c8da..50504144be7 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_out_point_already_exists_error.rs @@ -1,5 +1,6 @@ use dpp::consensus::basic::identity::IdentityAssetLockTransactionOutPointAlreadyExistsError; use dpp::consensus::ConsensusError; +use dpp::dashcore::hashes::Hash; use wasm_bindgen::prelude::*; use crate::buffer::Buffer; @@ -19,7 +20,7 @@ impl From<&IdentityAssetLockTransactionOutPointAlreadyExistsError> #[wasm_bindgen(js_class=IdentityAssetLockTransactionOutPointAlreadyExistsError)] impl IdentityAssetLockTransactionOutPointAlreadyExistsErrorWasm { - #[wasm_bindgen(js_name=getDuplicatedIds)] + #[wasm_bindgen(js_name=getOutputIndex)] pub fn output_index(&self) -> usize { self.inner.output_index() } @@ -27,7 +28,9 @@ impl IdentityAssetLockTransactionOutPointAlreadyExistsErrorWasm { #[wasm_bindgen(js_name=getTransactionId)] pub fn transaction_id(&self) -> Buffer { let tx_id = self.inner.transaction_id(); - Buffer::from_bytes(tx_id.to_vec().as_ref()) + let mut tx_id_bytes = tx_id.as_hash().into_inner(); + tx_id_bytes.reverse(); + Buffer::from_bytes(&tx_id_bytes) } #[wasm_bindgen(js_name=getCode)] diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index bf7211c3c48..214d8167343 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -3,13 +3,21 @@ mod instant; pub use chain::*; pub use instant::*; +use std::sync::Arc; -use crate::errors::RustConversionError; +use crate::errors::{from_dpp_err, RustConversionError}; +use dpp::dashcore::consensus; +use dpp::dashcore::hashes::hex::FromHex; use wasm_bindgen::prelude::*; +use crate::buffer::Buffer; use crate::identifier::IdentifierWrapper; -use crate::Deserialize; -use dpp::identity::state_transition::asset_lock_proof::AssetLockProof; +use crate::state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}; +use crate::validation::ValidationResultWasm; +use crate::{Deserialize, StateTransitionExecutionContextWasm}; +use dpp::identity::state_transition::asset_lock_proof::{ + AssetLockProof, AssetLockTransactionValidator, +}; #[derive(Deserialize, Clone)] #[wasm_bindgen(js_name=AssetLockProof)] @@ -109,3 +117,48 @@ pub fn create_asset_lock_proof_instance(raw_parameters: JsValue) -> Result Result { + let tx_bytes = Vec::from_hex(&raw_transaction) + .map_err(|_| RustConversionError::Error(String::from("invalid transaction hex")))?; + + let state_repository_wrapper = + Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository)); + + let validator = AssetLockTransactionValidator::new(state_repository_wrapper); + + let result = validator + .validate(tx_bytes.as_slice(), output_index, execution_context.into()) + .await + .map_err(|e| from_dpp_err(e.into()))?; + + let validation_result = result.map(|item| { + let object = js_sys::Object::new(); + + js_sys::Reflect::set( + &object, + &"publicKeyHash".to_owned().into(), + &Buffer::from_bytes(&item.public_key_hash), + ) + .unwrap(); + + let deserialized_tx = consensus::serialize(&item.transaction); + + js_sys::Reflect::set( + &object, + &"transaction".to_owned().into(), + &Buffer::from_bytes(&deserialized_tx), + ) + .unwrap(); + + object + }); + + Ok(validation_result.into()) +} diff --git a/packages/wasm-dpp/src/state_repository.rs b/packages/wasm-dpp/src/state_repository.rs index 142281e0cdd..d510b64eaa6 100644 --- a/packages/wasm-dpp/src/state_repository.rs +++ b/packages/wasm-dpp/src/state_repository.rs @@ -62,14 +62,14 @@ extern "C" { #[wasm_bindgen(structural, method, js_name=isAssetLockTransactionOutPointAlreadyUsed)] pub fn is_asset_lock_transaction_out_point_already_used( this: &ExternalStateRepositoryLike, - out_point_buffer: &[u8], + out_point_buffer: Vec, execution_context: StateTransitionExecutionContextWasm, ) -> bool; #[wasm_bindgen(structural, method, js_name=verifyInstantLock)] pub fn verify_instant_lock( this: &ExternalStateRepositoryLike, - instant_lock: &[u8], + instant_lock: &[u8], // TODO: replace with Vec to ensure that memory won't get allocated to something different execution_context: StateTransitionExecutionContextWasm, ) -> bool; @@ -282,7 +282,7 @@ impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper { .lock() .expect("unexpected concurrency issue!") .is_asset_lock_transaction_out_point_already_used( - out_point_buffer, + out_point_buffer.to_owned(), execution_context.clone().into(), )) } diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js index 653349db883..2e9655f6aff 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js @@ -1,33 +1,57 @@ -const { Transaction } = require('@dashevo/dashcore-lib'); +const { Transaction, PrivateKey, Script } = require('@dashevo/dashcore-lib'); -const DashCoreLib = require('@dashevo/dashcore-lib'); -const validateAssetLockTransactionFactory = require('@dashevo/dpp/lib/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory'); const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); -const ValidationResult = require('@dashevo/dpp/lib/validation/ValidationResult'); - -const { expectValidationError } = require('@dashevo/dpp/lib/test/expect/expectError'); - -const InvalidIdentityAssetLockTransactionError = require('@dashevo/dpp/lib/errors/consensus/basic/identity/InvalidIdentityAssetLockTransactionError'); -const IdentityAssetLockTransactionOutputNotFoundError = require('@dashevo/dpp/lib/errors/consensus/basic/identity/IdentityAssetLockTransactionOutputNotFoundError'); -const IdentityAssetLockTransactionOutPointAlreadyExistsError = require('@dashevo/dpp/lib/errors/consensus/basic/identity/IdentityAssetLockTransactionOutPointAlreadyExistsError'); -const InvalidIdentityAssetLockTransactionOutputError = require('@dashevo/dpp/lib/errors/consensus/basic/identity/InvalidIdentityAssetLockTransactionOutputError'); -const InvalidAssetLockTransactionOutputReturnSizeError = require('@dashevo/dpp/lib/errors/consensus/basic/identity/InvalidAssetLockTransactionOutputReturnSizeError'); -const StateTransitionExecutionContext = require('@dashevo/dpp/lib/stateTransition/StateTransitionExecutionContext'); +const AbstractConsensusError = require('@dashevo/dpp/lib/errors/consensus/AbstractConsensusError'); +const { expect } = require('chai'); +const { default: loadWasmDpp } = require('../../../../../dist'); describe('validateAssetLockTransactionFactory', () => { let stateRepositoryMock; - let validateAssetLockTransaction; let rawTransaction; let outputIndex; - let transactionInstance; let transactionMock; let executionContext; + let expectValidationError; + + let StateTransitionExecutionContext; + let InvalidIdentityAssetLockTransactionError; + let IdentityAssetLockTransactionOutputNotFoundError; + let InvalidIdentityAssetLockTransactionOutputError; + let InvalidAssetLockTransactionOutputReturnSizeError; + let IdentityAssetLockTransactionOutPointAlreadyExistsError; + let ValidationResult; + + let validateAssetLockTransaction; + let validateAssetLockTransactionDPP; + + before(async () => { + ({ + StateTransitionExecutionContext, + ValidationResult, + InvalidIdentityAssetLockTransactionError, + IdentityAssetLockTransactionOutputNotFoundError, + InvalidIdentityAssetLockTransactionOutputError, + InvalidAssetLockTransactionOutputReturnSizeError, + IdentityAssetLockTransactionOutPointAlreadyExistsError, + validateAssetLockTransaction: validateAssetLockTransactionDPP, + } = await loadWasmDpp()); + + expectValidationError = ( + result, + errorClass = AbstractConsensusError, + count = 1, + ) => { + expect(result).to.be.an.instanceOf(ValidationResult); + expect(result.getErrors()).to.have.lengthOf(count); + + result.getErrors().forEach((error) => expect(error).to.be.an.instanceOf(errorClass)); + }; + }); beforeEach(function beforeEach() { rawTransaction = '030000000137feb5676d0851337ea3c9a992496aab7a0b3eee60aeeb9774000b7f4bababa5000000006b483045022100d91557de37645c641b948c6cd03b4ae3791a63a650db3e2fee1dcf5185d1b10402200e8bd410bf516ca61715867666d31e44495428ce5c1090bf2294a829ebcfa4ef0121025c3cc7fbfc52f710c941497fd01876c189171ea227458f501afcb38a297d65b4ffffffff021027000000000000166a14152073ca2300a86b510fa2f123d3ea7da3af68dcf77cb0090a0000001976a914152073ca2300a86b510fa2f123d3ea7da3af68dc88ac00000000'; outputIndex = 0; - transactionInstance = new Transaction(rawTransaction); executionContext = new StateTransitionExecutionContext(); @@ -35,7 +59,12 @@ describe('validateAssetLockTransactionFactory', () => { stateRepositoryMock.isAssetLockTransactionOutPointAlreadyUsed.returns(false); - validateAssetLockTransaction = validateAssetLockTransactionFactory(stateRepositoryMock); + validateAssetLockTransaction = (tx, index, context) => validateAssetLockTransactionDPP( + stateRepositoryMock, + tx, + index, + context, + ); }); afterEach(() => { @@ -47,8 +76,6 @@ describe('validateAssetLockTransactionFactory', () => { it('should be valid transaction', async () => { rawTransaction = '030000000137feb5676d085133'; - validateAssetLockTransaction = validateAssetLockTransactionFactory(stateRepositoryMock); - const result = await validateAssetLockTransaction( rawTransaction, outputIndex, @@ -60,7 +87,7 @@ describe('validateAssetLockTransactionFactory', () => { const [error] = result.getErrors(); expect(error.getCode()).to.equal(1038); - expect(error.getValidationError()).to.be.instanceOf(Error); + expect(error.getValidationError()).to.exist(); expect(result.getData()).to.be.undefined(); expect(stateRepositoryMock.isAssetLockTransactionOutPointAlreadyUsed).to.not.be.called(); @@ -86,25 +113,13 @@ describe('validateAssetLockTransactionFactory', () => { expect(stateRepositoryMock.isAssetLockTransactionOutPointAlreadyUsed).to.not.be.called(); }); - it('should point to output with OR_RETURN', async function it() { - const isDataOut = this.sinonSandbox.stub().returns(false); - - const stubInstance = this.sinonSandbox.createStubInstance(Transaction); - - stubInstance.outputs = [{ - script: { - isDataOut, - }, - }]; - - stubInstance.getOutPointBuffer.returns(transactionInstance.getOutPointBuffer(outputIndex)); - - transactionMock = this.sinonSandbox.stub(DashCoreLib, 'Transaction').returns( - stubInstance, - ); + it('should point to output with OR_RETURN', async () => { + const regularTransaction = new Transaction(Buffer.from(rawTransaction, 'hex')); + regularTransaction.outputs[0] + .setScript(Script.buildPublicKeyHashOut(new PrivateKey().toAddress()).toString()); const result = await validateAssetLockTransaction( - rawTransaction, + regularTransaction.toBuffer().toString('hex'), outputIndex, executionContext, ); @@ -117,25 +132,13 @@ describe('validateAssetLockTransactionFactory', () => { expect(error.getOutputIndex()).to.equal(outputIndex); }); - it('should contain valid public key hash', async function it() { - const isDataOut = this.sinonSandbox.stub().returns(true); - const getData = this.sinonSandbox.stub().returns(Buffer.alloc(0)); - - const stubInstance = this.sinonSandbox.createStubInstance(Transaction); - stubInstance.outputs = [{ - script: { - isDataOut, - getData, - }, - }]; - stubInstance.getOutPointBuffer.returns(transactionInstance.getOutPointBuffer(outputIndex)); - - transactionMock = this.sinonSandbox.stub(DashCoreLib, 'Transaction').returns( - stubInstance, - ); + it('should contain valid public key hash', async () => { + const regularTransaction = new Transaction(Buffer.from(rawTransaction, 'hex')); + regularTransaction.outputs[0] + .setScript(Script.buildDataOut(Buffer.alloc(0))); const result = await validateAssetLockTransaction( - rawTransaction, + regularTransaction.toBuffer().toString('hex'), outputIndex, executionContext, ); @@ -165,16 +168,14 @@ describe('validateAssetLockTransactionFactory', () => { const transaction = new Transaction(rawTransaction); - expect(Buffer.isBuffer(error.getTransactionId())).to.be.true(); expect(error.getTransactionId()).to.deep.equal(Buffer.from(transaction.id, 'hex')); expect(error.getOutputIndex()).to.deep.equal(outputIndex); expect(result.getData()).to.be.undefined(); - expect(stateRepositoryMock.isAssetLockTransactionOutPointAlreadyUsed) - .to.be.calledOnceWithExactly( - transaction.getOutPointBuffer(outputIndex), - executionContext, - ); + + const { args } = stateRepositoryMock.isAssetLockTransactionOutPointAlreadyUsed.firstCall; + expect(args[0]).to.deep.equal(transaction.getOutPointBuffer(outputIndex)); + expect(args[1]).to.be.instanceOf(StateTransitionExecutionContext); }); it('should return valid result', async () => { @@ -191,15 +192,13 @@ describe('validateAssetLockTransactionFactory', () => { const initialTransaction = new Transaction(rawTransaction); const initialPublicKeyHash = initialTransaction.outputs[outputIndex].script.getData(); - expect(stateRepositoryMock.isAssetLockTransactionOutPointAlreadyUsed) - .to.be.calledOnceWithExactly( - initialTransaction.getOutPointBuffer(outputIndex), - executionContext, - ); + const { args } = stateRepositoryMock.isAssetLockTransactionOutPointAlreadyUsed.firstCall; + expect(args[0]).to.deep.equal(initialTransaction.getOutPointBuffer(outputIndex)); + expect(args[1]).to.be.instanceOf(StateTransitionExecutionContext); const { transaction, publicKeyHash } = result.getData(); expect(publicKeyHash).to.deep.equal(initialPublicKeyHash); - expect(transaction).to.be.an.instanceOf(Transaction); - expect(transaction.toJSON()).to.deep.equal(initialTransaction.toJSON()); + const parsedTx = new Transaction(Buffer.from(transaction)); + expect(parsedTx.toJSON()).to.deep.equal(initialTransaction.toJSON()); }); }); From 5e14cc65b9a33bc645d183f26e931f2677546f8a Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Thu, 5 Jan 2023 17:07:42 +0400 Subject: [PATCH 39/66] fix(wasm-dpp): references in ExternalStateRepositoryLike --- .../asset_lock_transaction_validator.rs | 1 - packages/rs-dpp/src/state_repository.rs | 1 - packages/wasm-dpp/src/state_repository.rs | 11 ++++------- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_validator.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_validator.rs index fab089df2f5..1093aef9830 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_validator.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_validator.rs @@ -1,7 +1,6 @@ use std::sync::Arc; use dashcore::consensus; -use dashcore::hashes::Hash; use dashcore::{OutPoint, Transaction}; use crate::consensus::basic::identity::{ diff --git a/packages/rs-dpp/src/state_repository.rs b/packages/rs-dpp/src/state_repository.rs index 2b1954a0e5b..94bfbe26de7 100644 --- a/packages/rs-dpp/src/state_repository.rs +++ b/packages/rs-dpp/src/state_repository.rs @@ -3,7 +3,6 @@ use async_trait::async_trait; use dashcore::InstantLock; #[cfg(any(test, feature = "mocks"))] use mockall::{automock, predicate::*}; -use serde::{Deserialize, Serialize}; use serde_json::Value as JsonValue; use std::convert::{Infallible, TryInto}; diff --git a/packages/wasm-dpp/src/state_repository.rs b/packages/wasm-dpp/src/state_repository.rs index d510b64eaa6..3d9c64c8f4d 100644 --- a/packages/wasm-dpp/src/state_repository.rs +++ b/packages/wasm-dpp/src/state_repository.rs @@ -55,7 +55,7 @@ extern "C" { #[wasm_bindgen(structural, method, js_name=fetchTransaction)] pub fn fetch_transaction( this: &ExternalStateRepositoryLike, - id: &str, + id: JsValue, execution_context: StateTransitionExecutionContextWasm, ) -> JsValue; @@ -69,7 +69,7 @@ extern "C" { #[wasm_bindgen(structural, method, js_name=verifyInstantLock)] pub fn verify_instant_lock( this: &ExternalStateRepositoryLike, - instant_lock: &[u8], // TODO: replace with Vec to ensure that memory won't get allocated to something different + instant_lock: Vec, // TODO: replace with Vec to ensure that memory won't get allocated to something different execution_context: StateTransitionExecutionContextWasm, ) -> bool; @@ -201,7 +201,7 @@ impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper { .0 .lock() .expect("unexpected concurrency issue!") - .fetch_transaction(id, execution_context.into()); + .fetch_transaction(JsValue::from_str(id), execution_context.into()); Ok(FetchTransactionResponse::from(response)) } @@ -264,10 +264,7 @@ impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper { .0 .lock() .expect("unexpected concurrency issue!") - .verify_instant_lock( - raw_instant_lock.as_slice(), - execution_context.clone().into(), - ); + .verify_instant_lock(raw_instant_lock, execution_context.clone().into()); Ok(verified) } From a5638542e169bc488b8f33442a5c54209ad2409e Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Mon, 9 Jan 2023 19:57:30 +0000 Subject: [PATCH 40/66] fix(wasm-dpp): validation result mapping for data_contrat_update validation --- .../data_contract_update_transition/validation.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/validation.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/validation.rs index c6664209f79..a740541bcc8 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/validation.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/validation.rs @@ -19,13 +19,14 @@ pub async fn validate_data_contract_update_transition_state( state_transition: DataContractUpdateTransitionWasm, ) -> Result { let wrapped_state_repository = ExternalStateRepositoryLikeWrapper::new(state_repository); - dpp_validate_data_contract_update_transition_state( + let result = dpp_validate_data_contract_update_transition_state( &wrapped_state_repository, &state_transition.into(), ) .await - .map(Into::into) - .map_err(from_dpp_err) + .map_err(from_dpp_err)?; + + Ok(result.map(|_| JsValue::undefined()).into()) } #[wasm_bindgen(js_name=validateIndicesAreBackwardCompatible)] @@ -40,7 +41,9 @@ pub fn validate_indices_are_backward_compatible( new_documents_schema, )?; - dpp_validate_indices_are_backward_compatible(old_documents.iter(), new_documents.iter()) - .map(Into::into) - .map_err(from_protocol_error) + let result = + dpp_validate_indices_are_backward_compatible(old_documents.iter(), new_documents.iter()) + .map_err(from_protocol_error)?; + + Ok(result.map(|_| JsValue::undefined()).into()) } From 0e56a04ce85505f71384e41058b1e04e8bf00cb6 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 10 Jan 2023 18:13:52 +0000 Subject: [PATCH 41/66] feat(wasm-dpp): fetchAssetLockTransactionOutputFactory.spec.js and fetchAssetLockPublicKeyHashFactory.spec.js --- .../unknown_asset_lock_proof_type_error.rs | 6 +- packages/wasm-dpp/src/errors/dpp_error.rs | 17 +++ packages/wasm-dpp/src/errors/mod.rs | 2 + .../asset_lock_output_not_found_error.rs | 11 ++ ...set_lock_transaction_is_not_found_error.rs | 20 ++++ packages/wasm-dpp/src/identity/errors/mod.rs | 7 ++ .../unknown_asset_lock_proof_type_error.rs | 26 +++++ packages/wasm-dpp/src/identity/mod.rs | 1 + .../instant/instant_asset_lock_proof.rs | 2 +- .../state_transition/asset_lock_proof/mod.rs | 106 ++++++++++++++++- .../identity_create_transition/mod.rs | 4 +- ...hAssetLockTransactionOutputFactory.spec.js | 110 ++++++++++++------ ...fetchAssetLockPublicKeyHashFactory.spec.js | 49 ++++++-- 13 files changed, 310 insertions(+), 51 deletions(-) create mode 100644 packages/wasm-dpp/src/errors/dpp_error.rs create mode 100644 packages/wasm-dpp/src/identity/errors/asset_lock_output_not_found_error.rs create mode 100644 packages/wasm-dpp/src/identity/errors/asset_lock_transaction_is_not_found_error.rs create mode 100644 packages/wasm-dpp/src/identity/errors/mod.rs create mode 100644 packages/wasm-dpp/src/identity/errors/unknown_asset_lock_proof_type_error.rs diff --git a/packages/rs-dpp/src/identity/errors/unknown_asset_lock_proof_type_error.rs b/packages/rs-dpp/src/identity/errors/unknown_asset_lock_proof_type_error.rs index fca6a73799d..8e42d49a268 100644 --- a/packages/rs-dpp/src/identity/errors/unknown_asset_lock_proof_type_error.rs +++ b/packages/rs-dpp/src/identity/errors/unknown_asset_lock_proof_type_error.rs @@ -3,15 +3,15 @@ use thiserror::Error; #[derive(Error, Debug, Clone, PartialEq, Eq)] #[error("'Unknown Asset lock proof type'")] pub struct UnknownAssetLockProofTypeError { - asset_lock_type: u32, + asset_lock_type: Option, } impl UnknownAssetLockProofTypeError { - pub fn new(asset_lock_type: u32) -> Self { + pub fn new(asset_lock_type: Option) -> Self { Self { asset_lock_type } } - pub fn asset_lock_type(&self) -> u32 { + pub fn asset_lock_type(&self) -> Option { self.asset_lock_type } } diff --git a/packages/wasm-dpp/src/errors/dpp_error.rs b/packages/wasm-dpp/src/errors/dpp_error.rs new file mode 100644 index 00000000000..2dbd42f7143 --- /dev/null +++ b/packages/wasm-dpp/src/errors/dpp_error.rs @@ -0,0 +1,17 @@ +use crate::identity::errors::{ + AssetLockOutputNotFoundErrorWasm, AssetLockTransactionIsNotFoundErrorWasm, +}; +use dpp::DPPError; +use wasm_bindgen::JsValue; + +pub fn from_dpp_error_ref(e: &DPPError) -> JsValue { + match e { + DPPError::AssetLockOutputNotFoundError(e) => { + AssetLockOutputNotFoundErrorWasm::from(e).into() + } + DPPError::AssetLockTransactionIsNotFoundError(e) => { + AssetLockTransactionIsNotFoundErrorWasm::from(e).into() + } + _ => JsValue::from(e.to_string()), + } +} diff --git a/packages/wasm-dpp/src/errors/mod.rs b/packages/wasm-dpp/src/errors/mod.rs index 0cfd5a0dbd8..c211b8159c9 100644 --- a/packages/wasm-dpp/src/errors/mod.rs +++ b/packages/wasm-dpp/src/errors/mod.rs @@ -9,3 +9,5 @@ pub mod protocol_error; mod public_key_validation_error; pub use public_key_validation_error::*; + +pub mod dpp_error; diff --git a/packages/wasm-dpp/src/identity/errors/asset_lock_output_not_found_error.rs b/packages/wasm-dpp/src/identity/errors/asset_lock_output_not_found_error.rs new file mode 100644 index 00000000000..4e137b2dfc2 --- /dev/null +++ b/packages/wasm-dpp/src/identity/errors/asset_lock_output_not_found_error.rs @@ -0,0 +1,11 @@ +use dpp::identity::errors::AssetLockOutputNotFoundError; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen(js_name=AssetLockOutputNotFoundError)] +pub struct AssetLockOutputNotFoundErrorWasm(AssetLockOutputNotFoundError); + +impl From<&AssetLockOutputNotFoundError> for AssetLockOutputNotFoundErrorWasm { + fn from(e: &AssetLockOutputNotFoundError) -> Self { + Self(e.clone()) + } +} diff --git a/packages/wasm-dpp/src/identity/errors/asset_lock_transaction_is_not_found_error.rs b/packages/wasm-dpp/src/identity/errors/asset_lock_transaction_is_not_found_error.rs new file mode 100644 index 00000000000..3687cd2c721 --- /dev/null +++ b/packages/wasm-dpp/src/identity/errors/asset_lock_transaction_is_not_found_error.rs @@ -0,0 +1,20 @@ +use dpp::dashcore::hashes::hex::ToHex; +use dpp::identity::errors::AssetLockTransactionIsNotFoundError; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen(js_name=AssetLockTransactionIsNotFoundError)] +pub struct AssetLockTransactionIsNotFoundErrorWasm(AssetLockTransactionIsNotFoundError); + +impl From<&AssetLockTransactionIsNotFoundError> for AssetLockTransactionIsNotFoundErrorWasm { + fn from(e: &AssetLockTransactionIsNotFoundError) -> Self { + Self(e.clone()) + } +} + +#[wasm_bindgen(js_class=AssetLockTransactionIsNotFoundError)] +impl AssetLockTransactionIsNotFoundErrorWasm { + #[wasm_bindgen(js_name=getTransactionId)] + pub fn transaction_id(&self) -> JsValue { + self.0.transaction_id().to_hex().into() + } +} diff --git a/packages/wasm-dpp/src/identity/errors/mod.rs b/packages/wasm-dpp/src/identity/errors/mod.rs new file mode 100644 index 00000000000..d4812382a93 --- /dev/null +++ b/packages/wasm-dpp/src/identity/errors/mod.rs @@ -0,0 +1,7 @@ +pub use asset_lock_output_not_found_error::*; +pub use asset_lock_transaction_is_not_found_error::*; +pub use unknown_asset_lock_proof_type_error::*; + +mod asset_lock_output_not_found_error; +mod asset_lock_transaction_is_not_found_error; +mod unknown_asset_lock_proof_type_error; diff --git a/packages/wasm-dpp/src/identity/errors/unknown_asset_lock_proof_type_error.rs b/packages/wasm-dpp/src/identity/errors/unknown_asset_lock_proof_type_error.rs new file mode 100644 index 00000000000..a56c2f13a2c --- /dev/null +++ b/packages/wasm-dpp/src/identity/errors/unknown_asset_lock_proof_type_error.rs @@ -0,0 +1,26 @@ +use dpp::identity::errors::UnknownAssetLockProofTypeError; +use wasm_bindgen::prelude::*; + +#[derive(Clone)] +#[wasm_bindgen(js_name=UnknownAssetLockProofTypeError)] +pub struct UnknownAssetLockProofTypeErrorWasm(UnknownAssetLockProofTypeError); + +impl From<&UnknownAssetLockProofTypeError> for UnknownAssetLockProofTypeErrorWasm { + fn from(e: &UnknownAssetLockProofTypeError) -> Self { + Self(e.clone()) + } +} + +impl From for UnknownAssetLockProofTypeErrorWasm { + fn from(e: UnknownAssetLockProofTypeError) -> Self { + Self(e) + } +} + +#[wasm_bindgen(js_class=UnknownAssetLockProofTypeError)] +impl UnknownAssetLockProofTypeErrorWasm { + #[wasm_bindgen(js_name=getType)] + pub fn get_type(&self) -> Option { + self.0.asset_lock_type() + } +} diff --git a/packages/wasm-dpp/src/identity/mod.rs b/packages/wasm-dpp/src/identity/mod.rs index 9ea48377e63..67416f48876 100644 --- a/packages/wasm-dpp/src/identity/mod.rs +++ b/packages/wasm-dpp/src/identity/mod.rs @@ -21,6 +21,7 @@ pub use identity_public_key::*; pub use state_transition::*; +pub mod errors; pub mod state_transition; #[wasm_bindgen(js_name=Identity)] diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs index 3475a9b68fd..80614f6d4e0 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs @@ -33,7 +33,7 @@ struct TxOutJS { #[derive(Serialize)] struct TxOutSerdeHelper<'a>(#[serde(with = "TxOutJS")] &'a TxOut); -#[derive(Debug, Deserialize, Serialize)] +#[derive(Debug, Clone, Deserialize, Serialize)] #[wasm_bindgen(js_name=InstantAssetLockProof)] pub struct InstantAssetLockProofWasm(InstantAssetLockProof); diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index 214d8167343..04efaa6574e 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -4,19 +4,26 @@ mod instant; pub use chain::*; pub use instant::*; use std::sync::Arc; +use wasm_bindgen::JsCast; +use wasm_bindgen::__rt::Ref; use crate::errors::{from_dpp_err, RustConversionError}; use dpp::dashcore::consensus; use dpp::dashcore::hashes::hex::FromHex; +use dpp::identity::errors::UnknownAssetLockProofTypeError; use wasm_bindgen::prelude::*; use crate::buffer::Buffer; +use crate::errors::dpp_error::from_dpp_error_ref; use crate::identifier::IdentifierWrapper; +use crate::identity::errors::UnknownAssetLockProofTypeErrorWasm; use crate::state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}; +use crate::utils::generic_of_js_val; use crate::validation::ValidationResultWasm; use crate::{Deserialize, StateTransitionExecutionContextWasm}; use dpp::identity::state_transition::asset_lock_proof::{ - AssetLockProof, AssetLockTransactionValidator, + AssetLockProof, AssetLockPublicKeyHashFetcher, AssetLockTransactionOutputFetcher, + AssetLockTransactionValidator, }; #[derive(Deserialize, Clone)] @@ -118,6 +125,44 @@ pub fn create_asset_lock_proof_instance(raw_parameters: JsValue) -> Result Result { + let default_error: UnknownAssetLockProofTypeErrorWasm = + UnknownAssetLockProofTypeError::new(None).into(); + + let get_type_value = js_sys::Reflect::get(js_value, &JsValue::from_str("getType")) + .map_err(|_| default_error.clone())?; + + let get_type_function: &js_sys::Function = get_type_value + .dyn_ref::() + .ok_or(default_error.clone())?; + + let lock_type = get_type_function + .call0(&js_value)? + .as_f64() + .ok_or(default_error.clone())? as u8; + + if lock_type == 0 { + let instant: Ref = + generic_of_js_val::(js_value, "InstantAssetLockProof")?; + + Ok(AssetLockProof::Instant(instant.clone().into())) + } else if lock_type == 1 { + let chain: Ref = + generic_of_js_val::(js_value, "ChainAssetLockProof")?; + + Ok(AssetLockProof::Chain(chain.clone().into())) + } else { + Err( + UnknownAssetLockProofTypeErrorWasm::from(UnknownAssetLockProofTypeError::new(Some( + lock_type, + ))) + .into(), + ) + } +} + #[wasm_bindgen(js_name=validateAssetLockTransaction)] pub async fn validate_asset_lock_transaction( state_repository: ExternalStateRepositoryLike, @@ -162,3 +207,62 @@ pub async fn validate_asset_lock_transaction( Ok(validation_result.into()) } + +#[wasm_bindgen(js_name=fetchAssetLockTransactionOutput)] +pub async fn fetch_asset_lock_transaction_output( + state_repository: ExternalStateRepositoryLike, + raw_asset_lock_proof: JsValue, + execution_context: &StateTransitionExecutionContextWasm, +) -> Result { + let asset_lock_proof = create_asset_lock_proof_from_wasm_instance(&raw_asset_lock_proof)?; + + let state_repository_wrapper = + Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository)); + + let fetcher = AssetLockTransactionOutputFetcher::new(state_repository_wrapper); + + let fetch_result = fetcher + .fetch(&asset_lock_proof, execution_context.into()) + .await + .map_err(|e| from_dpp_error_ref(&e))?; + + let tx_out = js_sys::Object::new(); + + js_sys::Reflect::set( + &tx_out, + &"satoshis".to_owned().into(), + &(fetch_result.value as u32).into(), + ) + .unwrap(); + + let script_hex = format!("{:x}", fetch_result.script_pubkey); + + js_sys::Reflect::set(&tx_out, &"script".to_owned().into(), &script_hex.into()).unwrap(); + + Ok(tx_out.into()) +} + +#[wasm_bindgen(js_name=fetchAssetLockPublicKeyHash)] +pub async fn fetch_asset_lock_public_key_hash( + state_repository: ExternalStateRepositoryLike, + raw_asset_lock_proof: JsValue, + execution_context: &StateTransitionExecutionContextWasm, +) -> Result { + let asset_lock_proof = create_asset_lock_proof_from_wasm_instance(&raw_asset_lock_proof)?; + + let state_repository_wrapper = + Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository)); + + let tx_output_fetcher = + AssetLockTransactionOutputFetcher::new(state_repository_wrapper.clone()); + + let public_key_hash_fetcher = + AssetLockPublicKeyHashFetcher::new(state_repository_wrapper, tx_output_fetcher); + + let fetch_result = public_key_hash_fetcher + .fetch_public_key_hash(asset_lock_proof, execution_context.into()) + .await + .map_err(|e| from_dpp_error_ref(&e))?; + + Ok(Buffer::from_bytes(&fetch_result).into()) +} diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs index 8c8134af522..8b8a174a9f5 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs @@ -1,6 +1,8 @@ pub use identity_create_transition::*; pub use validation::*; +pub mod apply_identity_create_transition; pub mod identity_create_transition; -mod to_object; pub mod validation; + +mod to_object; diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js index b83cafc6407..3958df7946f 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js @@ -1,32 +1,52 @@ -const { Transaction, Script } = require('@dashevo/dashcore-lib'); -const Output = require('@dashevo/dashcore-lib/lib/transaction/output'); +const { Transaction } = require('@dashevo/dashcore-lib'); -const fetchAssetLockTransactionOutputFactory = require('@dashevo/dpp/lib/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory'); const getChainAssetLockFixture = require('@dashevo/dpp/lib/test/fixtures/getChainAssetLockProofFixture'); const getInstantAssetLockProofFixture = require('@dashevo/dpp/lib/test/fixtures/getInstantAssetLockProofFixture'); const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); - -const UnknownAssetLockProofError = require('@dashevo/dpp/lib/identity/errors/UnknownAssetLockProofTypeError'); -const AssetLockTransactionIsNotFoundError = require('@dashevo/dpp/lib/identity/errors/AssetLockTransactionIsNotFoundError'); -const StateTransitionExecutionContext = require('@dashevo/dpp/lib/stateTransition/StateTransitionExecutionContext'); +const { default: loadWasmDpp } = require('../../../../../dist'); describe('fetchAssetLockTransactionOutputFactory', () => { let fetchAssetLockTransactionOutput; let stateRepositoryMock; let executionContext; + let StateTransitionExecutionContext; + let InstantAssetLockProof; + let ChainAssetLockProof; + let AssetLockTransactionIsNotFoundError; + let UnknownAssetLockProofTypeError; + + let fetchAssetLockTransactionOutputDPP; + + before(async () => { + ({ + StateTransitionExecutionContext, + fetchAssetLockTransactionOutput: fetchAssetLockTransactionOutputDPP, + InstantAssetLockProof, + ChainAssetLockProof, + AssetLockTransactionIsNotFoundError, + UnknownAssetLockProofTypeError, + } = await loadWasmDpp()); + }); + beforeEach(function beforeEach() { stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); - fetchAssetLockTransactionOutput = fetchAssetLockTransactionOutputFactory(stateRepositoryMock); executionContext = new StateTransitionExecutionContext(); + + fetchAssetLockTransactionOutput = (proof, context) => fetchAssetLockTransactionOutputDPP( + stateRepositoryMock, + proof, + context, + ); }); describe('InstantAssetLockProof', () => { let assetLockProofFixture; beforeEach(() => { - assetLockProofFixture = getInstantAssetLockProofFixture(); + const assetLockProofFixtureJS = getInstantAssetLockProofFixture(); + assetLockProofFixture = new InstantAssetLockProof(assetLockProofFixtureJS.toObject()); }); it('should return asset lock output', async () => { @@ -47,17 +67,29 @@ describe('fetchAssetLockTransactionOutputFactory', () => { beforeEach(() => { const rawTransaction = '030000000137feb5676d0851337ea3c9a992496aab7a0b3eee60aeeb9774000b7f4bababa5000000006b483045022100d91557de37645c641b948c6cd03b4ae3791a63a650db3e2fee1dcf5185d1b10402200e8bd410bf516ca61715867666d31e44495428ce5c1090bf2294a829ebcfa4ef0121025c3cc7fbfc52f710c941497fd01876c189171ea227458f501afcb38a297d65b4ffffffff021027000000000000166a14152073ca2300a86b510fa2f123d3ea7da3af68dcf77cb0090a0000001976a914152073ca2300a86b510fa2f123d3ea7da3af68dc88ac00000000'; - assetLockProofFixture = getChainAssetLockFixture(); - stateRepositoryMock.fetchTransaction.resolves({ + const assetLockProofFixtureJS = getChainAssetLockFixture(); + + const outPoint = Transaction + .parseOutPointBuffer(Buffer.from(assetLockProofFixtureJS.getOutPoint())); + ({ transactionHash } = outPoint); + + const rawProof = assetLockProofFixtureJS.toObject(); + + // Change endianness of raw txId bytes in outPoint to match expectation of dashcore-rust + const txId = rawProof.outPoint.slice(0, 32); + const outputIndex = rawProof.outPoint.slice(32); + txId.reverse(); + rawProof.outPoint = Buffer.concat([txId, outputIndex]); + + assetLockProofFixture = new ChainAssetLockProof(rawProof); + + stateRepositoryMock.fetchTransaction.returns({ data: Buffer.from(rawTransaction, 'hex'), height: 42, }); const transaction = new Transaction(rawTransaction); ([output] = transaction.outputs); - - const outPoint = Transaction.parseOutPointBuffer(assetLockProofFixture.getOutPoint()); - ({ transactionHash } = outPoint); }); it('should fetch output from state repository', async () => { @@ -66,15 +98,14 @@ describe('fetchAssetLockTransactionOutputFactory', () => { executionContext, ); - expect(assetLockTransactionOutput).to.deep.equal(output); + expect(assetLockTransactionOutput).to.deep.equal(output.toObject()); - expect(stateRepositoryMock.fetchTransaction).to.be.calledOnceWithExactly( - transactionHash, - executionContext, - ); + const { args } = stateRepositoryMock.fetchTransaction.firstCall; + expect(args[0]).to.equal(transactionHash); + expect(args[1]).to.be.instanceOf(StateTransitionExecutionContext); }); - it('should throw IdentityAssetLockTransactionIsNotFoundError when transaction is not found', async () => { + it('should throw AssetLockTransactionIsNotFoundError when transaction is not found', async () => { stateRepositoryMock.fetchTransaction.resolves(null); try { @@ -83,7 +114,7 @@ describe('fetchAssetLockTransactionOutputFactory', () => { executionContext, ); - expect.fail('should throw IdentityAssetLockTransactionIsNotFoundError'); + expect.fail('should throw AssetLockTransactionIsNotFoundError'); } catch (e) { expect(e).to.be.an.instanceOf(AssetLockTransactionIsNotFoundError); expect(e.getTransactionId()).to.deep.equal(transactionHash); @@ -100,24 +131,35 @@ describe('fetchAssetLockTransactionOutputFactory', () => { executionContext.disableDryRun(); - expect(result).to.deep.equal(new Output({ + expect(result).to.deep.equal({ satoshis: 1000, - script: new Script(), - })); + script: '', + }); + + const { args } = stateRepositoryMock.fetchTransaction.firstCall; + expect(args[0]).to.equal(transactionHash); + expect(args[1]).to.be.instanceOf(StateTransitionExecutionContext); + }); + }); - expect(stateRepositoryMock.fetchTransaction).to.be.calledOnceWithExactly( - transactionHash, + it('should throw UnknownAssetLockProofTypeError for unknown assetLockProof', async () => { + try { + await fetchAssetLockTransactionOutput( + {}, executionContext, ); - }); + + expect.fail('should throw UnknownAssetLockProofTypeError'); + } catch (e) { + expect(e).to.be.an.instanceOf(UnknownAssetLockProofTypeError); + } }); - it('should throw UnknownAssetLockProofError for unknown assetLockProof', async function it() { - const type = 666; + it('should throw UnknownAssetLockProofTypeError for unknown assetLockProof type', async () => { + const type = 100; - const assetLockProofFixture = { - getType: this.sinonSandbox.stub().returns(type), - }; + const assetLockProofFixture = new ChainAssetLockProof(getChainAssetLockFixture().toObject()); + assetLockProofFixture.getType = () => type; try { await fetchAssetLockTransactionOutput( @@ -125,9 +167,9 @@ describe('fetchAssetLockTransactionOutputFactory', () => { executionContext, ); - expect.fail('should throw UnknownAssetLockProofError'); + expect.fail('should throw UnknownAssetLockProofTypeError'); } catch (e) { - expect(e).to.be.an.instanceOf(UnknownAssetLockProofError); + expect(e).to.be.an.instanceOf(UnknownAssetLockProofTypeError); expect(e.getType()).to.equal(type); } }); diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/fetchAssetLockPublicKeyHashFactory.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/fetchAssetLockPublicKeyHashFactory.spec.js index 6d39228f671..48cba2d46cb 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/fetchAssetLockPublicKeyHashFactory.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/fetchAssetLockPublicKeyHashFactory.spec.js @@ -1,32 +1,59 @@ -const fetchAssetLockPublicKeyHashFactory = require('@dashevo/dpp/lib/identity/stateTransition/assetLockProof/fetchAssetLockPublicKeyHashFactory'); +const { Script } = require('@dashevo/dashcore-lib'); + const getInstantAssetLockProofFixture = require('@dashevo/dpp/lib/test/fixtures/getInstantAssetLockProofFixture'); -const AssetLockOutputNotFoundError = require('@dashevo/dpp/lib/identity/errors/AssetLockOutputNotFoundError'); + +const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); +const { default: loadWasmpDpp } = require('../../../../../dist'); describe('fetchAssetLockPublicKeyHashFactory', () => { let fetchAssetLockPublicKeyHash; - let fetchAssetLockTransactionOutputMock; - let assetLockProof; + let stateRepositoryMock; + let executionContext; + + let StateTransitionExecutionContext; + let InstantAssetLockProof; + let AssetLockOutputNotFoundError; + let fetchAssetLockPublicKeyHashDPP; + + before(async () => { + ({ + StateTransitionExecutionContext, + InstantAssetLockProof, + AssetLockOutputNotFoundError, + fetchAssetLockPublicKeyHash: fetchAssetLockPublicKeyHashDPP, + } = await loadWasmpDpp()); + }); beforeEach(function beforeEach() { - fetchAssetLockTransactionOutputMock = this.sinonSandbox.stub(); + stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); - fetchAssetLockPublicKeyHash = fetchAssetLockPublicKeyHashFactory( - fetchAssetLockTransactionOutputMock, - ); + executionContext = new StateTransitionExecutionContext(); - assetLockProof = getInstantAssetLockProofFixture(); + fetchAssetLockPublicKeyHash = (proof) => fetchAssetLockPublicKeyHashDPP( + stateRepositoryMock, + proof, + executionContext, + ); }); it('should return public key hash for specified asset lock proof', async () => { - fetchAssetLockTransactionOutputMock.resolves(assetLockProof.getOutput()); + const assetLockProof = new InstantAssetLockProof( + getInstantAssetLockProofFixture().toObject(), + ); const result = await fetchAssetLockPublicKeyHash(assetLockProof); - expect(result).to.deep.equal(assetLockProof.getOutput().script.getData()); + expect(result).to + .deep.equal(new Script(assetLockProof.getOutput().script).getData()); }); it('should throw AssetLockOutputNotFoundError if output is not found', async () => { try { + const assetLockProofJS = getInstantAssetLockProofFixture(); + // Mess up TX outputs + assetLockProofJS.transaction.outputs = []; + + const assetLockProof = new InstantAssetLockProof(assetLockProofJS.toObject()); await fetchAssetLockPublicKeyHash(assetLockProof); expect.fail('should throw AssetLockOutputNotFoundError'); } catch (e) { From f5770d2e3f694c5b1d1bc37f266333f72ddc8958 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 10 Jan 2023 21:06:02 +0000 Subject: [PATCH 42/66] feat(wasm-dpp): applyIdentityCreateTransitionFactory.spec.js --- .../apply_identity_create_transition.rs | 11 +++ packages/wasm-dpp/src/identity/mod.rs | 6 ++ .../state_transition/asset_lock_proof/mod.rs | 2 +- .../apply_identity_create_transition.rs | 26 +++++++ .../identity_create_transition.rs | 25 +++++-- packages/wasm-dpp/src/state_repository.rs | 63 +++++++++++++--- .../IdentityCreateTransition.spec.js | 6 +- ...plyIdentityCreateTransitionFactory.spec.js | 73 +++++++++---------- 8 files changed, 152 insertions(+), 60 deletions(-) create mode 100644 packages/wasm-dpp/src/identity/state_transition/identity_create_transition/apply_identity_create_transition.rs diff --git a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/apply_identity_create_transition.rs b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/apply_identity_create_transition.rs index 2baa56809aa..79856c89bf8 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/apply_identity_create_transition.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/apply_identity_create_transition.rs @@ -22,6 +22,17 @@ impl ApplyIdentityCreateTransition where SR: StateRepositoryLike, { + pub fn new(state_repository: Arc) -> Self { + let asset_lock_transaction_output_fetcher = Arc::new( + AssetLockTransactionOutputFetcher::new(state_repository.clone()), + ); + + Self { + state_repository, + asset_lock_transaction_output_fetcher, + } + } + pub async fn apply_identity_create_transition( &self, state_transition: &IdentityCreateTransition, diff --git a/packages/wasm-dpp/src/identity/mod.rs b/packages/wasm-dpp/src/identity/mod.rs index 67416f48876..b244377c85d 100644 --- a/packages/wasm-dpp/src/identity/mod.rs +++ b/packages/wasm-dpp/src/identity/mod.rs @@ -34,6 +34,12 @@ impl From for Identity { } } +impl From for IdentityWasm { + fn from(identity: Identity) -> Self { + Self(identity) + } +} + #[wasm_bindgen(js_class=Identity)] impl IdentityWasm { #[wasm_bindgen(constructor)] diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index 04efaa6574e..10bb31ff5b2 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -125,7 +125,7 @@ pub fn create_asset_lock_proof_instance(raw_parameters: JsValue) -> Result Result { let default_error: UnknownAssetLockProofTypeErrorWasm = diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/apply_identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/apply_identity_create_transition.rs new file mode 100644 index 00000000000..5c61e49ecd8 --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/apply_identity_create_transition.rs @@ -0,0 +1,26 @@ +use dpp::identity::state_transition::identity_create_transition::ApplyIdentityCreateTransition; +use std::sync::Arc; +use wasm_bindgen::prelude::*; + +use crate::{ + state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, + IdentityCreateTransitionWasm, +}; + +#[wasm_bindgen(js_name=applyIdentityCreateTransition)] +pub async fn apply_identity_create_transition_wasm( + state_repository: ExternalStateRepositoryLike, + state_transition: &IdentityCreateTransitionWasm, +) -> Result<(), JsValue> { + let wrapped_state_repository = + Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository)); + + let instance = ApplyIdentityCreateTransition::new(wrapped_state_repository); + + instance + .apply_identity_create_transition(&state_transition.to_owned().into()) + .await + .map_err(|e| JsValue::from_str(&e.to_string()))?; + + Ok(()) +} diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index e724c6cd1d8..cbd6dc94772 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -8,6 +8,7 @@ use crate::identity::state_transition::AssetLockProofWasm; use crate::{ buffer::Buffer, + create_asset_lock_proof_from_wasm_instance, errors::RustConversionError, identity::{ state_transition::asset_lock_proof::{ChainAssetLockProofWasm, InstantAssetLockProofWasm}, @@ -83,25 +84,33 @@ impl IdentityCreateTransitionWasm { } #[wasm_bindgen(js_name=setAssetLockProof)] - pub fn set_asset_lock_proof( - &mut self, - asset_lock_proof: AssetLockProofWasm, - ) -> Result<(), JsValue> { + pub fn set_asset_lock_proof(&mut self, asset_lock_proof: JsValue) -> Result<(), JsValue> { + let asset_lock_proof = create_asset_lock_proof_from_wasm_instance(&asset_lock_proof)?; + self.0 - .set_asset_lock_proof(asset_lock_proof.into()) + .set_asset_lock_proof(asset_lock_proof) .map_err(|e| RustConversionError::Error(e.to_string()).to_js_value())?; Ok(()) } #[wasm_bindgen(getter, js_name=assetLockProof)] - pub fn asset_lock_proof(&self) -> AssetLockProofWasm { + pub fn asset_lock_proof(&self) -> JsValue { self.get_asset_lock_proof() } #[wasm_bindgen(js_name=getAssetLockProof)] - pub fn get_asset_lock_proof(&self) -> AssetLockProofWasm { - self.0.get_asset_lock_proof().to_owned().into() + pub fn get_asset_lock_proof(&self) -> JsValue { + let asset_lock_proof = self.0.get_asset_lock_proof().to_owned(); + + match asset_lock_proof { + AssetLockProof::Chain(chain_asset_lock_proof) => { + ChainAssetLockProofWasm::from(chain_asset_lock_proof).into() + } + AssetLockProof::Instant(instant_asset_lock_proof) => { + InstantAssetLockProofWasm::from(instant_asset_lock_proof).into() + } + } } #[wasm_bindgen(js_name=setPublicKeys)] diff --git a/packages/wasm-dpp/src/state_repository.rs b/packages/wasm-dpp/src/state_repository.rs index 3d9c64c8f4d..4e33f7d1c72 100644 --- a/packages/wasm-dpp/src/state_repository.rs +++ b/packages/wasm-dpp/src/state_repository.rs @@ -17,6 +17,7 @@ use dpp::{ }; use wasm_bindgen::prelude::*; +use crate::buffer::Buffer; use crate::{ identifier::IdentifierWrapper, DataContractWasm, IdentityWasm, StateTransitionExecutionContextWasm, @@ -69,10 +70,31 @@ extern "C" { #[wasm_bindgen(structural, method, js_name=verifyInstantLock)] pub fn verify_instant_lock( this: &ExternalStateRepositoryLike, - instant_lock: Vec, // TODO: replace with Vec to ensure that memory won't get allocated to something different + instant_lock: Vec, execution_context: StateTransitionExecutionContextWasm, ) -> bool; + #[wasm_bindgen(structural, method, js_name=createIdentity)] + pub fn create_identity( + this: &ExternalStateRepositoryLike, + identity: IdentityWasm, + execution_context: StateTransitionExecutionContextWasm, + ); + + #[wasm_bindgen(structural, method, js_name=storeIdentityPublicKeyHashes)] + pub fn store_identity_public_key_hashes( + this: &ExternalStateRepositoryLike, + identity_id: IdentifierWrapper, + public_key_hashes: Vec, + execution_context: StateTransitionExecutionContextWasm, + ); + + #[wasm_bindgen(structural, method, js_name=markAssetLockTransactionOutPointAsUsed)] + pub fn mark_asset_lock_transaction_out_point_as_used( + this: &ExternalStateRepositoryLike, + out_point_buffer: Vec, + ); + // TODO add missing declarations } @@ -220,11 +242,24 @@ impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper { async fn store_identity_public_key_hashes( &self, - _identity_id: &Identifier, - _public_key_hashes: Vec>, - _execution_context: &StateTransitionExecutionContext, + identity_id: &Identifier, + public_key_hashes: Vec>, + execution_context: &StateTransitionExecutionContext, ) -> anyhow::Result<()> { - todo!() + let hashes = public_key_hashes + .iter() + .map(|hash| Buffer::from_bytes(hash.as_slice())) + .collect(); + + Ok(self + .0 + .lock() + .expect("unexpected concurrency issue!") + .store_identity_public_key_hashes( + identity_id.clone().into(), + hashes, + execution_context.clone().into(), + )) } async fn fetch_identity_by_public_key_hashes( @@ -286,9 +321,13 @@ impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper { async fn mark_asset_lock_transaction_out_point_as_used( &self, - _out_point_buffer: &[u8], + out_point_buffer: &[u8], ) -> anyhow::Result<()> { - todo!() + Ok(self + .0 + .lock() + .expect("unexpected concurrency issue!") + .mark_asset_lock_transaction_out_point_as_used(out_point_buffer.to_owned())) } async fn fetch_sml_store(&self) -> anyhow::Result @@ -300,10 +339,14 @@ impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper { async fn create_identity( &self, - _identity: &Identity, - _execution_context: &StateTransitionExecutionContext, + identity: &Identity, + execution_context: &StateTransitionExecutionContext, ) -> anyhow::Result<()> { - todo!() + Ok(self + .0 + .lock() + .expect("unexpected concurrency issue!") + .create_identity(identity.clone().into(), execution_context.clone().into())) } async fn update_identity( diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js index 3bb25000e1d..6cf6c805d89 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js @@ -12,7 +12,7 @@ describe('IdentityCreateTransition', () => { let KeyPurpose; let KeySecurityLevel; let IdentityPublicKey; - let AssetLockProof; + let ChainAssetLockProof; const mockRawPublicKey = (params = {}) => ({ id: 0, @@ -28,7 +28,7 @@ describe('IdentityCreateTransition', () => { before(async () => { ({ IdentityCreateTransition, IdentityPublicKey, KeyType, KeyPurpose, KeySecurityLevel, - AssetLockProof, + ChainAssetLockProof, } = await loadWasmDpp()); }); @@ -68,7 +68,7 @@ describe('IdentityCreateTransition', () => { describe('#setAssetLockProof', () => { let assetLockProofObject; beforeEach(() => { - const assetLockProof = new AssetLockProof(getChainAssetLockProofFixture().toObject()); + const assetLockProof = new ChainAssetLockProof(getChainAssetLockProofFixture().toObject()); assetLockProofObject = assetLockProof.toObject(); stateTransition.setAssetLockProof(assetLockProof); }); diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js index ec34c9936ab..f2f40dd90b2 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js @@ -1,9 +1,3 @@ -const Identity = require('@dashevo/dpp/lib/identity/Identity'); - -const applyIdentityCreateTransitionFactory = require( - '@dashevo/dpp/lib/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory', -); - const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); const { convertSatoshiToCredits } = require('@dashevo/dpp/lib/identity/creditsConverter'); @@ -11,21 +5,36 @@ const { convertSatoshiToCredits } = require('@dashevo/dpp/lib/identity/creditsCo const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); const protocolVersion = require('@dashevo/dpp/lib/version/protocolVersion'); -const StateTransitionExecutionContext = require('@dashevo/dpp/lib/stateTransition/StateTransitionExecutionContext'); -const ReadOperation = require('@dashevo/dpp/lib/stateTransition/fee/operations/ReadOperation'); + +const { default: loadWasmDpp } = require('../../../../../dist'); describe('applyIdentityCreateTransitionFactory', () => { let stateTransition; let applyIdentityCreateTransition; let stateRepositoryMock; - let fetchAssetLockTransactionOutputMock; let output; let executionContext; + let StateTransitionExecutionContext; + let IdentityCreateTransition; + let Identity; + + let applyIdentityCreateTransitionDPP; + + before(async () => { + ({ + StateTransitionExecutionContext, + IdentityCreateTransition, + applyIdentityCreateTransition: applyIdentityCreateTransitionDPP, + Identity, + } = await loadWasmDpp()); + }); + beforeEach(function beforeEach() { stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); - stateTransition = getIdentityCreateTransitionFixture(); + const stateTransitionJS = getIdentityCreateTransitionFixture(); + stateTransition = new IdentityCreateTransition(stateTransitionJS.toObject()); executionContext = new StateTransitionExecutionContext(); @@ -33,19 +42,13 @@ describe('applyIdentityCreateTransitionFactory', () => { output = stateTransition.getAssetLockProof().getOutput(); - fetchAssetLockTransactionOutputMock = this.sinonSandbox.stub().resolves(output); - - applyIdentityCreateTransition = applyIdentityCreateTransitionFactory( + applyIdentityCreateTransition = (st) => applyIdentityCreateTransitionDPP( stateRepositoryMock, - fetchAssetLockTransactionOutputMock, + st, ); }); it('should store identity created from state transition', async () => { - executionContext.addOperation( - new ReadOperation(1), - ); - await applyIdentityCreateTransition(stateTransition); const balance = convertSatoshiToCredits( @@ -60,31 +63,25 @@ describe('applyIdentityCreateTransitionFactory', () => { revision: 0, }); - expect(stateRepositoryMock.createIdentity).to.have.been.calledOnceWithExactly( - identity, - executionContext, - ); + const { args: createIdentityArgs } = stateRepositoryMock.createIdentity.firstCall; + + expect(createIdentityArgs[0].toObject()).to.deep.equal(identity.toObject()); + expect(createIdentityArgs[1]).to.be.instanceOf(StateTransitionExecutionContext); const publicKeyHashes = identity .getPublicKeys() .map((publicKey) => publicKey.hash()); - expect(stateRepositoryMock.storeIdentityPublicKeyHashes).to.have.been.calledOnceWithExactly( - identity.getId(), - publicKeyHashes, - executionContext, - ); + const { args: storePublicKeyHashesArgs } = stateRepositoryMock + .storeIdentityPublicKeyHashes.firstCall; + expect(storePublicKeyHashesArgs[0].toBuffer()).to.deep.equal(identity.getId().toBuffer()); + expect(storePublicKeyHashesArgs[1]).to.deep.equal(publicKeyHashes); + expect(storePublicKeyHashesArgs[2]).to.be.instanceOf(StateTransitionExecutionContext); + + const { args: markAsUsedArgs } = stateRepositoryMock + .markAssetLockTransactionOutPointAsUsed.firstCall; - expect(stateRepositoryMock.markAssetLockTransactionOutPointAsUsed).to.have.been - .calledOnceWithExactly( - stateTransition.getAssetLockProof().getOutPoint(), - executionContext, - ); - - expect(fetchAssetLockTransactionOutputMock) - .to.be.calledOnceWithExactly( - stateTransition.getAssetLockProof(), - executionContext, - ); + expect(markAsUsedArgs[0]).to + .deep.equal(stateTransition.getAssetLockProof().getOutPoint()); }); }); From f81d747733bdd63830c52ab4e9622c20bbdb0575 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Thu, 12 Jan 2023 19:23:31 +0000 Subject: [PATCH 43/66] feat(wasm-dpp): validatePublicKeySignaturesFactory.spec.js --- .../identity_create_transition.rs | 39 ++++++++--- .../lib/test/mocks/getBlsAdapterMock.js | 36 ++++++++++ packages/wasm-dpp/src/bls_adapter.rs | 16 ++++- .../src/identity/identity_public_key/mod.rs | 10 +++ .../identity_create_transition.rs | 25 +++++++ .../src/identity/state_transition/mod.rs | 2 + .../validate_public_key_signatures.rs | 66 ++++++++++++++++++ .../src/validation/validation_result.rs | 9 +++ ...validatePublicKeySignaturesFactory.spec.js | 68 +++++++++++++------ 9 files changed, 239 insertions(+), 32 deletions(-) create mode 100644 packages/wasm-dpp/lib/test/mocks/getBlsAdapterMock.js create mode 100644 packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs diff --git a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index f9bf1ceaba1..82de093ee14 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -10,7 +10,8 @@ use crate::identity::IdentityPublicKey; use crate::prelude::Identifier; use crate::state_transition::state_transition_execution_context::StateTransitionExecutionContext; use crate::state_transition::{ - StateTransition, StateTransitionConvert, StateTransitionLike, StateTransitionType, + state_transition_helpers, StateTransition, StateTransitionConvert, StateTransitionLike, + StateTransitionType, }; use crate::util::json_value::JsonValueExt; use crate::util::string_encoding::Encoding; @@ -176,6 +177,11 @@ impl IdentityCreateTransition { ) -> Result { let mut json_map = JsonValue::Object(Default::default()); + json_map.insert( + property_names::TRANSITION_TYPE.to_string(), + serde_json::Value::from(Self::get_type() as u8), + )?; + if !options.skip_signature { let sig = self.signature.iter().map(|num| JsonValue::from(*num)); json_map.insert( @@ -244,17 +250,25 @@ impl StateTransitionConvert for IdentityCreateTransition { } fn to_object(&self, skip_signature: bool) -> Result { - let mut json_value: JsonValue = serde_json::to_value(self)?; - - if skip_signature { - if let JsonValue::Object(ref mut o) = json_value { - for path in Self::signature_property_paths() { - o.remove(path); - } - } + // The [state_transition_helpers::to_object] doesn't convert the `public_keys` property. + // The property must be serialized manually + let mut public_keys: Vec = vec![]; + for key in self.public_keys.iter() { + public_keys.push(key.to_raw_json_object(skip_signature)?); } - Ok(json_value) + let mut raw_object: JsonValue = state_transition_helpers::to_object( + self, + Self::signature_property_paths(), + Self::identifiers_property_paths(), + skip_signature, + )?; + raw_object.insert( + property_names::PUBLIC_KEYS.to_owned(), + JsonValue::Array(public_keys), + )?; + + Ok(raw_object) } fn to_json(&self, skip_signature: bool) -> Result { @@ -262,6 +276,11 @@ impl StateTransitionConvert for IdentityCreateTransition { // TODO: super.toJSON() + json.insert( + property_names::TRANSITION_TYPE.to_string(), + serde_json::Value::from(Self::get_type() as u8), + )?; + json.insert( property_names::ASSET_LOCK_PROOF.to_string(), self.asset_lock_proof.as_ref().try_into()?, diff --git a/packages/wasm-dpp/lib/test/mocks/getBlsAdapterMock.js b/packages/wasm-dpp/lib/test/mocks/getBlsAdapterMock.js new file mode 100644 index 00000000000..847264bd542 --- /dev/null +++ b/packages/wasm-dpp/lib/test/mocks/getBlsAdapterMock.js @@ -0,0 +1,36 @@ +const BlsSignatures = require('@dashevo/dpp/lib/bls/bls'); + +module.exports = async function getBlsAdapterMock() { + const bls = await BlsSignatures.getInstance(); + + const blsAdapter = { + validatePublicKey(publicKeyBuffer) { + let pk; + + try { + pk = bls.PublicKey.fromBytes(publicKeyBuffer); + } catch (e) { + return false; + } + + return Boolean(pk); + }, + sign(data, key) { + const blsKey = bls.PrivateKey.fromBytes(key, true); + const signature = blsKey.sign(data); + return Buffer.from(signature.serialize()); + }, + verifySignature(signature, data, publicKey) { + const { PublicKey, Signature: BlsSignature, AggregationInfo } = bls; + + const blsKey = PublicKey.fromBytes(publicKey); + + const aggregationInfo = AggregationInfo.fromMsg(blsKey, data); + const blsSignature = BlsSignature.fromBytesAndAggregationInfo(signature, aggregationInfo); + + return blsSignature.verify(); + }, + }; + + return blsAdapter; +}; diff --git a/packages/wasm-dpp/src/bls_adapter.rs b/packages/wasm-dpp/src/bls_adapter.rs index 62d0176ed48..5dea2afbdb4 100644 --- a/packages/wasm-dpp/src/bls_adapter.rs +++ b/packages/wasm-dpp/src/bls_adapter.rs @@ -1,6 +1,7 @@ use dpp::dashcore::anyhow::anyhow; use dpp::{BlsModule, PublicKeyValidationError}; use wasm_bindgen::prelude::*; +use wasm_bindgen::JsCast; #[wasm_bindgen] extern "C" { @@ -66,6 +67,19 @@ impl BlsModule for BlsAdapter { self.0 .sign(data, private_key) .map(|arr| arr.to_vec()) - .map_err(|_v| anyhow!("Can't sign").into()) + .map_err(|e: JsValue| { + let error = e.dyn_into::(); + + match error { + Ok(e) => { + let message: String = e + .message() + .as_string() + .unwrap_or(String::from("Unknown error, can't sign")); + anyhow!(message).into() + } + Err(_) => anyhow!("Unknown error, can't sign").into(), + } + }) } } diff --git a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs index a7a63b47cd0..e25c41f2b47 100644 --- a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs +++ b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs @@ -174,6 +174,16 @@ impl IdentityPublicKeyWasm { Ok(js_object) } + + #[wasm_bindgen(js_name=setSignature)] + pub fn set_signature(&mut self, signature: Vec) { + self.0.set_signature(signature); + } + + #[wasm_bindgen(js_name=getSignature)] + pub fn get_signature(&mut self) -> Buffer { + Buffer::from_bytes(self.0.get_signature()) + } } impl IdentityPublicKeyWasm { diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index cbd6dc94772..37570acec30 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -1,3 +1,4 @@ +use std::convert::TryInto; use std::default::Default; use serde::{Deserialize, Serialize}; @@ -18,6 +19,8 @@ use crate::{ with_js_error, }; +use crate::bls_adapter::{BlsAdapter, JsBlsAdapter}; +use crate::errors::from_dpp_err; use crate::utils::ToSerdeJSONExt; use dpp::{ identifier::Identifier, @@ -336,4 +339,26 @@ impl IdentityCreateTransitionWasm { pub fn set_execution_context(&mut self, context: &StateTransitionExecutionContextWasm) { self.0.set_execution_context(context.into()) } + + #[wasm_bindgen(js_name=signByPrivateKey)] + pub fn sign_by_private_key( + &mut self, + private_key: Vec, + key_type: u8, + bls: JsBlsAdapter, + ) -> Result<(), JsValue> { + let bls_adapter = BlsAdapter(bls); + let key_type = key_type + .try_into() + .map_err(|e: anyhow::Error| e.to_string())?; + + self.0 + .sign_by_private_key(private_key.as_slice(), key_type, &bls_adapter) + .map_err(from_dpp_err) + } + + #[wasm_bindgen(js_name=getSignature)] + pub fn get_signature(&self) -> Buffer { + Buffer::from_bytes(self.0.get_signature().as_slice()) + } } diff --git a/packages/wasm-dpp/src/identity/state_transition/mod.rs b/packages/wasm-dpp/src/identity/state_transition/mod.rs index bdcb355ae6a..1413ed30422 100644 --- a/packages/wasm-dpp/src/identity/state_transition/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/mod.rs @@ -1,5 +1,7 @@ pub use asset_lock_proof::*; pub use identity_create_transition::*; +pub use validate_public_key_signatures::*; mod asset_lock_proof; mod identity_create_transition; +mod validate_public_key_signatures; diff --git a/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs b/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs new file mode 100644 index 00000000000..f165fc42570 --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs @@ -0,0 +1,66 @@ +use crate::bls_adapter::{BlsAdapter, JsBlsAdapter}; +use crate::errors::from_dpp_err; +use crate::IdentityCreateTransitionWasm; +use crate::{ + identity::identity_public_key::IdentityPublicKeyWasm, validation::ValidationResultWasm, +}; +use dpp::document::document_transition::JsonValue; +use dpp::identity::state_transition::identity_create_transition::IdentityCreateTransition; +use dpp::identity::state_transition::validate_public_key_signatures::{ + PublicKeysSignaturesValidator, TPublicKeysSignaturesValidator, +}; +use dpp::prelude::IdentityPublicKey; +use dpp::state_transition::{StateTransitionConvert, StateTransitionType}; +use std::convert::TryInto; +use wasm_bindgen::prelude::wasm_bindgen; +use wasm_bindgen::JsValue; + +#[wasm_bindgen(js_name=validatePublicKeySignatures)] +pub fn validate_public_key_signatures( + raw_state_transition: JsValue, + raw_public_keys: Vec, + bls: JsBlsAdapter, +) -> Result { + let st_type: StateTransitionType = + (js_sys::Reflect::get(&raw_state_transition, &JsValue::from_str("type"))? + .as_f64() + .ok_or(JsValue::from_str("State transition type is not a number"))? as u8) + .try_into() + .map_err(|_| js_sys::Error::new("State transition type is not a valid value"))?; + + let bls_adapter = BlsAdapter(bls); + + let st_object = match st_type { + StateTransitionType::IdentityCreate => { + let st: IdentityCreateTransition = + IdentityCreateTransitionWasm::new(raw_state_transition)?.into(); + + st.to_object(true).map_err(|e| from_dpp_err(e.into())) + } + // TODO: + // StateTransitionType::IdentityUpdate => { + // let st: IdentityUpdateTransition = + // IdentityUpdateTransitionWasm::new(raw_state_transition)?.into(); + // st.to_json(false) + // .map_err(from_dpp_err) + // } + _ => Err(js_sys::Error::new("State transition type is not supported").into()), + }?; + + let public_keys = raw_public_keys + .into_iter() + .map(|raw_key| { + let parsed_key: IdentityPublicKey = IdentityPublicKeyWasm::new(raw_key)?.into(); + parsed_key + .to_raw_json_object(false) + .map_err(|e| from_dpp_err(e.into())) + }) + .collect::, JsValue>>()?; + + let validator = PublicKeysSignaturesValidator::new(bls_adapter); + let result = validator + .validate_public_key_signatures(&st_object, &public_keys) + .map_err(|e| from_dpp_err(e.into()))?; + + Ok(result.map(|_| JsValue::undefined()).into()) +} diff --git a/packages/wasm-dpp/src/validation/validation_result.rs b/packages/wasm-dpp/src/validation/validation_result.rs index 47d8c412fed..a6630a6c125 100644 --- a/packages/wasm-dpp/src/validation/validation_result.rs +++ b/packages/wasm-dpp/src/validation/validation_result.rs @@ -46,4 +46,13 @@ impl ValidationResultWasm { pub fn get_data(&self) -> JsValue { self.0.data().unwrap_or(&JsValue::undefined()).to_owned() } + + #[wasm_bindgen(js_name=getFirstError)] + pub fn get_first_error(&self) -> JsValue { + if self.0.errors.len() > 0 { + from_consensus_error_ref(&self.0.errors[0]) + } else { + JsValue::undefined() + } + } } diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js index e793c150aaa..03b079d0622 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js @@ -3,20 +3,39 @@ const { PrivateKey, crypto: { Hash } } = require('@dashevo/dashcore-lib'); const crypto = require('crypto'); const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); const BlsSignatures = require('@dashevo/dpp/lib/bls/bls'); -const validatePublicKeySignaturesFactory = require('@dashevo/dpp/lib/identity/stateTransition/validatePublicKeySignaturesFactory'); -const ValidationResult = require('@dashevo/dpp/lib/validation/ValidationResult'); -const { expectValidationError } = require('@dashevo/dpp/lib/test/expect/expectError'); -const InvalidIdentityKeySignatureError = require('@dashevo/dpp/lib/errors/consensus/basic/identity/InvalidIdentityKeySignatureError'); + +const { expect } = require('chai'); +const { expectValidationError } = require('../../../../lib/test/expect/expectError'); +const getBlsAdapterMock = require('../../../../lib/test/mocks/getBlsAdapterMock'); + +const { default: loadWasmDpp } = require('../../../../dist'); describe('validatePublicKeySignaturesFactory', () => { let identityCreateTransition; let rawIdentityCreateTransition; + + let IdentityCreateTransition; + let IdentityPublicKey; + let InvalidIdentityKeySignatureError; + let ValidationResult; let validatePublicKeySignatures; + let blsAdapter; + + before(async () => { + ({ + IdentityCreateTransition, + IdentityPublicKey, + InvalidIdentityKeySignatureError, + validatePublicKeySignatures, + ValidationResult, + } = await loadWasmDpp()); + }); - beforeEach(async function beforeEach() { - identityCreateTransition = getIdentityCreateTransitionFixture(); + beforeEach(async () => { + identityCreateTransition = new IdentityCreateTransition( + getIdentityCreateTransitionFixture().toObject(), + ); const privateKey1 = new PrivateKey(); const publicKey1 = privateKey1.toPublicKey(); @@ -42,11 +61,13 @@ describe('validatePublicKeySignaturesFactory', () => { readOnly: false, }); - const { PrivateKey: BlsPrivateKey } = await BlsSignatures.getInstance(); + const blsModule = await BlsSignatures.getInstance(); + blsAdapter = await getBlsAdapterMock(); + + const { PrivateKey: BlsPrivateKey } = blsModule; const randomBytes = new Uint8Array(crypto.randomBytes(256)); const privateKey3 = BlsPrivateKey.fromBytes(randomBytes, true); - // blsPrivateKeyHex = Buffer.from(blsPrivateKey.serialize()).toString('hex'); const publicKey3 = privateKey3.getPublicKey(); const identityPublicKey3 = new IdentityPublicKey({ @@ -65,14 +86,14 @@ describe('validatePublicKeySignaturesFactory', () => { ]); await identityCreateTransition.signByPrivateKey( - privateKey1, + privateKey1.toBuffer(), IdentityPublicKey.TYPES.ECDSA_SECP256K1, ); const signature1 = identityCreateTransition.getSignature(); await identityCreateTransition.signByPrivateKey( - privateKey2, + privateKey2.toBuffer(), IdentityPublicKey.TYPES.ECDSA_HASH160, ); @@ -81,6 +102,7 @@ describe('validatePublicKeySignaturesFactory', () => { await identityCreateTransition.signByPrivateKey( Buffer.from(privateKey3.serialize()), IdentityPublicKey.TYPES.BLS12_381, + blsAdapter, ); const signature3 = identityCreateTransition.getSignature(); @@ -89,25 +111,27 @@ describe('validatePublicKeySignaturesFactory', () => { identityPublicKey2.setSignature(signature2); identityPublicKey3.setSignature(signature3); - rawIdentityCreateTransition = identityCreateTransition.toObject(); - - const createStateTransitionMock = this.sinonSandbox.stub().resolves(identityCreateTransition); + identityCreateTransition.setPublicKeys([ + identityPublicKey1, + identityPublicKey2, + identityPublicKey3, + ]); - validatePublicKeySignatures = validatePublicKeySignaturesFactory(createStateTransitionMock); + rawIdentityCreateTransition = identityCreateTransition.toObject(); }); it('should return InvalidIdentityKeySignatureError if signature is not valid', async () => { - const rawPublicKey2 = rawIdentityCreateTransition.publicKeys[1]; + const keys = identityCreateTransition.getPublicKeys().map((key) => key.toObject()); + const rawPublicKey2 = keys[1]; rawPublicKey2.signature = crypto.randomBytes(65); const result = await validatePublicKeySignatures( rawIdentityCreateTransition, - rawIdentityCreateTransition.publicKeys, - identityCreateTransition.getExecutionContext(), + keys, ); - expectValidationError(result, InvalidIdentityKeySignatureError); + await expectValidationError(result, InvalidIdentityKeySignatureError); const error = result.getFirstError(); @@ -115,10 +139,12 @@ describe('validatePublicKeySignaturesFactory', () => { }); it('should return valid result', async () => { + const keys = identityCreateTransition.getPublicKeys().map((key) => key.toObject()); + const result = await validatePublicKeySignatures( rawIdentityCreateTransition, - rawIdentityCreateTransition.publicKeys, - identityCreateTransition.getExecutionContext(), + keys, + blsAdapter, ); expect(result).to.be.instanceOf(ValidationResult); From 4cfac787280f7965116f767e3854a833421ac269 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 13 Jan 2023 18:48:58 +0000 Subject: [PATCH 44/66] feat(wasm-dpp): implement validateIdentityCreateTransitionBasicFactory.spec.js --- packages/wasm-dpp/src/bls_adapter.rs | 1 + .../asset_lock_proof/chain/validation.rs | 3 +- .../asset_lock_proof/instant/validation.rs | 3 +- .../identity_create_transition/validation.rs | 99 +++++- .../validate_public_key_signatures.rs | 1 + packages/wasm-dpp/src/utils.rs | 2 +- ...entityCreateTransitionBasicFactory.spec.js | 292 ++++++++---------- 7 files changed, 238 insertions(+), 163 deletions(-) diff --git a/packages/wasm-dpp/src/bls_adapter.rs b/packages/wasm-dpp/src/bls_adapter.rs index 5dea2afbdb4..60c25ecdf16 100644 --- a/packages/wasm-dpp/src/bls_adapter.rs +++ b/packages/wasm-dpp/src/bls_adapter.rs @@ -5,6 +5,7 @@ use wasm_bindgen::JsCast; #[wasm_bindgen] extern "C" { + #[derive(Clone)] pub type JsBlsAdapter; #[wasm_bindgen(method)] diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs index 52fcfd754db..878f37a8fa0 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs @@ -19,7 +19,8 @@ use crate::{ #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] -struct RawChainAssetLockProof { +pub struct RawChainAssetLockProof { + // TODO: consider using to_serde_json_value() instead of this struct #[serde(rename = "type")] lock_type: Option, core_chain_locked_height: Option, diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs index 6ce997f207b..0faba37d922 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs @@ -19,7 +19,8 @@ use crate::{ #[skip_serializing_none] #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] -struct RawInstantAssetLockProof { +pub struct RawInstantAssetLockProof { + // TODO: consider using to_serde_json_value() instead of this struct #[serde(rename = "type")] lock_type: Option, instant_lock: Option>, diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs index 74c945deda8..c59fb316a34 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs @@ -1,11 +1,28 @@ +use dpp::identity::state_transition::asset_lock_proof::{ + AssetLockProofValidator, AssetLockTransactionValidator, ChainAssetLockProofStructureValidator, + InstantAssetLockProofStructureValidator, +}; +use dpp::identity::state_transition::identity_create_transition::validation::basic::IdentityCreateTransitionBasicValidator; use dpp::identity::state_transition::identity_create_transition::validation::state::validate_identity_create_transition_state; +use dpp::identity::state_transition::validate_public_key_signatures::PublicKeysSignaturesValidator; +use dpp::identity::validation::{ + PublicKeysValidator, RequiredPurposeAndSecurityLevelValidator, PUBLIC_KEY_SCHEMA_FOR_TRANSITION, +}; +use dpp::state_transition::state_transition_execution_context::StateTransitionExecutionContext; + +use dpp::version::{ProtocolVersionValidator, COMPATIBILITY_MAP, LATEST_VERSION}; +use dpp::ProtocolError; + +use std::sync::Arc; use wasm_bindgen::prelude::*; +use crate::bls_adapter::{BlsAdapter, JsBlsAdapter}; +use crate::errors::from_dpp_err; +use crate::utils::ToSerdeJSONExt; use crate::{ - errors::from_dpp_err, state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, validation::ValidationResultWasm, - IdentityCreateTransitionWasm, + IdentityCreateTransitionWasm, StateTransitionExecutionContextWasm, }; #[wasm_bindgen(js_name=validateIdentityCreateTransitionState)] @@ -23,3 +40,81 @@ pub async fn validate_identity_create_transition_state_wasm( Ok(validation_result.map(|_| JsValue::undefined()).into()) } + +#[wasm_bindgen(js_name=validateIdentityCreateTransitionBasic)] +pub async fn validate_identity_create_transition_basic_wasm( + state_repository: ExternalStateRepositoryLike, + raw_state_transition: JsValue, + js_bls: JsBlsAdapter, + execution_context: &StateTransitionExecutionContextWasm, +) -> Result { + let execution_context: &StateTransitionExecutionContext = execution_context.into(); + + let state_repository_wrapper = + Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository)); + + let current_protocol_version = + js_sys::Reflect::get(&raw_state_transition, &"protocolVersion".into()) + .map(|v| v.as_f64().unwrap_or(LATEST_VERSION as f64) as u32) + .unwrap_or(LATEST_VERSION); + + let state_transition_json = raw_state_transition.to_serde_json_value()?; + + let protocol_version_validator = ProtocolVersionValidator::new( + current_protocol_version, + LATEST_VERSION, + COMPATIBILITY_MAP.clone(), + ); + + let public_keys_validator = PublicKeysValidator::new_with_schema( + PUBLIC_KEY_SCHEMA_FOR_TRANSITION.clone(), + BlsAdapter(js_bls.clone()), + ) + .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; + + let public_keys_transition_validator = RequiredPurposeAndSecurityLevelValidator::default(); + + let asset_lock_proof_validator: AssetLockProofValidator; + { + let tx_validator = Arc::new(AssetLockTransactionValidator::new( + state_repository_wrapper.clone(), + )); + + let instant_asset_lock_proof_validator = InstantAssetLockProofStructureValidator::new( + state_repository_wrapper.clone(), + tx_validator.clone(), + ) + .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; + + let chain_asset_lock_proof_validator = ChainAssetLockProofStructureValidator::new( + state_repository_wrapper.clone(), + tx_validator.clone(), + ) + .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; + + asset_lock_proof_validator = AssetLockProofValidator::new( + instant_asset_lock_proof_validator, + chain_asset_lock_proof_validator, + ); + } + + let public_keys_signature_validator = + PublicKeysSignaturesValidator::new(BlsAdapter(js_bls.clone())); + + let validator = IdentityCreateTransitionBasicValidator::new( + Arc::new(protocol_version_validator), + Arc::new(public_keys_validator), + Arc::new(public_keys_transition_validator), + Arc::new(asset_lock_proof_validator), + BlsAdapter(js_bls.clone()), + public_keys_signature_validator, + ) + .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; + + let validation_result = validator + .validate(&state_transition_json, execution_context) + .await + .map_err(|e| from_dpp_err(e.into()))?; + + Ok(validation_result.map(|_| JsValue::undefined()).into()) +} diff --git a/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs b/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs index f165fc42570..3e4124f8f25 100644 --- a/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs +++ b/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs @@ -21,6 +21,7 @@ pub fn validate_public_key_signatures( raw_public_keys: Vec, bls: JsBlsAdapter, ) -> Result { + // TODO: use to_serde_json_value? let st_type: StateTransitionType = (js_sys::Reflect::get(&raw_state_transition, &JsValue::from_str("type"))? .as_f64() diff --git a/packages/wasm-dpp/src/utils.rs b/packages/wasm-dpp/src/utils.rs index 66f10f527ce..c43811bb5fb 100644 --- a/packages/wasm-dpp/src/utils.rs +++ b/packages/wasm-dpp/src/utils.rs @@ -82,7 +82,7 @@ where pub fn stringify(data: &JsValue) -> Result { let replacer_func = Function::new_with_args( "key, value", - "return value.type=='Buffer' ? value.data : value ", + "return value && value.type=='Buffer' ? value.data : value ", ); let data_string: String = diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js index b9b784c0c57..85b278de633 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js @@ -1,85 +1,94 @@ -const { getRE2Class } = require('@dashevo/wasm-re2'); - -const createAjv = require('@dashevo/dpp/lib/ajv/createAjv'); - -const JsonSchemaValidator = require('@dashevo/dpp/lib/validation/JsonSchemaValidator'); +const { PrivateKey } = require('@dashevo/dashcore-lib'); const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); -const validateIdentityCreateTransitionBasicFactory = require( - '@dashevo/dpp/lib/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory', -); - -const { - expectJsonSchemaError, - expectValidationError, -} = require('@dashevo/dpp/lib/test/expect/expectError'); - -const ValidationResult = require('@dashevo/dpp/lib/validation/ValidationResult'); -const InstantAssetLockProof = require('@dashevo/dpp/lib/identity/stateTransition/assetLockProof/instant/InstantAssetLockProof'); -const ChainAssetLockProof = require('@dashevo/dpp/lib/identity/stateTransition/assetLockProof/chain/ChainAssetLockProof'); -const SomeConsensusError = require('@dashevo/dpp/lib/test/mocks/SomeConsensusError'); -const IdentityPublicKey = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); -const StateTransitionExecutionContext = require('@dashevo/dpp/lib/stateTransition/StateTransitionExecutionContext'); +const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); +const { expectValidationError, expectJsonSchemaError } = require('../../../../../../../lib/test/expect/expectError'); +const { default: loadWasmDpp } = require('../../../../../../../dist'); +const getBlsAdapterMock = require('../../../../../../../lib/test/mocks/getBlsAdapterMock'); describe('validateIdentityCreateTransitionBasicFactory', () => { - let validateIdentityCreateTransitionBasic; let rawStateTransition; let stateTransition; - let validatePublicKeysMock; - let validatePublicKeysInIdentityCreateTransition; - let assetLockPublicKeyHash; - let proofValidationFunctionsByTypeMock; - let validateProtocolVersionMock; - let validatePublicKeySignaturesMock; - beforeEach(async function beforeEach() { - validatePublicKeysMock = this.sinonSandbox.stub() - .returns(new ValidationResult()); + let stateRepositoryMock; + let mockIdentityPublicKey; - validatePublicKeysInIdentityCreateTransition = this.sinonSandbox.stub() - .returns(new ValidationResult()); + let validateIdentityCreateTransitionBasic; - assetLockPublicKeyHash = Buffer.alloc(20, 1); + let StateTransitionExecutionContext; + let IdentityCreateTransition; + let IdentityPublicKey; + let UnsupportedProtocolVersionError; + let InvalidInstantAssetLockProofSignatureError; + let InvalidIdentityPublicKeySecurityLevelError; + let InvalidIdentityPublicKeyDataError; + let InvalidIdentityKeySignatureError; + let validateIdentityCreateTransitionBasicDPP; + + before(async () => { + ({ + validateIdentityCreateTransitionBasic: validateIdentityCreateTransitionBasicDPP, + IdentityCreateTransition, + StateTransitionExecutionContext, + UnsupportedProtocolVersionError, + InvalidInstantAssetLockProofSignatureError, + InvalidIdentityPublicKeySecurityLevelError, + InvalidIdentityPublicKeyDataError, + InvalidIdentityKeySignatureError, + IdentityPublicKey, + } = await loadWasmDpp()); + + mockIdentityPublicKey = (publicKey, opts = {}) => new IdentityPublicKey({ + id: 0, + type: IdentityPublicKey.TYPES.ECDSA_SECP256K1, + data: publicKey, + purpose: IdentityPublicKey.PURPOSES.AUTHENTICATION, + securityLevel: IdentityPublicKey.SECURITY_LEVELS.MASTER, + readOnly: false, + ...opts, + }); + }); - const assetLockValidationResult = new ValidationResult(); + beforeEach(async function () { + stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); + stateRepositoryMock.verifyInstantLock.returns(true); - assetLockValidationResult.setData(assetLockPublicKeyHash); + const executionContext = new StateTransitionExecutionContext(); - const RE2 = await getRE2Class(); - const ajv = createAjv(RE2); + const blsAdapter = await getBlsAdapterMock(); - const jsonSchemaValidator = new JsonSchemaValidator(ajv); + validateIdentityCreateTransitionBasic = (st) => validateIdentityCreateTransitionBasicDPP( + stateRepositoryMock, + st, + blsAdapter, + executionContext, + ); - const proofValidationResult = new ValidationResult(); - proofValidationResult.setData(assetLockPublicKeyHash); + const stateTransitionJS = getIdentityCreateTransitionFixture(); + stateTransition = new IdentityCreateTransition(stateTransitionJS.toObject()); - proofValidationFunctionsByTypeMock = { - [InstantAssetLockProof.type]: this.sinonSandbox.stub().resolves(proofValidationResult), - [ChainAssetLockProof.type]: this.sinonSandbox.stub().resolves(proofValidationResult), - }; + const privateKey = new PrivateKey(); + const publicKey = privateKey.toPublicKey(); - validateProtocolVersionMock = this.sinonSandbox.stub().returns(new ValidationResult()); + const identityPublicKey = mockIdentityPublicKey(publicKey.toBuffer()); - validatePublicKeySignaturesMock = this.sinonSandbox.stub() - .returns(new ValidationResult()); + stateTransition.setPublicKeys([identityPublicKey]); - validateIdentityCreateTransitionBasic = validateIdentityCreateTransitionBasicFactory( - jsonSchemaValidator, - validatePublicKeysMock, - validatePublicKeysInIdentityCreateTransition, - proofValidationFunctionsByTypeMock, - validateProtocolVersionMock, - validatePublicKeySignaturesMock, + await stateTransition.signByPrivateKey( + privateKey.toBuffer(), + identityPublicKey.type, ); - stateTransition = getIdentityCreateTransitionFixture(); + const signature = stateTransition.getSignature(); + identityPublicKey.setSignature(signature); - const privateKey = '9b67f852093bc61cea0eeca38599dbfba0de28574d2ed9b99d10d33dc1bde7b2'; - - await stateTransition.signByPrivateKey(privateKey, IdentityPublicKey.TYPES.ECDSA_SECP256K1); + stateTransition.setPublicKeys([identityPublicKey]); rawStateTransition = stateTransition.toObject(); + + // TODO: must not be present? + delete rawStateTransition.identityId; }); describe('protocolVersion', () => { @@ -88,7 +97,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const result = await validateIdentityCreateTransitionBasic(rawStateTransition); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -102,7 +111,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const result = await validateIdentityCreateTransitionBasic(rawStateTransition); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -111,26 +120,11 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { }); it('should be valid', async () => { - rawStateTransition.protocolVersion = -1; - - const protocolVersionError = new SomeConsensusError('test'); - const protocolVersionResult = new ValidationResult([ - protocolVersionError, - ]); - - validateProtocolVersionMock.returns(protocolVersionResult); + rawStateTransition.protocolVersion = 1000; const result = await validateIdentityCreateTransitionBasic(rawStateTransition); - expectValidationError(result, SomeConsensusError); - - const [error] = result.getErrors(); - - expect(error).to.equal(protocolVersionError); - - expect(validateProtocolVersionMock).to.be.calledOnceWith( - rawStateTransition.protocolVersion, - ); + await expectValidationError(result, UnsupportedProtocolVersionError); }); }); @@ -140,7 +134,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const result = await validateIdentityCreateTransitionBasic(rawStateTransition); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -154,7 +148,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const result = await validateIdentityCreateTransitionBasic(rawStateTransition); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -172,7 +166,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { rawStateTransition, ); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -186,7 +180,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const result = await validateIdentityCreateTransitionBasic(rawStateTransition); - expectJsonSchemaError(result, 1); + await expectJsonSchemaError(result, 1); const [error] = result.getErrors(); @@ -195,31 +189,15 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { }); it('should be valid', async () => { - const assetLockError = new SomeConsensusError('test'); - const assetLockResult = new ValidationResult([ - assetLockError, - ]); + stateRepositoryMock.verifyInstantLock.returns(false); - const executionContext = new StateTransitionExecutionContext(); - - proofValidationFunctionsByTypeMock[InstantAssetLockProof.type].resolves(assetLockResult); - - const result = await validateIdentityCreateTransitionBasic( - rawStateTransition, - executionContext, - ); + const result = await validateIdentityCreateTransitionBasic(rawStateTransition); - expectValidationError(result); + await expectValidationError(result); const [error] = result.getErrors(); - expect(error).to.equal(assetLockError); - - expect(proofValidationFunctionsByTypeMock[InstantAssetLockProof.type]) - .to.be.calledOnceWithExactly( - rawStateTransition.assetLockProof, - executionContext, - ); + expect(error).to.be.instanceOf(InvalidInstantAssetLockProofSignatureError); }); }); @@ -231,7 +209,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { rawStateTransition, ); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -247,7 +225,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { rawStateTransition, ); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -259,14 +237,14 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const [key] = rawStateTransition.publicKeys; for (let i = 0; i < 10; i++) { - rawStateTransition.publicKeys.push(key); + rawStateTransition.publicKeys.push({ ...key, id: i + 1 }); } const result = await validateIdentityCreateTransitionBasic( rawStateTransition, ); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -281,7 +259,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { rawStateTransition, ); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -290,66 +268,66 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { }); it('should be valid', async () => { - const publicKeysError = new SomeConsensusError('test'); - const publicKeysResult = new ValidationResult([ - publicKeysError, - ]); + const privateKey = new PrivateKey(); - validatePublicKeysMock.returns(publicKeysResult); + // Mess up public key + const identityPublicKey = mockIdentityPublicKey(Buffer.alloc(33)); - const result = await validateIdentityCreateTransitionBasic( - rawStateTransition, + stateTransition.setPublicKeys([identityPublicKey]); + await stateTransition.signByPrivateKey( + privateKey.toBuffer(), + identityPublicKey.type, ); + identityPublicKey.setSignature(stateTransition.getSignature()); + stateTransition.setPublicKeys([identityPublicKey]); - expectValidationError(result); + rawStateTransition = stateTransition.toObject(); + // TODO: remove identity Id? + delete rawStateTransition.identityId; - const [error] = result.getErrors(); - - expect(error).to.equal(publicKeysError); + const result = await validateIdentityCreateTransitionBasic( + rawStateTransition, + ); - expect(validatePublicKeysMock) - .to.be.calledOnceWithExactly(rawStateTransition.publicKeys); + await expectValidationError(result, InvalidIdentityPublicKeyDataError); }); it('should have at least 1 master key', async () => { - const publicKeysError = new SomeConsensusError('test'); - const publicKeysResult = new ValidationResult([ - publicKeysError, - ]); + const privateKey = new PrivateKey(); - validatePublicKeysInIdentityCreateTransition.returns(publicKeysResult); + // Mess up public key's purpose + const identityPublicKey = mockIdentityPublicKey(privateKey.toPublicKey().toBuffer()); + identityPublicKey.setPurpose(2); - const result = await validateIdentityCreateTransitionBasic( - rawStateTransition, + stateTransition.setPublicKeys([identityPublicKey]); + await stateTransition.signByPrivateKey( + privateKey.toBuffer(), + identityPublicKey.type, ); + identityPublicKey.setSignature(stateTransition.getSignature()); + stateTransition.setPublicKeys([identityPublicKey]); - expectValidationError(result); - - const [error] = result.getErrors(); + rawStateTransition = stateTransition.toObject(); + // TODO: remove identity Id? + delete rawStateTransition.identityId; - expect(error).to.equal(publicKeysError); + const result = await validateIdentityCreateTransitionBasic( + rawStateTransition, + ); - expect(validatePublicKeysInIdentityCreateTransition) - .to.be.calledOnceWithExactly(rawStateTransition.publicKeys); + await expectValidationError(result, InvalidIdentityPublicKeySecurityLevelError); }); it('should have valid signatures', async () => { - const publicKeysError = new SomeConsensusError('test'); - const publicKeysResult = new ValidationResult([ - publicKeysError, - ]); - - validatePublicKeySignaturesMock.resolves(publicKeysResult); + const invalidSignature = Buffer.alloc(65); + rawStateTransition.signature = invalidSignature; + rawStateTransition.publicKeys[0].signature = invalidSignature; const result = await validateIdentityCreateTransitionBasic( rawStateTransition, ); - expectValidationError(result); - - const [error] = result.getErrors(); - - expect(error).to.equal(publicKeysError); + await expectValidationError(result, InvalidIdentityKeySignatureError); }); }); @@ -359,11 +337,11 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const result = await validateIdentityCreateTransitionBasic(rawStateTransition); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); - expect(error.instancePath).to.equal(''); + expect(error.getInstancePath()).to.equal(''); expect(error.getKeyword()).to.equal('required'); expect(error.getParams().missingProperty).to.equal('signature'); }); @@ -373,14 +351,16 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const result = await validateIdentityCreateTransitionBasic(rawStateTransition); - expectJsonSchemaError(result, 2); + await expectJsonSchemaError(result, 65); - const [error, byteArrayError] = result.getErrors(); + const firstError = result.getErrors()[0]; + const lastError = result.getErrors()[64]; - expect(error.instancePath).to.equal('/signature/0'); - expect(error.getKeyword()).to.equal('type'); + expect(firstError.getInstancePath()).to.equal('/signature/0'); + expect(firstError.getKeyword()).to.equal('type'); - expect(byteArrayError.getKeyword()).to.equal('byteArray'); + expect(lastError.getInstancePath()).to.equal('/signature/64'); + expect(lastError.getKeyword()).to.equal('type'); }); it('should be not shorter than 65 bytes', async () => { @@ -388,11 +368,11 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const result = await validateIdentityCreateTransitionBasic(rawStateTransition); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); - expect(error.instancePath).to.equal('/signature'); + expect(error.getInstancePath()).to.equal('/signature'); expect(error.getKeyword()).to.equal('minItems'); }); @@ -401,11 +381,11 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const result = await validateIdentityCreateTransitionBasic(rawStateTransition); - expectJsonSchemaError(result); + await expectJsonSchemaError(result); const [error] = result.getErrors(); - expect(error.instancePath).to.equal('/signature'); + expect(error.getInstancePath()).to.equal('/signature'); expect(error.getKeyword()).to.equal('maxItems'); }); }); @@ -414,9 +394,5 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const result = await validateIdentityCreateTransitionBasic(rawStateTransition); expect(result.isValid()).to.be.true(); - - expect(validatePublicKeysMock).to.be.calledOnceWithExactly( - rawStateTransition.publicKeys, - ); }); }); From e43228eb7f188f8c0f6c58dc52880ec47094970a Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Sun, 15 Jan 2023 15:04:26 +0000 Subject: [PATCH 45/66] fix: inconsistencies after rebase --- .../reward_share_data_triggers/mod.rs | 2 +- packages/rs-dpp/src/errors/errors.rs | 5 ----- .../identity_create_transition.rs | 22 ++++++++++--------- .../asset_lock_proof/chain/validation.rs | 4 ++-- .../asset_lock_proof/instant/validation.rs | 4 ++-- .../identity_create_transition.rs | 4 ++-- .../identity_create_transition/validation.rs | 2 +- .../validate_public_key_signatures.rs | 4 ++-- 8 files changed, 22 insertions(+), 25 deletions(-) diff --git a/packages/rs-dpp/src/data_trigger/reward_share_data_triggers/mod.rs b/packages/rs-dpp/src/data_trigger/reward_share_data_triggers/mod.rs index dcac84a4650..35ceca53453 100644 --- a/packages/rs-dpp/src/data_trigger/reward_share_data_triggers/mod.rs +++ b/packages/rs-dpp/src/data_trigger/reward_share_data_triggers/mod.rs @@ -69,7 +69,7 @@ where } // payToId identity exists - let pay_to_identifier = Identifier::from_string(pay_to_id, Encoding::Base58)?; + let pay_to_identifier = Identifier::from_bytes(&pay_to_id_bytes)?; let maybe_identity = context .state_repository .fetch_identity( diff --git a/packages/rs-dpp/src/errors/errors.rs b/packages/rs-dpp/src/errors/errors.rs index 5f148927a35..9402bc3edb5 100644 --- a/packages/rs-dpp/src/errors/errors.rs +++ b/packages/rs-dpp/src/errors/errors.rs @@ -107,11 +107,6 @@ pub enum ProtocolError { #[error("Public key is disabled")] PublicKeyIsDisabledError { public_key: IdentityPublicKey }, - #[error("Document was not provided for apply of state transition")] - DocumentNotProvided { - document_transition: DocumentTransition, - }, - #[error("Identity is not present")] IdentityNotPresentError { id: Identifier }, } diff --git a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index 82de093ee14..4f98a5ff516 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -250,25 +250,27 @@ impl StateTransitionConvert for IdentityCreateTransition { } fn to_object(&self, skip_signature: bool) -> Result { - // The [state_transition_helpers::to_object] doesn't convert the `public_keys` property. - // The property must be serialized manually + let mut json_value: JsonValue = serde_json::to_value(self)?; + + if skip_signature { + if let JsonValue::Object(ref mut o) = json_value { + for path in Self::signature_property_paths() { + o.remove(path); + } + } + } + let mut public_keys: Vec = vec![]; for key in self.public_keys.iter() { public_keys.push(key.to_raw_json_object(skip_signature)?); } - let mut raw_object: JsonValue = state_transition_helpers::to_object( - self, - Self::signature_property_paths(), - Self::identifiers_property_paths(), - skip_signature, - )?; - raw_object.insert( + json_value.insert( property_names::PUBLIC_KEYS.to_owned(), JsonValue::Array(public_keys), )?; - Ok(raw_object) + Ok(json_value) } fn to_json(&self, skip_signature: bool) -> Result { diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs index 878f37a8fa0..16186193099 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs @@ -10,7 +10,7 @@ use wasm_bindgen::prelude::*; use crate::buffer::Buffer; use crate::{ - errors::{from_dpp_err, RustConversionError}, + errors::from_dpp_err, state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, validation::ValidationResultWasm, with_js_error, StateTransitionExecutionContextWasm, @@ -20,7 +20,7 @@ use crate::{ #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RawChainAssetLockProof { - // TODO: consider using to_serde_json_value() instead of this struct + // TODO: consider using with_serde_to_json_value() instead of this struct #[serde(rename = "type")] lock_type: Option, core_chain_locked_height: Option, diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs index 0faba37d922..21979ffa95b 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs @@ -10,7 +10,7 @@ use wasm_bindgen::prelude::*; use crate::buffer::Buffer; use crate::{ - errors::{from_dpp_err, RustConversionError}, + errors::from_dpp_err, state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, validation::ValidationResultWasm, with_js_error, StateTransitionExecutionContextWasm, @@ -20,7 +20,7 @@ use crate::{ #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RawInstantAssetLockProof { - // TODO: consider using to_serde_json_value() instead of this struct + // TODO: consider using with_serde_to_json_value() instead of this struct #[serde(rename = "type")] lock_type: Option, instant_lock: Option>, diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index 37570acec30..3c799861d6c 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -121,7 +121,7 @@ impl IdentityCreateTransitionWasm { let public_keys = public_keys .to_vec() .into_iter() - .map(|key| key.to_serde_json_value().unwrap()) + .map(|key| key.with_serde_to_json_value().unwrap()) .map(|key_json| IdentityPublicKey::from_json_object(key_json).unwrap()) .collect::>(); @@ -136,7 +136,7 @@ impl IdentityCreateTransitionWasm { let mut public_keys = public_keys .to_vec() .into_iter() - .map(|key| key.to_serde_json_value().unwrap()) + .map(|key| key.with_serde_to_json_value().unwrap()) .map(|key_json| IdentityPublicKey::from_json_object(key_json).unwrap()) .collect::>(); diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs index c59fb316a34..c7b144e5662 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs @@ -58,7 +58,7 @@ pub async fn validate_identity_create_transition_basic_wasm( .map(|v| v.as_f64().unwrap_or(LATEST_VERSION as f64) as u32) .unwrap_or(LATEST_VERSION); - let state_transition_json = raw_state_transition.to_serde_json_value()?; + let state_transition_json = raw_state_transition.with_serde_to_json_value()?; let protocol_version_validator = ProtocolVersionValidator::new( current_protocol_version, diff --git a/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs b/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs index 3e4124f8f25..aa1902653e5 100644 --- a/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs +++ b/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs @@ -4,13 +4,13 @@ use crate::IdentityCreateTransitionWasm; use crate::{ identity::identity_public_key::IdentityPublicKeyWasm, validation::ValidationResultWasm, }; -use dpp::document::document_transition::JsonValue; use dpp::identity::state_transition::identity_create_transition::IdentityCreateTransition; use dpp::identity::state_transition::validate_public_key_signatures::{ PublicKeysSignaturesValidator, TPublicKeysSignaturesValidator, }; use dpp::prelude::IdentityPublicKey; use dpp::state_transition::{StateTransitionConvert, StateTransitionType}; +use serde_json::Value as JsonValue; use std::convert::TryInto; use wasm_bindgen::prelude::wasm_bindgen; use wasm_bindgen::JsValue; @@ -21,7 +21,7 @@ pub fn validate_public_key_signatures( raw_public_keys: Vec, bls: JsBlsAdapter, ) -> Result { - // TODO: use to_serde_json_value? + // TODO: use with_serde_to_json_value? let st_type: StateTransitionType = (js_sys::Reflect::get(&raw_state_transition, &JsValue::from_str("type"))? .as_f64() From a691b7f31cae9d890eebbbeef1b0d5c10d2cab29 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Sun, 15 Jan 2023 15:53:33 +0000 Subject: [PATCH 46/66] refactor: use expectError from wasm-dpp --- .../js-dpp/lib/test/expect/expectError.js | 10 ++---- ...hainAssetLockProofStructureFactory.spec.js | 31 ++++++++--------- ...tantAssetLockProofStructureFactory.spec.js | 33 ++++++++----------- ...entityCreateTransitionStateFactory.spec.js | 7 ++-- 4 files changed, 30 insertions(+), 51 deletions(-) diff --git a/packages/js-dpp/lib/test/expect/expectError.js b/packages/js-dpp/lib/test/expect/expectError.js index 9b7ccfd6687..b8ad446b1d5 100644 --- a/packages/js-dpp/lib/test/expect/expectError.js +++ b/packages/js-dpp/lib/test/expect/expectError.js @@ -9,15 +9,9 @@ const expectError = { * @param {ValidationResult} result * @param {AbstractConsensusError} [errorClass] * @param {number} [count] - * @param [validationResultClass] */ - expectValidationError( - result, - errorClass = AbstractConsensusError, - count = 1, - validationResultClass = ValidationResult, - ) { - expect(result).to.be.an.instanceOf(validationResultClass); + expectValidationError(result, errorClass = AbstractConsensusError, count = 1) { + expect(result).to.be.an.instanceOf(ValidationResult); expect(result.getErrors()).to.have.lengthOf(count); result.getErrors().forEach((error) => expect(error).to.be.an.instanceOf(errorClass)); diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js index d52cf95043f..bb28f07023e 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js @@ -3,11 +3,8 @@ const { Transaction, Script, PrivateKey } = require('@dashevo/dashcore-lib'); const getChainAssetLockFixture = require('@dashevo/dpp/lib/test/fixtures/getChainAssetLockProofFixture'); const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); -const { expectValidationError } = require( - '@dashevo/dpp/lib/test/expect/expectError', -); - const { expect } = require('chai'); +const { expectJsonSchemaError, expectValidationError } = require('../../../../../../lib/test/expect/expectError'); const { default: loadWasmDpp } = require('../../../../../../dist'); @@ -78,7 +75,7 @@ describe('validateChainAssetLockProofStructureFactory', () => { executionContext, ); - expectValidationError(result, JsonSchemaError, 1, ValidationResult); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -114,7 +111,7 @@ describe('validateChainAssetLockProofStructureFactory', () => { executionContext, ); - expectValidationError(result, JsonSchemaError, 1, ValidationResult); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -161,7 +158,7 @@ describe('validateChainAssetLockProofStructureFactory', () => { executionContext, ); - expectValidationError(result, JsonSchemaError, 1, ValidationResult); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -194,7 +191,7 @@ describe('validateChainAssetLockProofStructureFactory', () => { executionContext, ); - expectValidationError(result, InvalidAssetLockProofCoreChainHeightError, 1, ValidationResult); + await expectValidationError(result, InvalidAssetLockProofCoreChainHeightError, 1); const [error] = result.getErrors(); @@ -214,7 +211,7 @@ describe('validateChainAssetLockProofStructureFactory', () => { executionContext, ); - expectValidationError(result, JsonSchemaError, 1, ValidationResult); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -248,7 +245,7 @@ describe('validateChainAssetLockProofStructureFactory', () => { executionContext, ); - expectValidationError(result, JsonSchemaError, 1, ValidationResult); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -268,7 +265,7 @@ describe('validateChainAssetLockProofStructureFactory', () => { executionContext, ); - expectValidationError(result, JsonSchemaError, 1, ValidationResult); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -288,8 +285,8 @@ describe('validateChainAssetLockProofStructureFactory', () => { executionContext, ); - expectValidationError(result, - IdentityAssetLockTransactionIsNotFoundError, 1, ValidationResult); + await expectValidationError(result, + IdentityAssetLockTransactionIsNotFoundError); const [error] = result.getErrors(); @@ -321,11 +318,9 @@ describe('validateChainAssetLockProofStructureFactory', () => { executionContext, ); - expectValidationError( + await expectValidationError( result, InvalidIdentityAssetLockTransactionOutputError, - 1, - ValidationResult, ); }); @@ -339,8 +334,8 @@ describe('validateChainAssetLockProofStructureFactory', () => { executionContext, ); - expectValidationError( - result, InvalidAssetLockProofTransactionHeightError, 1, ValidationResult, + await expectValidationError( + result, InvalidAssetLockProofTransactionHeightError, ); const [error] = result.getErrors(); diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js index 9ac4eb173de..784cf7c064c 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js @@ -3,11 +3,8 @@ const DashCoreLib = require('@dashevo/dashcore-lib'); const getInstantAssetLockFixture = require('@dashevo/dpp/lib/test/fixtures/getInstantAssetLockProofFixture'); const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); -const { expectValidationError } = require( - '@dashevo/dpp/lib/test/expect/expectError', -); - const { expect } = require('chai'); +const { expectJsonSchemaError, expectValidationError } = require('../../../../../../lib/test/expect/expectError'); const { default: loadWasmDpp } = require('../../../../../../dist'); @@ -65,7 +62,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { const result = await validateInstantAssetLockProofStructure(rawProof); - expectValidationError(result, JsonSchemaError, 1, ValidationResult); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -92,7 +89,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { const result = await validateInstantAssetLockProofStructure(rawProof); - expectValidationError(result, JsonSchemaError, 1, ValidationResult); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -117,7 +114,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { const result = await validateInstantAssetLockProofStructure(rawProof); - expectValidationError(result, JsonSchemaError, 1, ValidationResult); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -132,7 +129,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { const result = await validateInstantAssetLockProofStructure(rawProof); - expectValidationError(result, JsonSchemaError, 1, ValidationResult); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -146,7 +143,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { rawProof.instantLock = Buffer.alloc(200); const result = await validateInstantAssetLockProofStructure(rawProof); - expectValidationError(result, InvalidInstantAssetLockProofError, 1, ValidationResult); + await expectValidationError(result, InvalidInstantAssetLockProofError); const [error] = result.getErrors(); @@ -164,11 +161,9 @@ describe('validateInstantAssetLockProofStructureFactory', () => { const result = await validateInstantAssetLockProofStructure(rawProof); - expectValidationError( + await expectValidationError( result, IdentityAssetLockProofLockedTransactionMismatchError, - 1, - ValidationResult, ); const [error] = result.getErrors(); @@ -185,11 +180,9 @@ describe('validateInstantAssetLockProofStructureFactory', () => { const result = await validateInstantAssetLockProofStructure(rawProof); - expectValidationError( + await expectValidationError( result, InvalidInstantAssetLockProofSignatureError, - 1, - ValidationResult, ); const [error] = result.getErrors(); @@ -206,7 +199,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { const result = await validateInstantAssetLockProofStructure(rawProof); - expectValidationError(result, JsonSchemaError, 1, ValidationResult); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -231,7 +224,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { const result = await validateInstantAssetLockProofStructure(rawProof); - expectValidationError(result, JsonSchemaError, 1, ValidationResult); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -246,7 +239,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { const result = await validateInstantAssetLockProofStructure(rawProof); - expectValidationError(result, JsonSchemaError, 1, ValidationResult); + await expectJsonSchemaError(result); const [error] = result.getErrors(); @@ -261,7 +254,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { const result = await validateInstantAssetLockProofStructure(rawProof); - expectValidationError(result, InvalidIdentityAssetLockTransactionError, 1, ValidationResult); + await expectValidationError(result, InvalidIdentityAssetLockTransactionError); const [error] = result.getErrors(); @@ -278,7 +271,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { const result = await validateInstantAssetLockProofStructure(rawProof); - expectValidationError(result, JsonSchemaError, 1, ValidationResult); + await expectJsonSchemaError(result); const [error] = result.getErrors(); diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js index 0bac3a533f1..ee830d66bd1 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js @@ -1,7 +1,3 @@ -const { expectValidationError } = require( - '@dashevo/dpp/lib/test/expect/expectError', -); - const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); @@ -9,6 +5,7 @@ const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createSta const protocolVersion = require('@dashevo/dpp/lib/version/protocolVersion'); const { default: loadWasmDpp } = require('../../../../../../../dist'); const generateRandomIdentifierAsync = require('../../../../../../../lib/test/utils/generateRandomIdentifierAsync'); +const { expectValidationError } = require('../../../../../../../lib/test/expect/expectError'); describe('validateIdentityCreateTransitionStateFactory', () => { let IdentityCreateTransition; @@ -73,7 +70,7 @@ describe('validateIdentityCreateTransitionStateFactory', () => { const result = await validate(stateTransition); - expectValidationError(result, IdentityAlreadyExistsError, 1, ValidationResult); + await expectValidationError(result, IdentityAlreadyExistsError); const [error] = result.getErrors(); From d49ce513817615c58c108828ebab156165403eb4 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Sun, 15 Jan 2023 20:14:15 +0000 Subject: [PATCH 47/66] refactor(wasm-dpp): asset lock proof unit tests cleanup and fine tuning --- .../ChainAssetLockProof.spec.js | 9 +++------ .../InstantAssetLockProof.spec.js | 20 +++---------------- .../createAssetLockProofInstance.spec.js | 4 ++-- 3 files changed, 8 insertions(+), 25 deletions(-) diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js index bfb80521f65..c00a78608c2 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/ChainAssetLockProof.spec.js @@ -11,12 +11,9 @@ describe('ChainAssetLockProof', () => { ({ ChainAssetLockProof } = await loadWasmDpp()); chainAssetLockProofJS = getChainAssetLockFixture(); - }); - - beforeEach(() => { - const rawObject = chainAssetLockProofJS.toObject(); - - chainAssetLockProof = new ChainAssetLockProof(rawObject); + chainAssetLockProof = new ChainAssetLockProof( + chainAssetLockProofJS.toObject(), + ); }); describe('#getType', () => { diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js index f83c6c904f1..0b8f7b6551d 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/InstantAssetLockProof.spec.js @@ -11,23 +11,9 @@ describe('InstantAssetLockProof', () => { ({ InstantAssetLockProof } = await loadWasmDpp()); instantAssetLockProofJS = getInstantAssetLockProofFixture(); - }); - - beforeEach(() => { - const { - type, - outputIndex, - transaction, - instantLock, - } = instantAssetLockProofJS.toObject(); - // const { coreChainLockedHeight, outPoint } = inst; - - instantAssetLockProof = new InstantAssetLockProof({ - type, - outputIndex, - transaction, - instantLock, - }); + instantAssetLockProof = new InstantAssetLockProof( + instantAssetLockProofJS.toObject(), + ); }); describe('#getType', () => { diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js index 2f00968fce3..d597396c93d 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/assetLockProof/createAssetLockProofInstance.spec.js @@ -18,8 +18,8 @@ describe('createAssetLockProofInstance', () => { it('should create an instance of InstantAssetLockProof', () => { const assetLockProofFixture = getInstantAssetLockProofFixture(); - const instanceJS = createAssetLockProofInstanceJS(assetLockProofFixture.toObject()); const instance = createAssetLockProofInstance(assetLockProofFixture.toObject()); + const instanceJS = createAssetLockProofInstanceJS(assetLockProofFixture.toObject()); expect(instance.toObject()).to.deep.equal(instanceJS.toObject()); expect(instance).to.be.an.instanceOf(InstantAssetLockProof); @@ -27,8 +27,8 @@ describe('createAssetLockProofInstance', () => { it('should create an instance of ChainAssetLockProof', () => { const assetLockProofFixture = getChainAssetLockFixture(); - const instanceJS = createAssetLockProofInstanceJS(assetLockProofFixture.toObject()); const instance = createAssetLockProofInstance(assetLockProofFixture.toObject()); + const instanceJS = createAssetLockProofInstanceJS(assetLockProofFixture.toObject()); expect(instance.toObject()).to.deep.equal(instanceJS.toObject()); expect(instance).to.be.an.instanceOf(ChainAssetLockProof); From 3f9acc67051b15c796f57d7ff6d5f2cb70d2f87c Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Sun, 15 Jan 2023 21:10:54 +0000 Subject: [PATCH 48/66] refactor(wasm-dpp): asset lock proof integration tests cleanup and fine-tuning --- packages/wasm-dpp/src/state_repository.rs | 4 +- ...hainAssetLockProofStructureFactory.spec.js | 29 ++++----- ...hAssetLockTransactionOutputFactory.spec.js | 18 +++--- ...tantAssetLockProofStructureFactory.spec.js | 2 - ...alidateAssetLockTransactionFactory.spec.js | 63 ++++++++----------- ...validatePublicKeySignaturesFactory.spec.js | 9 +-- 6 files changed, 56 insertions(+), 69 deletions(-) diff --git a/packages/wasm-dpp/src/state_repository.rs b/packages/wasm-dpp/src/state_repository.rs index 4e33f7d1c72..ac5c8257a40 100644 --- a/packages/wasm-dpp/src/state_repository.rs +++ b/packages/wasm-dpp/src/state_repository.rs @@ -63,7 +63,7 @@ extern "C" { #[wasm_bindgen(structural, method, js_name=isAssetLockTransactionOutPointAlreadyUsed)] pub fn is_asset_lock_transaction_out_point_already_used( this: &ExternalStateRepositoryLike, - out_point_buffer: Vec, + out_point_buffer: Buffer, execution_context: StateTransitionExecutionContextWasm, ) -> bool; @@ -314,7 +314,7 @@ impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper { .lock() .expect("unexpected concurrency issue!") .is_asset_lock_transaction_out_point_already_used( - out_point_buffer.to_owned(), + Buffer::from_bytes(out_point_buffer), execution_context.clone().into(), )) } diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js index bb28f07023e..bed4fd84b6a 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js @@ -18,7 +18,6 @@ describe('validateChainAssetLockProofStructureFactory', () => { let StateTransitionExecutionContext; let ValidationResult; - let JsonSchemaError; let InvalidAssetLockProofCoreChainHeightError; let IdentityAssetLockTransactionIsNotFoundError; let InvalidIdentityAssetLockTransactionOutputError; @@ -30,7 +29,6 @@ describe('validateChainAssetLockProofStructureFactory', () => { ({ StateTransitionExecutionContext, ValidationResult, - JsonSchemaError, InvalidAssetLockProofCoreChainHeightError, IdentityAssetLockTransactionIsNotFoundError, InvalidIdentityAssetLockTransactionOutputError, @@ -276,7 +274,7 @@ describe('validateChainAssetLockProofStructureFactory', () => { expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.not.be.called(); }); - it('should point to existing transaction', async () => { + it('should point to existing transaction', async function () { stateRepositoryMock.fetchTransaction.returns(null); const result = await validateChainAssetLockProofStructure( @@ -295,9 +293,10 @@ describe('validateChainAssetLockProofStructureFactory', () => { Buffer.from(transactionHash, 'hex'), ); - const { args } = stateRepositoryMock.fetchTransaction.firstCall; - expect(args[0]).to.equal(transactionHash); - expect(args[1]).to.be.instanceOf(StateTransitionExecutionContext); + expect(stateRepositoryMock.fetchTransaction).to.be.calledOnceWithExactly( + transactionHash, + this.sinonSandbox.match.instanceOf(StateTransitionExecutionContext), + ); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.be.calledOnce(); }); @@ -324,7 +323,7 @@ describe('validateChainAssetLockProofStructureFactory', () => { ); }); - it('should point to transaction from block lower than core chain locked height', async () => { + it('should point to transaction from block lower than core chain locked height', async function () { rawProof.coreChainLockedHeight = 41; stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight.returns(41); @@ -344,14 +343,15 @@ describe('validateChainAssetLockProofStructureFactory', () => { expect(error.getProofCoreChainLockedHeight()).to.equal(41); expect(error.getTransactionHeight()).to.equal(42); - const { args } = stateRepositoryMock.fetchTransaction.firstCall; - expect(args[0]).to.equal(transactionHash); - expect(args[1]).to.be.instanceOf(StateTransitionExecutionContext); + expect(stateRepositoryMock.fetchTransaction).to.be.calledOnceWithExactly( + transactionHash, + this.sinonSandbox.match.instanceOf(StateTransitionExecutionContext), + ); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.be.calledOnce(); }); }); - it('should return valid result', async () => { + it('should return valid result', async function () { const result = await validateChainAssetLockProofStructure( stateRepositoryMock, rawProof, @@ -362,9 +362,10 @@ describe('validateChainAssetLockProofStructureFactory', () => { expect(result.isValid()).to.be.true(); expect(result.getData()).to.deep.equal(publicKeyHash); - const { args } = stateRepositoryMock.fetchTransaction.firstCall; - expect(args[0]).to.equal(transactionHash); - expect(args[1]).to.be.instanceOf(StateTransitionExecutionContext); + expect(stateRepositoryMock.fetchTransaction).to.be.calledOnceWithExactly( + transactionHash, + this.sinonSandbox.match.instanceOf(StateTransitionExecutionContext), + ); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.be.calledOnce(); }); diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js index 3958df7946f..e2a3459c18a 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js @@ -92,7 +92,7 @@ describe('fetchAssetLockTransactionOutputFactory', () => { ([output] = transaction.outputs); }); - it('should fetch output from state repository', async () => { + it('should fetch output from state repository', async function () { const assetLockTransactionOutput = await fetchAssetLockTransactionOutput( assetLockProofFixture, executionContext, @@ -100,9 +100,10 @@ describe('fetchAssetLockTransactionOutputFactory', () => { expect(assetLockTransactionOutput).to.deep.equal(output.toObject()); - const { args } = stateRepositoryMock.fetchTransaction.firstCall; - expect(args[0]).to.equal(transactionHash); - expect(args[1]).to.be.instanceOf(StateTransitionExecutionContext); + expect(stateRepositoryMock.fetchTransaction).to.be.calledOnceWithExactly( + transactionHash, + this.sinonSandbox.match.instanceOf(StateTransitionExecutionContext), + ); }); it('should throw AssetLockTransactionIsNotFoundError when transaction is not found', async () => { @@ -121,7 +122,7 @@ describe('fetchAssetLockTransactionOutputFactory', () => { } }); - it('should return mocked output on dry run', async () => { + it('should return mocked output on dry run', async function () { executionContext.enableDryRun(); const result = await fetchAssetLockTransactionOutput( @@ -136,9 +137,10 @@ describe('fetchAssetLockTransactionOutputFactory', () => { script: '', }); - const { args } = stateRepositoryMock.fetchTransaction.firstCall; - expect(args[0]).to.equal(transactionHash); - expect(args[1]).to.be.instanceOf(StateTransitionExecutionContext); + expect(stateRepositoryMock.fetchTransaction).to.be.calledOnceWithExactly( + transactionHash, + this.sinonSandbox.match.instanceOf(StateTransitionExecutionContext), + ); }); }); diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js index 784cf7c064c..530903b5491 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js @@ -20,7 +20,6 @@ describe('validateInstantAssetLockProofStructureFactory', () => { let IdentityAssetLockProofLockedTransactionMismatchError; let InvalidInstantAssetLockProofSignatureError; let InvalidIdentityAssetLockTransactionError; - let JsonSchemaError; let validateInstantAssetLockProofStructure; let validateInstantAssetLockProofStructureDPP; @@ -29,7 +28,6 @@ describe('validateInstantAssetLockProofStructureFactory', () => { ({ StateTransitionExecutionContext, ValidationResult, - JsonSchemaError, InvalidInstantAssetLockProofError, IdentityAssetLockProofLockedTransactionMismatchError, InvalidInstantAssetLockProofSignatureError, diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js index 2e9655f6aff..99b3b76b8f8 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/validateAssetLockTransactionFactory.spec.js @@ -2,17 +2,15 @@ const { Transaction, PrivateKey, Script } = require('@dashevo/dashcore-lib'); const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); -const AbstractConsensusError = require('@dashevo/dpp/lib/errors/consensus/AbstractConsensusError'); const { expect } = require('chai'); const { default: loadWasmDpp } = require('../../../../../dist'); +const { expectValidationError } = require('../../../../../lib/test/expect/expectError'); describe('validateAssetLockTransactionFactory', () => { let stateRepositoryMock; let rawTransaction; let outputIndex; - let transactionMock; let executionContext; - let expectValidationError; let StateTransitionExecutionContext; let InvalidIdentityAssetLockTransactionError; @@ -20,6 +18,7 @@ describe('validateAssetLockTransactionFactory', () => { let InvalidIdentityAssetLockTransactionOutputError; let InvalidAssetLockTransactionOutputReturnSizeError; let IdentityAssetLockTransactionOutPointAlreadyExistsError; + let TransactionDecodeError; let ValidationResult; let validateAssetLockTransaction; @@ -29,6 +28,7 @@ describe('validateAssetLockTransactionFactory', () => { ({ StateTransitionExecutionContext, ValidationResult, + TransactionDecodeError, InvalidIdentityAssetLockTransactionError, IdentityAssetLockTransactionOutputNotFoundError, InvalidIdentityAssetLockTransactionOutputError, @@ -36,17 +36,6 @@ describe('validateAssetLockTransactionFactory', () => { IdentityAssetLockTransactionOutPointAlreadyExistsError, validateAssetLockTransaction: validateAssetLockTransactionDPP, } = await loadWasmDpp()); - - expectValidationError = ( - result, - errorClass = AbstractConsensusError, - count = 1, - ) => { - expect(result).to.be.an.instanceOf(ValidationResult); - expect(result.getErrors()).to.have.lengthOf(count); - - result.getErrors().forEach((error) => expect(error).to.be.an.instanceOf(errorClass)); - }; }); beforeEach(function beforeEach() { @@ -67,12 +56,6 @@ describe('validateAssetLockTransactionFactory', () => { ); }); - afterEach(() => { - if (transactionMock) { - transactionMock.restore(); - } - }); - it('should be valid transaction', async () => { rawTransaction = '030000000137feb5676d085133'; @@ -82,12 +65,12 @@ describe('validateAssetLockTransactionFactory', () => { executionContext, ); - expectValidationError(result, InvalidIdentityAssetLockTransactionError); + await expectValidationError(result, InvalidIdentityAssetLockTransactionError); const [error] = result.getErrors(); expect(error.getCode()).to.equal(1038); - expect(error.getValidationError()).to.exist(); + expect(error.getValidationError()).to.be.instanceOf(TransactionDecodeError); expect(result.getData()).to.be.undefined(); expect(stateRepositoryMock.isAssetLockTransactionOutPointAlreadyUsed).to.not.be.called(); @@ -102,7 +85,7 @@ describe('validateAssetLockTransactionFactory', () => { executionContext, ); - expectValidationError(result, IdentityAssetLockTransactionOutputNotFoundError); + await expectValidationError(result, IdentityAssetLockTransactionOutputNotFoundError); const [error] = result.getErrors(); @@ -115,6 +98,7 @@ describe('validateAssetLockTransactionFactory', () => { it('should point to output with OR_RETURN', async () => { const regularTransaction = new Transaction(Buffer.from(rawTransaction, 'hex')); + // Mess up expected TX output script regularTransaction.outputs[0] .setScript(Script.buildPublicKeyHashOut(new PrivateKey().toAddress()).toString()); @@ -124,7 +108,7 @@ describe('validateAssetLockTransactionFactory', () => { executionContext, ); - expectValidationError(result, InvalidIdentityAssetLockTransactionOutputError); + await expectValidationError(result, InvalidIdentityAssetLockTransactionOutputError); const [error] = result.getErrors(); @@ -143,7 +127,7 @@ describe('validateAssetLockTransactionFactory', () => { executionContext, ); - expectValidationError(result, InvalidAssetLockTransactionOutputReturnSizeError); + await expectValidationError(result, InvalidAssetLockTransactionOutputReturnSizeError); const [error] = result.getErrors(); @@ -151,7 +135,7 @@ describe('validateAssetLockTransactionFactory', () => { expect(error.getOutputIndex()).to.equal(outputIndex); }); - it('should return IdentityAssetLockTransactionOutPointAlreadyExistsError if outPoint was already used', async () => { + it('should return IdentityAssetLockTransactionOutPointAlreadyExistsError if outPoint was already used', async function () { stateRepositoryMock.isAssetLockTransactionOutPointAlreadyUsed.returns(true); const result = await validateAssetLockTransaction( @@ -160,7 +144,7 @@ describe('validateAssetLockTransactionFactory', () => { executionContext, ); - expectValidationError(result, IdentityAssetLockTransactionOutPointAlreadyExistsError); + await expectValidationError(result, IdentityAssetLockTransactionOutPointAlreadyExistsError); const [error] = result.getErrors(); @@ -172,13 +156,15 @@ describe('validateAssetLockTransactionFactory', () => { expect(error.getOutputIndex()).to.deep.equal(outputIndex); expect(result.getData()).to.be.undefined(); - - const { args } = stateRepositoryMock.isAssetLockTransactionOutPointAlreadyUsed.firstCall; - expect(args[0]).to.deep.equal(transaction.getOutPointBuffer(outputIndex)); - expect(args[1]).to.be.instanceOf(StateTransitionExecutionContext); + expect(stateRepositoryMock.isAssetLockTransactionOutPointAlreadyUsed) + .to.be.calledOnceWithExactly( + this.sinonSandbox.match((val) => Buffer.from(val) + .equals(transaction.getOutPointBuffer(outputIndex))), + this.sinonSandbox.match.instanceOf(StateTransitionExecutionContext), + ); }); - it('should return valid result', async () => { + it('should return valid result', async function () { const result = await validateAssetLockTransaction( rawTransaction, outputIndex, @@ -192,13 +178,16 @@ describe('validateAssetLockTransactionFactory', () => { const initialTransaction = new Transaction(rawTransaction); const initialPublicKeyHash = initialTransaction.outputs[outputIndex].script.getData(); - const { args } = stateRepositoryMock.isAssetLockTransactionOutPointAlreadyUsed.firstCall; - expect(args[0]).to.deep.equal(initialTransaction.getOutPointBuffer(outputIndex)); - expect(args[1]).to.be.instanceOf(StateTransitionExecutionContext); + expect(stateRepositoryMock.isAssetLockTransactionOutPointAlreadyUsed) + .to.be.calledOnceWithExactly( + this.sinonSandbox.match((val) => Buffer.from(val) + .equals(initialTransaction.getOutPointBuffer(outputIndex))), + this.sinonSandbox.match.instanceOf(StateTransitionExecutionContext), + ); const { transaction, publicKeyHash } = result.getData(); expect(publicKeyHash).to.deep.equal(initialPublicKeyHash); - const parsedTx = new Transaction(Buffer.from(transaction)); - expect(parsedTx.toJSON()).to.deep.equal(initialTransaction.toJSON()); + expect(new Transaction(Buffer.from(transaction)).toJSON()) + .to.deep.equal(initialTransaction.toJSON()); }); }); diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js index 03b079d0622..c0de3cca256 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js @@ -121,14 +121,13 @@ describe('validatePublicKeySignaturesFactory', () => { }); it('should return InvalidIdentityKeySignatureError if signature is not valid', async () => { - const keys = identityCreateTransition.getPublicKeys().map((key) => key.toObject()); - const rawPublicKey2 = keys[1]; + const rawPublicKey2 = rawIdentityCreateTransition.publicKeys[1]; rawPublicKey2.signature = crypto.randomBytes(65); const result = await validatePublicKeySignatures( rawIdentityCreateTransition, - keys, + rawIdentityCreateTransition.publicKeys, ); await expectValidationError(result, InvalidIdentityKeySignatureError); @@ -139,11 +138,9 @@ describe('validatePublicKeySignaturesFactory', () => { }); it('should return valid result', async () => { - const keys = identityCreateTransition.getPublicKeys().map((key) => key.toObject()); - const result = await validatePublicKeySignatures( rawIdentityCreateTransition, - keys, + rawIdentityCreateTransition.publicKeys, blsAdapter, ); From 27d547c05ca5d141d4bc9b16c08b32a571bd838d Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Mon, 16 Jan 2023 11:16:33 +0000 Subject: [PATCH 49/66] fix(rs-dpp): automocks for StateRepositoryLike --- packages/rs-dpp/src/state_repository.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/state_repository.rs b/packages/rs-dpp/src/state_repository.rs index 94bfbe26de7..2568449c12e 100644 --- a/packages/rs-dpp/src/state_repository.rs +++ b/packages/rs-dpp/src/state_repository.rs @@ -24,7 +24,12 @@ pub struct FetchTransactionResponse { } // Let StateRepositoryLike mock return DataContracts instead of bytes to simplify things a bit. -#[cfg_attr(any(test, feature="mocks"), automock(type ConversionError=Infallible; type FetchDataContract=DataContract;))] +#[cfg_attr(any(test, feature="mocks"), automock( + type ConversionError=Infallible; + type FetchDataContract=DataContract; + type FetchIdentity=Identity; + type FetchTransaction=FetchTransactionResponse; +))] #[async_trait] pub trait StateRepositoryLike: Send + Sync { type ConversionError: Into; From c2aca5c5b40b15bf9e6b4ce96d86e1799c10925b Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 17 Jan 2023 10:13:42 +0000 Subject: [PATCH 50/66] refactor(wasm-dpp): unit tests for IdentityCreateTransition cleanup and fine-tuning --- .../identity_create_transition.rs | 21 +-- packages/wasm-dpp/src/state_repository.rs | 4 +- .../IdentityCreateTransition.spec.js | 144 +++++++++--------- ...plyIdentityCreateTransitionFactory.spec.js | 35 +++-- ...entityCreateTransitionStateFactory.spec.js | 64 ++++---- 5 files changed, 131 insertions(+), 137 deletions(-) diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index 3c799861d6c..1d08c2a726f 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -121,7 +121,7 @@ impl IdentityCreateTransitionWasm { let public_keys = public_keys .to_vec() .into_iter() - .map(|key| key.with_serde_to_json_value().unwrap()) + .map(|key| key.with_serde_to_json_value().unwrap()) // TODO: use generic_from_js_value instead? .map(|key_json| IdentityPublicKey::from_json_object(key_json).unwrap()) .collect::>(); @@ -136,7 +136,7 @@ impl IdentityCreateTransitionWasm { let mut public_keys = public_keys .to_vec() .into_iter() - .map(|key| key.with_serde_to_json_value().unwrap()) + .map(|key| key.with_serde_to_json_value().unwrap()) // TODO: use generic_from_js_value instead? .map(|key_json| IdentityPublicKey::from_json_object(key_json).unwrap()) .collect::>(); @@ -216,12 +216,6 @@ impl IdentityCreateTransitionWasm { js_sys::Reflect::set(&js_object, &"signature".to_owned().into(), &signature_value)?; } - js_sys::Reflect::set( - &js_object, - &"identityId".to_owned().into(), - &Buffer::from_bytes(object.identity_id.buffer.as_slice()), - )?; - let asset_lock_proof_object = match object.asset_lock_proof { AssetLockProof::Instant(instant_asset_lock_proof) => { InstantAssetLockProofWasm::from(instant_asset_lock_proof).to_object()? @@ -276,12 +270,6 @@ impl IdentityCreateTransitionWasm { js_sys::Reflect::set(&js_object, &"signature".to_owned().into(), &signature_value)?; } - js_sys::Reflect::set( - &js_object, - &"identityId".to_owned().into(), - &object.identity_id.to_string(Encoding::Base58).into(), - )?; - let asset_lock_proof_json = match object.asset_lock_proof { AssetLockProof::Instant(instant_asset_lock_proof) => { InstantAssetLockProofWasm::from(instant_asset_lock_proof).to_json()? @@ -340,6 +328,11 @@ impl IdentityCreateTransitionWasm { self.0.set_execution_context(context.into()) } + #[wasm_bindgen(js_name=getExecutionContext)] + pub fn get_execution_context(&mut self) -> StateTransitionExecutionContextWasm { + self.0.get_execution_context().into() + } + #[wasm_bindgen(js_name=signByPrivateKey)] pub fn sign_by_private_key( &mut self, diff --git a/packages/wasm-dpp/src/state_repository.rs b/packages/wasm-dpp/src/state_repository.rs index ac5c8257a40..ad5e2c868a1 100644 --- a/packages/wasm-dpp/src/state_repository.rs +++ b/packages/wasm-dpp/src/state_repository.rs @@ -92,7 +92,7 @@ extern "C" { #[wasm_bindgen(structural, method, js_name=markAssetLockTransactionOutPointAsUsed)] pub fn mark_asset_lock_transaction_out_point_as_used( this: &ExternalStateRepositoryLike, - out_point_buffer: Vec, + out_point_buffer: Buffer, ); // TODO add missing declarations @@ -327,7 +327,7 @@ impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper { .0 .lock() .expect("unexpected concurrency issue!") - .mark_asset_lock_transaction_out_point_as_used(out_point_buffer.to_owned())) + .mark_asset_lock_transaction_out_point_as_used(Buffer::from_bytes(out_point_buffer))) } async fn fetch_sml_store(&self) -> anyhow::Result diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js index 6cf6c805d89..c81a0122550 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js @@ -1,18 +1,21 @@ -const IdentityPublicKeyJS = require('@dashevo/dpp/lib/identity/IdentityPublicKey'); const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); const getChainAssetLockProofFixture = require('@dashevo/dpp/lib/test/fixtures/getChainAssetLockProofFixture'); +const stateTransitionTypes = require('@dashevo/dpp/lib/stateTransition/stateTransitionTypes'); +const protocolVersion = require('@dashevo/dpp/lib/version/protocolVersion'); const { default: loadWasmDpp } = require('../../../../../dist'); describe('IdentityCreateTransition', () => { - let stateTransitionJS; + let rawStateTransition; let stateTransition; + let IdentityCreateTransition; + let InstantAssetLockProof; let KeyType; let KeyPurpose; let KeySecurityLevel; let IdentityPublicKey; - let ChainAssetLockProof; + let Identifier; const mockRawPublicKey = (params = {}) => ({ id: 0, @@ -28,30 +31,30 @@ describe('IdentityCreateTransition', () => { before(async () => { ({ IdentityCreateTransition, IdentityPublicKey, KeyType, KeyPurpose, KeySecurityLevel, - ChainAssetLockProof, + InstantAssetLockProof, Identifier, } = await loadWasmDpp()); }); beforeEach(() => { - stateTransitionJS = getIdentityCreateTransitionFixture(); - // Fill public keys with signatures (to test skipSignature later) - stateTransitionJS.publicKeys = [new IdentityPublicKeyJS(mockRawPublicKey())]; - // Fill signature (to test skipSignature later) - stateTransitionJS.signature = Buffer.alloc(32).fill(1); - stateTransition = new IdentityCreateTransition(stateTransitionJS.toObject()); + stateTransition = new IdentityCreateTransition( + getIdentityCreateTransitionFixture().toObject(), + ); + rawStateTransition = stateTransition.toObject(); }); describe('#constructor', () => { - it('should create instance with instant asset lock proof', () => { - expect(stateTransition.getAssetLockProof().toObject()) - .to.deep.equal(stateTransitionJS.getAssetLockProof().toObject()); + it('should create instance with specified data', () => { + expect(stateTransition.getAssetLockProof().toObject()).to.deep.equal( + rawStateTransition.assetLockProof, + ); - expect(stateTransition.publicKeys.map((key) => key.toJSON())) - .to.deep.equal(stateTransitionJS.publicKeys.map((key) => key.toJSON())); + expect(stateTransition.publicKeys.map((key) => key.toObject())).to.deep.equal([ + new IdentityPublicKey(rawStateTransition.publicKeys[0]).toObject(), + ]); }); it('should create instance with chain asset lock proof', () => { - const stObject = stateTransitionJS.toObject(); + const stObject = stateTransition.toObject(); stObject.assetLockProof = getChainAssetLockProofFixture().toObject(); stateTransition = new IdentityCreateTransition(stObject); expect(stateTransition.getAssetLockProof().toObject()) @@ -61,26 +64,23 @@ describe('IdentityCreateTransition', () => { describe('#getType', () => { it('should return IDENTITY_CREATE type', () => { - expect(stateTransition.getType()).to.equal(stateTransitionJS.getType()); + expect(stateTransition.getType()).to.equal(stateTransitionTypes.IDENTITY_CREATE); }); }); describe('#setAssetLockProof', () => { - let assetLockProofObject; - beforeEach(() => { - const assetLockProof = new ChainAssetLockProof(getChainAssetLockProofFixture().toObject()); - assetLockProofObject = assetLockProof.toObject(); - stateTransition.setAssetLockProof(assetLockProof); - }); - it('should set asset lock proof', () => { + stateTransition.setAssetLockProof( + new InstantAssetLockProof(rawStateTransition.assetLockProof), + ); + expect(stateTransition.assetLockProof.toObject()) - .to.deep.equal(assetLockProofObject); + .to.deep.equal(rawStateTransition.assetLockProof); }); it('should set `identityId`', () => { stateTransition.setAssetLockProof( - stateTransition.assetLockProof, + new InstantAssetLockProof(rawStateTransition.assetLockProof), ); expect(stateTransition.identityId.toBuffer()).to.deep.equal( @@ -90,60 +90,52 @@ describe('IdentityCreateTransition', () => { }); describe('#getAssetLockProof', () => { - it('should return currently set locked asset lock proof', () => { + it('should return currently set locked OutPoint', () => { expect(stateTransition.getAssetLockProof().toObject()).to.deep.equal( - stateTransitionJS.assetLockProof.toObject(), + rawStateTransition.assetLockProof, ); }); }); describe('#setPublicKeys', () => { it('should set public keys', () => { - const rawKeyOne = mockRawPublicKey({ id: 0 }); - const rawKeyTwo = mockRawPublicKey({ id: 1 }); - - const publicKeys = [new IdentityPublicKey(rawKeyOne), new IdentityPublicKey(rawKeyTwo)]; - const publicKeysJS = [new IdentityPublicKeyJS(rawKeyOne), new IdentityPublicKeyJS(rawKeyTwo)]; + const publicKeys = [ + new IdentityPublicKey(mockRawPublicKey({ id: 0 })), + new IdentityPublicKey(mockRawPublicKey({ id: 1 })), + ]; stateTransition.setPublicKeys(publicKeys); - stateTransitionJS.setPublicKeys(publicKeysJS); expect(stateTransition.publicKeys.map((key) => key.toObject())) - .to.deep.equal(stateTransitionJS.publicKeys.map((key) => key.toObject())); + .to.have.deep.members(publicKeys.map((key) => key.toObject())); }); }); describe('#getPublicKeys', () => { it('should return set public keys', () => { - expect(stateTransition.getPublicKeys().map((key) => key.toObject())) - .to.deep.equal(stateTransitionJS.getPublicKeys().map((key) => key.toObject())); + expect(stateTransition.getPublicKeys().map((key) => key.toObject())).to.deep.equal( + rawStateTransition.publicKeys + .map((rawPublicKey) => new IdentityPublicKey(rawPublicKey).toObject()), + ); }); }); describe('#addPublicKeys', () => { it('should add more public keys', () => { - const rawKeyOne = mockRawPublicKey({ id: 0 }); - const rawKeyTwo = mockRawPublicKey({ id: 1 }); - - const publicKeys = [new IdentityPublicKey(rawKeyOne), new IdentityPublicKey(rawKeyTwo)]; - const publicKeysJS = [new IdentityPublicKeyJS(rawKeyOne), new IdentityPublicKeyJS(rawKeyTwo)]; - - stateTransitionJS.publicKeys = []; - stateTransitionJS.addPublicKeys(publicKeysJS); + const publicKeys = [ + new IdentityPublicKey(mockRawPublicKey({ id: 0 })), + new IdentityPublicKey(mockRawPublicKey({ id: 1 })), + ]; stateTransition.setPublicKeys([]); stateTransition.addPublicKeys(publicKeys); - expect(stateTransition.getPublicKeys().map((key) => key.toObject())) - .to.deep.equal(stateTransitionJS.getPublicKeys().map((key) => key.toObject())); + .to.have.deep.members(publicKeys.map((key) => key.toObject())); }); }); describe('#getIdentityId', () => { it('should return identity id', () => { - expect(stateTransition.getIdentityId().toBuffer()) - .to.deep.equal(stateTransitionJS.getIdentityId()); - expect(stateTransition.getIdentityId().toBuffer()).to.deep.equal( stateTransition.getAssetLockProof().createIdentifier().toBuffer(), ); @@ -152,9 +144,6 @@ describe('IdentityCreateTransition', () => { describe('#getOwnerId', () => { it('should return owner id', () => { - expect(stateTransition.getOwnerId().toBuffer()) - .to.deep.equal(stateTransitionJS.getOwnerId()); - expect(stateTransition.getOwnerId().toBuffer()).to.deep.equal( stateTransition.getIdentityId().toBuffer(), ); @@ -163,50 +152,53 @@ describe('IdentityCreateTransition', () => { describe('#toObject', () => { it('should return raw state transition', () => { - const stObject = stateTransition.toObject(); - const stObjectJS = stateTransitionJS.toObject(); - - // TODO: fix? stObjectJS missing identityId. - delete stObject.identityId; + rawStateTransition = stateTransition.toObject(); - expect(stObject).to.deep.equal(stObjectJS); + expect(rawStateTransition).to.deep.equal({ + protocolVersion: protocolVersion.latestVersion, + type: stateTransitionTypes.IDENTITY_CREATE, + assetLockProof: rawStateTransition.assetLockProof, + publicKeys: rawStateTransition.publicKeys, + signature: undefined, + }); }); it('should return raw state transition without signature', () => { - const stObject = stateTransition.toObject({ skipSignature: true }); - const stObjectJS = stateTransitionJS.toObject({ skipSignature: true }); - - // TODO: fix? stObjectJS missing identityId. - delete stObject.identityId; + rawStateTransition = stateTransition.toObject({ skipSignature: true }); - expect(stObject.signature).to.not.exist(); - expect(stObject).to.deep.equal(stObjectJS); + expect(rawStateTransition).to.deep.equal({ + protocolVersion: protocolVersion.latestVersion, + type: stateTransitionTypes.IDENTITY_CREATE, + assetLockProof: rawStateTransition.assetLockProof, + publicKeys: rawStateTransition.publicKeys, + }); }); }); describe('#toJSON', () => { it('should return JSON representation of state transition', () => { - const stJson = stateTransition.toJSON(); - const stJsonJS = stateTransitionJS.toJSON(); + const jsonStateTransition = stateTransition.toJSON(); - // TODO: fix? stObjectJS missing identityId. - delete stJson.identityId; - - expect(stJson).to.deep.equal(stJsonJS); + expect(jsonStateTransition).to.deep.equal({ + protocolVersion: protocolVersion.latestVersion, + type: stateTransitionTypes.IDENTITY_CREATE, + assetLockProof: stateTransition.getAssetLockProof().toJSON(), + publicKeys: stateTransition.getPublicKeys().map((k) => k.toJSON()), + signature: undefined, + }); }); }); describe('#getModifiedDataIds', () => { it('should return ids of created identities', () => { const result = stateTransition.getModifiedDataIds(); - const resultJS = stateTransitionJS.getModifiedDataIds(); - expect(result.length).to.equal(resultJS.length); - expect(result.map((id) => id.toBuffer())).to.deep.equal(resultJS); + expect(result.length).to.be.equal(1); const identityId = result[0]; + expect(identityId).to.be.an.instanceOf(Identifier); expect(identityId.toBuffer()).to.be.deep.equal( - stateTransition.getIdentityId().toBuffer(), + new IdentityCreateTransition(rawStateTransition).getIdentityId().toBuffer(), ); }); }); diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js index f2f40dd90b2..6e78c7f2945 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/applyIdentityCreateTransitionFactory.spec.js @@ -33,8 +33,9 @@ describe('applyIdentityCreateTransitionFactory', () => { beforeEach(function beforeEach() { stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); - const stateTransitionJS = getIdentityCreateTransitionFixture(); - stateTransition = new IdentityCreateTransition(stateTransitionJS.toObject()); + stateTransition = new IdentityCreateTransition( + getIdentityCreateTransitionFixture().toObject(), + ); executionContext = new StateTransitionExecutionContext(); @@ -48,7 +49,7 @@ describe('applyIdentityCreateTransitionFactory', () => { ); }); - it('should store identity created from state transition', async () => { + it('should store identity created from state transition', async function () { await applyIdentityCreateTransition(stateTransition); const balance = convertSatoshiToCredits( @@ -63,25 +64,27 @@ describe('applyIdentityCreateTransitionFactory', () => { revision: 0, }); - const { args: createIdentityArgs } = stateRepositoryMock.createIdentity.firstCall; + const { match } = this.sinonSandbox; - expect(createIdentityArgs[0].toObject()).to.deep.equal(identity.toObject()); - expect(createIdentityArgs[1]).to.be.instanceOf(StateTransitionExecutionContext); + expect(stateRepositoryMock.createIdentity).to.have.been.calledOnceWithExactly( + match((arg) => expect(arg.toObject()).to.deep.equal(identity.toObject())), + match.instanceOf(StateTransitionExecutionContext), + ); const publicKeyHashes = identity .getPublicKeys() .map((publicKey) => publicKey.hash()); - const { args: storePublicKeyHashesArgs } = stateRepositoryMock - .storeIdentityPublicKeyHashes.firstCall; - expect(storePublicKeyHashesArgs[0].toBuffer()).to.deep.equal(identity.getId().toBuffer()); - expect(storePublicKeyHashesArgs[1]).to.deep.equal(publicKeyHashes); - expect(storePublicKeyHashesArgs[2]).to.be.instanceOf(StateTransitionExecutionContext); - - const { args: markAsUsedArgs } = stateRepositoryMock - .markAssetLockTransactionOutPointAsUsed.firstCall; + expect(stateRepositoryMock.storeIdentityPublicKeyHashes).to.have.been.calledOnceWithExactly( + match((arg) => expect(arg.toBuffer()).to.deep.equal(identity.getId().toBuffer())), + match((arg) => expect(arg).to.deep.equal(publicKeyHashes)), + match.instanceOf(StateTransitionExecutionContext), + ); - expect(markAsUsedArgs[0]).to - .deep.equal(stateTransition.getAssetLockProof().getOutPoint()); + const outPoint = stateTransition.getAssetLockProof().getOutPoint(); + expect(stateRepositoryMock.markAssetLockTransactionOutPointAsUsed).to.have.been + .calledOnceWithExactly( + match((arg) => Buffer.from(arg).equals(outPoint)), + ); }); }); diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js index ee830d66bd1..97809751807 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js @@ -8,41 +8,50 @@ const generateRandomIdentifierAsync = require('../../../../../../../lib/test/uti const { expectValidationError } = require('../../../../../../../lib/test/expect/expectError'); describe('validateIdentityCreateTransitionStateFactory', () => { + let validateIdentityCreateTransitionState; + let stateTransition; + let stateRepositoryMock; + let identity; + let IdentityCreateTransition; - let StateTransitionExecutionContext; + let IdentityPublicKey; let IdentityAlreadyExistsError; let Identity; - let ValidationResult; - let validateIdentityCreateTransitionState; - let validate; - let executionContext; - let rawIdentity; - - let stateTransition; - let stateRepositoryMock; + let validateIdentityCreateTransitionStateDPP; before(async () => { ({ IdentityCreateTransition, - StateTransitionExecutionContext, - ValidationResult, IdentityAlreadyExistsError, + IdentityPublicKey, Identity, - validateIdentityCreateTransitionState, + validateIdentityCreateTransitionState: validateIdentityCreateTransitionStateDPP, } = await loadWasmDpp()); }); beforeEach(async function () { - const stFixture = getIdentityCreateTransitionFixture(); - stateTransition = new IdentityCreateTransition(stFixture.toObject()); + const privateKey = Buffer.from('af432c476f65211f45f48f1d42c9c0b497e56696aa1736b40544ef1a496af837', 'hex'); + stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); - executionContext = new StateTransitionExecutionContext(); - stateTransition.setExecutionContext(executionContext); + validateIdentityCreateTransitionState = (st) => validateIdentityCreateTransitionStateDPP( + stateRepositoryMock, st, + ); - stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); + stateTransition = new IdentityCreateTransition( + getIdentityCreateTransitionFixture().toObject(), + ); + + await stateTransition.signByPrivateKey(privateKey, IdentityPublicKey.TYPES.ECDSA_SECP256K1); + + const rawTransaction = '030000000137feb5676d0851337ea3c9a992496aab7a0b3eee60aeeb9774000b7f4bababa5000000006b483045022100d91557de37645c641b948c6cd03b4ae3791a63a650db3e2fee1dcf5185d1b10402200e8bd410bf516ca61715867666d31e44495428ce5c1090bf2294a829ebcfa4ef0121025c3cc7fbfc52f710c941497fd01876c189171ea227458f501afcb38a297d65b4ffffffff021027000000000000166a14152073ca2300a86b510fa2f123d3ea7da3af68dcf77cb0090a0000001976a914152073ca2300a86b510fa2f123d3ea7da3af68dc88ac00000000'; + + stateRepositoryMock.fetchTransaction.returns({ + data: Buffer.from(rawTransaction, 'hex'), + height: 42, + }); - rawIdentity = { + identity = new Identity({ protocolVersion: protocolVersion.latestVersion, id: await generateRandomIdentifierAsync(), publicKeys: [ @@ -58,17 +67,13 @@ describe('validateIdentityCreateTransitionStateFactory', () => { ], balance: 0, revision: 0, - }; - - validate = (st) => validateIdentityCreateTransitionState(stateRepositoryMock, st); + }); }); it('should return invalid result if identity already exists', async () => { - const identity = new Identity(rawIdentity); - stateRepositoryMock.fetchIdentity.returns(identity); - const result = await validate(stateTransition); + const result = await validateIdentityCreateTransitionState(stateTransition); await expectValidationError(result, IdentityAlreadyExistsError); @@ -80,18 +85,19 @@ describe('validateIdentityCreateTransitionStateFactory', () => { }); it('should return valid result if state transition is valid', async () => { - const result = await validate(stateTransition); + const result = await validateIdentityCreateTransitionState(stateTransition); expect(result.isValid()).to.be.true(); }); it('should return valid result on dry run', async () => { - executionContext.enableDryRun(); + stateRepositoryMock.fetchIdentity.returns(identity); + + stateTransition.getExecutionContext().enableDryRun(); - const result = await validate(stateTransition); + const result = await validateIdentityCreateTransitionState(stateTransition); - executionContext.disableDryRun(); - expect(stateRepositoryMock.fetchIdentity).to.have.been.called(); + stateTransition.getExecutionContext().disableDryRun(); expect(result.isValid()).to.be.true(); }); From 7a2e0ca67d5fcfbabe249f4d1edf224fa6abf43d Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 17 Jan 2023 10:18:46 +0000 Subject: [PATCH 51/66] refactor(wasm-dpp): integration tests for IdentityCreateTransition cleanup and fine-tuning --- .../validateIdentityCreateTransitionBasicFactory.spec.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js index 85b278de633..6bc0f385f0f 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js @@ -86,9 +86,6 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { stateTransition.setPublicKeys([identityPublicKey]); rawStateTransition = stateTransition.toObject(); - - // TODO: must not be present? - delete rawStateTransition.identityId; }); describe('protocolVersion', () => { @@ -282,8 +279,6 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { stateTransition.setPublicKeys([identityPublicKey]); rawStateTransition = stateTransition.toObject(); - // TODO: remove identity Id? - delete rawStateTransition.identityId; const result = await validateIdentityCreateTransitionBasic( rawStateTransition, @@ -308,8 +303,6 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { stateTransition.setPublicKeys([identityPublicKey]); rawStateTransition = stateTransition.toObject(); - // TODO: remove identity Id? - delete rawStateTransition.identityId; const result = await validateIdentityCreateTransitionBasic( rawStateTransition, From 0ee034f9f3f226dcff77a58993b84e7a27a58f3b Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 17 Jan 2023 11:19:44 +0000 Subject: [PATCH 52/66] refactor(wasm-dpp): JSON conversion for validation logic --- Cargo.lock | 85 ------------------ ...tantAssetLockProofStructureFactory.spec.js | 4 +- packages/wasm-dpp/Cargo.toml | 1 - .../asset_lock_proof/chain/validation.rs | 24 +---- .../asset_lock_proof/instant/validation.rs | 23 +---- .../validate_public_key_signatures.rs | 35 ++------ ...hainAssetLockProofStructureFactory.spec.js | 88 ++++++++++++------- ...tantAssetLockProofStructureFactory.spec.js | 50 ++++++++--- 8 files changed, 113 insertions(+), 197 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3123e5856a2..cc50504a537 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -475,7 +475,6 @@ dependencies = [ "js-sys", "num-integer", "num-traits", - "serde", "time 0.1.45", "wasm-bindgen", "winapi", @@ -799,41 +798,6 @@ dependencies = [ "syn", ] -[[package]] -name = "darling" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0dd3cd20dc6b5a876612a6e5accfe7f3dd883db6d07acfbf14c128f61550dfa" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a784d2ccaf7c98501746bf0be29b2022ba41fd62a2e622af997a03e9f972859f" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn", -] - -[[package]] -name = "darling_macro" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7618812407e9402654622dd402b0a89dff9ba93badd6540781526117b92aab7e" -dependencies = [ - "darling_core", - "quote", - "syn", -] - [[package]] name = "dashcore" version = "0.29.1" @@ -1139,12 +1103,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - [[package]] name = "form_urlencoded" version = "1.1.0" @@ -1452,12 +1410,6 @@ dependencies = [ "cxx-build", ] -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - [[package]] name = "idna" version = "0.3.0" @@ -1476,7 +1428,6 @@ checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" dependencies = [ "autocfg", "hashbrown 0.12.3", - "serde", ] [[package]] @@ -2732,34 +2683,6 @@ dependencies = [ "syn", ] -[[package]] -name = "serde_with" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25bf4a5a814902cd1014dbccfa4d4560fb8432c779471e96e035602519f82eef" -dependencies = [ - "base64 0.13.1", - "chrono", - "hex", - "indexmap", - "serde", - "serde_json", - "serde_with_macros", - "time 0.3.17", -] - -[[package]] -name = "serde_with_macros" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3452b4c0f6c1e357f73fdb87cd1efabaa12acf328c7a528e252893baeb3f4aa" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "sha2" version = "0.9.9" @@ -2866,12 +2789,6 @@ dependencies = [ "visualize", ] -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strum" version = "0.24.1" @@ -3043,7 +2960,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" dependencies = [ - "itoa 1.0.5", "serde", "time-core", "time-macros", @@ -3353,7 +3269,6 @@ dependencies = [ "serde", "serde-wasm-bindgen", "serde_json", - "serde_with", "thiserror", "wasm-bindgen", "wasm-bindgen-futures", diff --git a/packages/js-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js b/packages/js-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js index f513684f7f1..18d40625709 100644 --- a/packages/js-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +++ b/packages/js-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js @@ -390,7 +390,9 @@ describe('validateInstantAssetLockProofStructureFactory', () => { }); it('should return valid result', async () => { - const result = await validateInstantAssetLockProofStructure(rawProof); + const result = await validateInstantAssetLockProofStructure( + rawProof, + ); expect(result).to.be.an.instanceOf(ValidationResult); expect(result.isValid()).to.be.true(); diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 15ca96b5c5e..8780683152e 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -22,7 +22,6 @@ console_error_panic_hook = { version="0.1.7"} wasm-bindgen-futures = "0.4.33" async-trait = "0.1.59" anyhow = "1.0.66" -serde_with = "2.1.0" [profile.release] lto = true diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs index 16186193099..0f6a2753631 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs @@ -3,44 +3,28 @@ use dpp::identity::state_transition::asset_lock_proof::{ }; use dpp::state_transition::state_transition_execution_context::StateTransitionExecutionContext; use dpp::ProtocolError; -use serde::{Deserialize, Serialize}; -use serde_with::skip_serializing_none; use std::sync::Arc; use wasm_bindgen::prelude::*; use crate::buffer::Buffer; +use crate::utils::ToSerdeJSONExt; use crate::{ errors::from_dpp_err, state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, validation::ValidationResultWasm, - with_js_error, StateTransitionExecutionContextWasm, + StateTransitionExecutionContextWasm, }; -#[skip_serializing_none] -#[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct RawChainAssetLockProof { - // TODO: consider using with_serde_to_json_value() instead of this struct - #[serde(rename = "type")] - lock_type: Option, - core_chain_locked_height: Option, - out_point: Option>, -} - #[wasm_bindgen(js_name=validateChainAssetLockProofStructure)] pub async fn validate_chain_asset_lock_proof_structure( - state_repository: ExternalStateRepositoryLike, // TODO: test with wrapper? + state_repository: ExternalStateRepositoryLike, raw_asset_lock_proof: JsValue, execution_context: &StateTransitionExecutionContextWasm, ) -> Result { let state_repository_wrapper = Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository)); - let parsed_asset_lock_proof: RawChainAssetLockProof = - with_js_error!(serde_wasm_bindgen::from_value(raw_asset_lock_proof))?; - - let asset_lock_proof_json = - serde_json::to_value(parsed_asset_lock_proof).map_err(|e| from_dpp_err(e.into()))?; + let asset_lock_proof_json = raw_asset_lock_proof.with_serde_to_json_value()?; let tx_validator = Arc::new(AssetLockTransactionValidator::new( state_repository_wrapper.clone(), diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs index 21979ffa95b..c03354599c8 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs @@ -3,31 +3,18 @@ use dpp::identity::state_transition::asset_lock_proof::{ }; use dpp::state_transition::state_transition_execution_context::StateTransitionExecutionContext; use dpp::ProtocolError; -use serde::{Deserialize, Serialize}; -use serde_with::skip_serializing_none; use std::sync::Arc; use wasm_bindgen::prelude::*; use crate::buffer::Buffer; +use crate::utils::ToSerdeJSONExt; use crate::{ errors::from_dpp_err, state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, validation::ValidationResultWasm, - with_js_error, StateTransitionExecutionContextWasm, + StateTransitionExecutionContextWasm, }; -#[skip_serializing_none] -#[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct RawInstantAssetLockProof { - // TODO: consider using with_serde_to_json_value() instead of this struct - #[serde(rename = "type")] - lock_type: Option, - instant_lock: Option>, - transaction: Option>, - output_index: Option, -} - #[wasm_bindgen(js_name=validateInstantAssetLockProofStructure)] pub async fn validate_instant_asset_lock_proof_structure( state_repository: ExternalStateRepositoryLike, // TODO: test with wrapper? @@ -37,11 +24,7 @@ pub async fn validate_instant_asset_lock_proof_structure( let state_repository_wrapper = Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository)); - let parsed_asset_lock_proof: RawInstantAssetLockProof = - with_js_error!(serde_wasm_bindgen::from_value(raw_asset_lock_proof))?; - - let asset_lock_proof_json = - serde_json::to_value(parsed_asset_lock_proof).map_err(|e| from_dpp_err(e.into()))?; + let asset_lock_proof_json = raw_asset_lock_proof.with_serde_to_json_value()?; let tx_validator = Arc::new(AssetLockTransactionValidator::new( state_repository_wrapper.clone(), diff --git a/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs b/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs index aa1902653e5..e77125dca64 100644 --- a/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs +++ b/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs @@ -1,17 +1,17 @@ use crate::bls_adapter::{BlsAdapter, JsBlsAdapter}; use crate::errors::from_dpp_err; -use crate::IdentityCreateTransitionWasm; +use crate::utils::ToSerdeJSONExt; + use crate::{ identity::identity_public_key::IdentityPublicKeyWasm, validation::ValidationResultWasm, }; -use dpp::identity::state_transition::identity_create_transition::IdentityCreateTransition; + use dpp::identity::state_transition::validate_public_key_signatures::{ PublicKeysSignaturesValidator, TPublicKeysSignaturesValidator, }; use dpp::prelude::IdentityPublicKey; -use dpp::state_transition::{StateTransitionConvert, StateTransitionType}; + use serde_json::Value as JsonValue; -use std::convert::TryInto; use wasm_bindgen::prelude::wasm_bindgen; use wasm_bindgen::JsValue; @@ -21,32 +21,9 @@ pub fn validate_public_key_signatures( raw_public_keys: Vec, bls: JsBlsAdapter, ) -> Result { - // TODO: use with_serde_to_json_value? - let st_type: StateTransitionType = - (js_sys::Reflect::get(&raw_state_transition, &JsValue::from_str("type"))? - .as_f64() - .ok_or(JsValue::from_str("State transition type is not a number"))? as u8) - .try_into() - .map_err(|_| js_sys::Error::new("State transition type is not a valid value"))?; - let bls_adapter = BlsAdapter(bls); - let st_object = match st_type { - StateTransitionType::IdentityCreate => { - let st: IdentityCreateTransition = - IdentityCreateTransitionWasm::new(raw_state_transition)?.into(); - - st.to_object(true).map_err(|e| from_dpp_err(e.into())) - } - // TODO: - // StateTransitionType::IdentityUpdate => { - // let st: IdentityUpdateTransition = - // IdentityUpdateTransitionWasm::new(raw_state_transition)?.into(); - // st.to_json(false) - // .map_err(from_dpp_err) - // } - _ => Err(js_sys::Error::new("State transition type is not supported").into()), - }?; + let state_transition_json = raw_state_transition.with_serde_to_json_value()?; let public_keys = raw_public_keys .into_iter() @@ -60,7 +37,7 @@ pub fn validate_public_key_signatures( let validator = PublicKeysSignaturesValidator::new(bls_adapter); let result = validator - .validate_public_key_signatures(&st_object, &public_keys) + .validate_public_key_signatures(&state_transition_json, &public_keys) .map_err(|e| from_dpp_err(e.into()))?; Ok(result.map(|_| JsValue::undefined()).into()) diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js index bed4fd84b6a..5dd0a1aeb16 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js @@ -15,6 +15,7 @@ describe('validateChainAssetLockProofStructureFactory', () => { let rawTransaction; let transactionHash; let executionContext; + let validateChainAssetLockProofStructure; let StateTransitionExecutionContext; let ValidationResult; @@ -23,7 +24,7 @@ describe('validateChainAssetLockProofStructureFactory', () => { let InvalidIdentityAssetLockTransactionOutputError; let InvalidAssetLockProofTransactionHeightError; - let validateChainAssetLockProofStructure; + let validateChainAssetLockProofStructureDPP; before(async () => { ({ @@ -33,7 +34,7 @@ describe('validateChainAssetLockProofStructureFactory', () => { IdentityAssetLockTransactionIsNotFoundError, InvalidIdentityAssetLockTransactionOutputError, InvalidAssetLockProofTransactionHeightError, - validateChainAssetLockProofStructure, + validateChainAssetLockProofStructure: validateChainAssetLockProofStructureDPP, } = await loadWasmDpp()); }); @@ -61,6 +62,13 @@ describe('validateChainAssetLockProofStructureFactory', () => { executionContext = new StateTransitionExecutionContext(); publicKeyHash = Buffer.from('152073ca2300a86b510fa2f123d3ea7da3af68dc', 'hex'); + + validateChainAssetLockProofStructure = ( + proof, context, + ) => validateChainAssetLockProofStructureDPP( + stateRepositoryMock, + rawProof, context, + ); }); describe('type', () => { @@ -68,7 +76,6 @@ describe('validateChainAssetLockProofStructureFactory', () => { delete rawProof.type; const result = await validateChainAssetLockProofStructure( - stateRepositoryMock, rawProof, executionContext, ); @@ -88,11 +95,17 @@ describe('validateChainAssetLockProofStructureFactory', () => { it('should be equal to 1', async () => { rawProof.type = -1; - await expect(validateChainAssetLockProofStructure( - stateRepositoryMock, + const result = await validateChainAssetLockProofStructure( rawProof, executionContext, - )).to.be.rejectedWith('Conversion Error: Error: invalid type: floating point `-1`, expected u8'); + ); + + await expectJsonSchemaError(result); + + const [error] = result.getErrors(); + + expect(error.getInstancePath()).to.equal('/type'); + expect(error.getKeyword()).to.equal('const'); expect(stateRepositoryMock.fetchTransaction).to.not.be.called(); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.not.be.called(); @@ -104,7 +117,6 @@ describe('validateChainAssetLockProofStructureFactory', () => { delete rawProof.coreChainLockedHeight; const result = await validateChainAssetLockProofStructure( - stateRepositoryMock, rawProof, executionContext, ); @@ -124,11 +136,17 @@ describe('validateChainAssetLockProofStructureFactory', () => { it('should be an integer', async () => { rawProof.coreChainLockedHeight = 1.5; - await expect(validateChainAssetLockProofStructure( - stateRepositoryMock, + const result = await validateChainAssetLockProofStructure( rawProof, executionContext, - )).to.be.rejectedWith('Conversion Error: Error: invalid type: floating point `1.5`, expected u32'); + ); + + await expectJsonSchemaError(result); + + const [error] = result.getErrors(); + + expect(error.getInstancePath()).to.equal('/coreChainLockedHeight'); + expect(error.getKeyword()).to.equal('type'); expect(stateRepositoryMock.fetchTransaction).to.not.be.called(); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.not.be.called(); @@ -137,11 +155,17 @@ describe('validateChainAssetLockProofStructureFactory', () => { it('should be a number', async () => { rawProof.coreChainLockedHeight = '42'; - await expect(validateChainAssetLockProofStructure( - stateRepositoryMock, + const result = await validateChainAssetLockProofStructure( rawProof, executionContext, - )).to.be.rejectedWith('Conversion Error: Error: invalid type: string "42", expected u32'); + ); + + await expectJsonSchemaError(result); + + const [error] = result.getErrors(); + + expect(error.getInstancePath()).to.equal('/coreChainLockedHeight'); + expect(error.getKeyword()).to.equal('type'); expect(stateRepositoryMock.fetchTransaction).to.not.be.called(); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.not.be.called(); @@ -151,7 +175,6 @@ describe('validateChainAssetLockProofStructureFactory', () => { rawProof.coreChainLockedHeight = 0; const result = await validateChainAssetLockProofStructure( - stateRepositoryMock, rawProof, executionContext, ); @@ -170,11 +193,17 @@ describe('validateChainAssetLockProofStructureFactory', () => { it('should be less than 4294967296', async () => { rawProof.coreChainLockedHeight = 4294967296; - await expect(validateChainAssetLockProofStructure( - stateRepositoryMock, + const result = await validateChainAssetLockProofStructure( rawProof, executionContext, - )).to.be.rejectedWith('Conversion Error: Error: invalid value: integer `4294967296`, expected u32'); + ); + + await expectJsonSchemaError(result); + + const [error] = result.getErrors(); + + expect(error.getInstancePath()).to.equal('/coreChainLockedHeight'); + expect(error.getKeyword()).to.equal('maximum'); expect(stateRepositoryMock.fetchTransaction).to.not.be.called(); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.not.be.called(); @@ -184,12 +213,11 @@ describe('validateChainAssetLockProofStructureFactory', () => { stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight.returns(41); const result = await validateChainAssetLockProofStructure( - stateRepositoryMock, rawProof, executionContext, ); - await expectValidationError(result, InvalidAssetLockProofCoreChainHeightError, 1); + expectValidationError(result, InvalidAssetLockProofCoreChainHeightError); const [error] = result.getErrors(); @@ -204,7 +232,6 @@ describe('validateChainAssetLockProofStructureFactory', () => { delete rawProof.outPoint; const result = await validateChainAssetLockProofStructure( - stateRepositoryMock, rawProof, executionContext, ); @@ -224,11 +251,17 @@ describe('validateChainAssetLockProofStructureFactory', () => { it('should be a byte array', async () => { rawProof.outPoint = new Array(36).fill('string'); - await expect(validateChainAssetLockProofStructure( - stateRepositoryMock, + const result = await validateChainAssetLockProofStructure( rawProof, executionContext, - )).to.be.rejectedWith('Conversion Error: Error: invalid type: string "string", expected u8'); + ); + + await expectJsonSchemaError(result, 36); + + const [error] = result.getErrors(); + + expect(error.getInstancePath()).to.equal('/outPoint/0'); + expect(error.getKeyword()).to.equal('type'); expect(stateRepositoryMock.fetchTransaction).to.not.be.called(); expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.not.be.called(); @@ -238,7 +271,6 @@ describe('validateChainAssetLockProofStructureFactory', () => { rawProof.outPoint = Buffer.alloc(35); const result = await validateChainAssetLockProofStructure( - stateRepositoryMock, rawProof, executionContext, ); @@ -258,7 +290,6 @@ describe('validateChainAssetLockProofStructureFactory', () => { rawProof.outPoint = Buffer.alloc(37); const result = await validateChainAssetLockProofStructure( - stateRepositoryMock, rawProof, executionContext, ); @@ -278,13 +309,11 @@ describe('validateChainAssetLockProofStructureFactory', () => { stateRepositoryMock.fetchTransaction.returns(null); const result = await validateChainAssetLockProofStructure( - stateRepositoryMock, rawProof, executionContext, ); - await expectValidationError(result, - IdentityAssetLockTransactionIsNotFoundError); + await expectValidationError(result, IdentityAssetLockTransactionIsNotFoundError); const [error] = result.getErrors(); @@ -312,7 +341,6 @@ describe('validateChainAssetLockProofStructureFactory', () => { }); const result = await validateChainAssetLockProofStructure( - stateRepositoryMock, rawProof, executionContext, ); @@ -328,7 +356,6 @@ describe('validateChainAssetLockProofStructureFactory', () => { stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight.returns(41); const result = await validateChainAssetLockProofStructure( - stateRepositoryMock, rawProof, executionContext, ); @@ -353,7 +380,6 @@ describe('validateChainAssetLockProofStructureFactory', () => { it('should return valid result', async function () { const result = await validateChainAssetLockProofStructure( - stateRepositoryMock, rawProof, executionContext, ); diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js index 530903b5491..b3d3ee9d1f0 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js @@ -74,8 +74,14 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should be equal to 0', async () => { rawProof.type = -1; - await expect(validateInstantAssetLockProofStructure(rawProof)) - .to.be.rejectedWith('Conversion Error: Error: invalid type: floating point `-1`, expected u8'); + const result = await validateInstantAssetLockProofStructure(rawProof); + + await expectJsonSchemaError(result); + + const [error] = result.getErrors(); + + expect(error.getInstancePath()).to.equal('/type'); + expect(error.getKeyword()).to.equal('const'); expect(stateRepositoryMock.verifyInstantLock).to.not.be.called(); }); @@ -101,8 +107,14 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should be a byte array', async () => { rawProof.instantLock = new Array(165).fill('string'); - await expect(validateInstantAssetLockProofStructure(rawProof)) - .to.be.rejectedWith('Conversion Error: Error: invalid type: string "string", expected u8'); + const result = await validateInstantAssetLockProofStructure(rawProof); + + await expectJsonSchemaError(result, 165); + + const [error] = result.getErrors(); + + expect(error.getInstancePath()).to.equal('/instantLock/0'); + expect(error.getKeyword()).to.equal('type'); expect(stateRepositoryMock.verifyInstantLock).to.not.be.called(); }); @@ -211,8 +223,14 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should be a byte array', async () => { rawProof.transaction = new Array(65).fill('string'); - await expect(validateInstantAssetLockProofStructure(rawProof)) - .to.be.rejectedWith('Conversion Error: Error: invalid type: string "string", expected u8'); + const result = await validateInstantAssetLockProofStructure(rawProof); + + await expectJsonSchemaError(result, 65); + + const [error] = result.getErrors(); + + expect(error.getInstancePath()).to.equal('/transaction/0'); + expect(error.getKeyword()).to.equal('type'); expect(stateRepositoryMock.verifyInstantLock).to.not.be.called(); }); @@ -283,8 +301,14 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should be an integer', async () => { rawProof.outputIndex = 1.1; - await expect(validateInstantAssetLockProofStructure(rawProof)) - .to.be.rejectedWith('Conversion Error: Error: invalid type: floating point `1.1`, expected u32'); + const result = await validateInstantAssetLockProofStructure(rawProof); + + await expectJsonSchemaError(result, 1); + + const [error] = result.getErrors(); + + expect(error.getInstancePath()).to.equal('/outputIndex'); + expect(error.getKeyword()).to.equal('type'); expect(stateRepositoryMock.verifyInstantLock).to.not.be.called(); }); @@ -292,8 +316,14 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should not be less than 0', async () => { rawProof.outputIndex = -1; - await expect(validateInstantAssetLockProofStructure(rawProof)) - .to.be.rejectedWith('Conversion Error: Error: invalid type: floating point `-1`, expected u32'); + const result = await validateInstantAssetLockProofStructure(rawProof); + + await expectJsonSchemaError(result); + + const [error] = result.getErrors(); + + expect(error.getInstancePath()).to.equal('/outputIndex'); + expect(error.getKeyword()).to.equal('minimum'); expect(stateRepositoryMock.verifyInstantLock).to.not.be.called(); }); From 5e6c3ebaae6b5ae453396d125b4513c9c3c9e785 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 17 Jan 2023 11:51:27 +0000 Subject: [PATCH 53/66] refactor(wasm-dpp): asset lock type --- .../identity_create_transition.rs | 3 +- .../state_transition/asset_lock_proof/mod.rs | 79 ++++++++++--------- .../identity_create_transition.rs | 33 ++++---- 3 files changed, 59 insertions(+), 56 deletions(-) diff --git a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index 4f98a5ff516..d41d93deb18 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -10,8 +10,7 @@ use crate::identity::IdentityPublicKey; use crate::prelude::Identifier; use crate::state_transition::state_transition_execution_context::StateTransitionExecutionContext; use crate::state_transition::{ - state_transition_helpers, StateTransition, StateTransitionConvert, StateTransitionLike, - StateTransitionType, + StateTransition, StateTransitionConvert, StateTransitionLike, StateTransitionType, }; use crate::util::json_value::JsonValueExt; use crate::util::string_encoding::Encoding; diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index 10bb31ff5b2..cb5df0d9014 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -3,6 +3,7 @@ mod instant; pub use chain::*; pub use instant::*; +use std::convert::TryInto; use std::sync::Arc; use wasm_bindgen::JsCast; use wasm_bindgen::__rt::Ref; @@ -22,8 +23,8 @@ use crate::utils::generic_of_js_val; use crate::validation::ValidationResultWasm; use crate::{Deserialize, StateTransitionExecutionContextWasm}; use dpp::identity::state_transition::asset_lock_proof::{ - AssetLockProof, AssetLockPublicKeyHashFetcher, AssetLockTransactionOutputFetcher, - AssetLockTransactionValidator, + AssetLockProof, AssetLockProofType, AssetLockPublicKeyHashFetcher, + AssetLockTransactionOutputFetcher, AssetLockTransactionValidator, }; #[derive(Deserialize, Clone)] @@ -65,12 +66,12 @@ impl AssetLockProofWasm { let lock_type = get_lock_type(&raw_asset_lock_proof)?; match lock_type { - 0 => Ok(InstantAssetLockProofWasm::new(raw_asset_lock_proof)?.into()), - 1 => Ok(ChainAssetLockProofWasm::new(raw_asset_lock_proof)?.into()), - _ => Err( - RustConversionError::Error(String::from("unrecognized asset lock type")) - .to_js_value(), - ), + AssetLockProofType::Instant => { + Ok(InstantAssetLockProofWasm::new(raw_asset_lock_proof)?.into()) + } + AssetLockProofType::Chain => { + Ok(ChainAssetLockProofWasm::new(raw_asset_lock_proof)?.into()) + } } } @@ -99,17 +100,16 @@ impl AssetLockProofWasm { } } -fn get_lock_type(raw_asset_lock_proof: &JsValue) -> Result { - let lock_type = js_sys::Reflect::get(&raw_asset_lock_proof, &JsValue::from_str("type")) +fn get_lock_type(raw_asset_lock_proof: &JsValue) -> Result { + (js_sys::Reflect::get(&raw_asset_lock_proof, &JsValue::from_str("type")) .map_err(|_| { RustConversionError::Error(String::from("error getting type from raw asset lock")) .to_js_value() })? .as_f64() - .ok_or_else(|| JsValue::from_str("asset lock type must be a number"))? - as u8; - - Ok(lock_type) + .ok_or(JsValue::from_str("asset lock type must be a number"))? as u64) + .try_into() + .map_err(|_| JsValue::from_str("unrecognized asset lock proof type")) } #[wasm_bindgen(js_name=createAssetLockProofInstance)] @@ -117,11 +117,10 @@ pub fn create_asset_lock_proof_instance(raw_parameters: JsValue) -> Result InstantAssetLockProofWasm::new(raw_parameters).map(|v| v.into()), - 1 => ChainAssetLockProofWasm::new(raw_parameters).map(|v| v.into()), - _ => Err( - RustConversionError::Error(String::from("unrecognized asset lock type")).to_js_value(), - ), + AssetLockProofType::Instant => { + InstantAssetLockProofWasm::new(raw_parameters).map(|v| v.into()) + } + AssetLockProofType::Chain => ChainAssetLockProofWasm::new(raw_parameters).map(|v| v.into()), } } @@ -138,28 +137,30 @@ pub fn create_asset_lock_proof_from_wasm_instance( .dyn_ref::() .ok_or(default_error.clone())?; - let lock_type = get_type_function + let raw_lock_type = get_type_function .call0(&js_value)? .as_f64() - .ok_or(default_error.clone())? as u8; - - if lock_type == 0 { - let instant: Ref = - generic_of_js_val::(js_value, "InstantAssetLockProof")?; - - Ok(AssetLockProof::Instant(instant.clone().into())) - } else if lock_type == 1 { - let chain: Ref = - generic_of_js_val::(js_value, "ChainAssetLockProof")?; - - Ok(AssetLockProof::Chain(chain.clone().into())) - } else { - Err( - UnknownAssetLockProofTypeErrorWasm::from(UnknownAssetLockProofTypeError::new(Some( - lock_type, - ))) - .into(), - ) + .ok_or(default_error.clone())? as u64; + + let lock_type: AssetLockProofType = raw_lock_type.try_into().map_err(|_| { + UnknownAssetLockProofTypeErrorWasm::from(UnknownAssetLockProofTypeError::new(Some( + raw_lock_type as u8, + ))) + })?; + + match lock_type { + AssetLockProofType::Instant => { + let instant: Ref = + generic_of_js_val::(js_value, "InstantAssetLockProof")?; + + Ok(AssetLockProof::Instant(instant.clone().into())) + } + AssetLockProofType::Chain => { + let chain: Ref = + generic_of_js_val::(js_value, "ChainAssetLockProof")?; + + Ok(AssetLockProof::Chain(chain.clone().into())) + } } } diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index 1d08c2a726f..9ce051fe106 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -2,6 +2,7 @@ use std::convert::TryInto; use std::default::Default; use serde::{Deserialize, Serialize}; +use wasm_bindgen::__rt::Ref; use wasm_bindgen::prelude::*; use crate::identifier::IdentifierWrapper; @@ -21,7 +22,7 @@ use crate::{ use crate::bls_adapter::{BlsAdapter, JsBlsAdapter}; use crate::errors::from_dpp_err; -use crate::utils::ToSerdeJSONExt; +use crate::utils::generic_of_js_val; use dpp::{ identifier::Identifier, identity::{ @@ -117,32 +118,34 @@ impl IdentityCreateTransitionWasm { } #[wasm_bindgen(js_name=setPublicKeys)] - pub fn set_public_keys(&mut self, public_keys: js_sys::Array) -> Result<(), JsValue> { + pub fn set_public_keys(&mut self, public_keys: Vec) -> Result<(), JsValue> { let public_keys = public_keys - .to_vec() - .into_iter() - .map(|key| key.with_serde_to_json_value().unwrap()) // TODO: use generic_from_js_value instead? - .map(|key_json| IdentityPublicKey::from_json_object(key_json).unwrap()) - .collect::>(); + .iter() + .map(|value| { + let public_key: Ref = + generic_of_js_val::(value, "IdentityPublicKey")?; + Ok(public_key.clone().into()) + }) + .collect::, JsValue>>()?; self.0.set_public_keys(public_keys); - // TODO: consider returning self as it's done in the internal set_public_keys method Ok(()) } #[wasm_bindgen(js_name=addPublicKeys)] - pub fn add_public_keys(&mut self, public_keys: js_sys::Array) -> Result<(), JsValue> { + pub fn add_public_keys(&mut self, public_keys: Vec) -> Result<(), JsValue> { let mut public_keys = public_keys - .to_vec() - .into_iter() - .map(|key| key.with_serde_to_json_value().unwrap()) // TODO: use generic_from_js_value instead? - .map(|key_json| IdentityPublicKey::from_json_object(key_json).unwrap()) - .collect::>(); + .iter() + .map(|value| { + let public_key: Ref = + generic_of_js_val::(value, "IdentityPublicKey")?; + Ok(public_key.clone().into()) + }) + .collect::, JsValue>>()?; self.0.add_public_keys(&mut public_keys); - // TODO: consider returning self as it's done in the internal add_public_keys method Ok(()) } From 349dcc447dafa04e7bb2ab33ffcf8db2aa6640c5 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 17 Jan 2023 12:21:06 +0000 Subject: [PATCH 54/66] test(wasm-dpp): fix private key in validateIdentityCreateTransitionBasicFactory.spec.js --- packages/wasm-dpp/src/identity/identity_public_key/mod.rs | 2 -- packages/wasm-dpp/src/state_repository.rs | 1 - .../basic/validateIdentityCreateTransitionBasicFactory.spec.js | 2 +- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs index e25c41f2b47..ad9103aef65 100644 --- a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs +++ b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs @@ -108,13 +108,11 @@ impl IdentityPublicKeyWasm { self.0.get_readonly() } - // TODO: fix - make timestamp js_sys::Date #[wasm_bindgen(js_name=setDisabledAt)] pub fn set_disabled_at(&mut self, timestamp: u32) { self.0.set_disabled_at(timestamp as u64); } - // TODO: fix - return js_sys::Date #[wasm_bindgen(js_name=getDisabledAt)] pub fn get_disabled_at(&self) -> Option { self.0.get_disabled_at().map(|timestamp| timestamp as u32) diff --git a/packages/wasm-dpp/src/state_repository.rs b/packages/wasm-dpp/src/state_repository.rs index ad5e2c868a1..bdb90fb6172 100644 --- a/packages/wasm-dpp/src/state_repository.rs +++ b/packages/wasm-dpp/src/state_repository.rs @@ -111,7 +111,6 @@ impl ExternalStateRepositoryLikeWrapper { } } -// TODO: move to a dedicated module together with all From traits? #[derive(Clone, Serialize, Deserialize)] pub struct FetchTransactionResponse { pub height: Option, diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js index 6bc0f385f0f..2f3f80c0acf 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js @@ -68,7 +68,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const stateTransitionJS = getIdentityCreateTransitionFixture(); stateTransition = new IdentityCreateTransition(stateTransitionJS.toObject()); - const privateKey = new PrivateKey(); + const privateKey = new PrivateKey('9b67f852093bc61cea0eeca38599dbfba0de28574d2ed9b99d10d33dc1bde7b2'); const publicKey = privateKey.toPublicKey(); const identityPublicKey = mockIdentityPublicKey(publicKey.toBuffer()); From 2ecbc4d9e7794ed465d529805c4f58c85a507823 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 17 Jan 2023 12:23:54 +0000 Subject: [PATCH 55/66] test(rs-dpp): fix tests for fetch_transaction --- .../asset_lock_transaction_output_fetcher.rs | 5 +++-- packages/rs-dpp/src/state_repository.rs | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_output_fetcher.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_output_fetcher.rs index 601e66bb5ee..01f1162207f 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_output_fetcher.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/asset_lock_transaction_output_fetcher.rs @@ -87,6 +87,7 @@ pub async fn fetch_asset_lock_transaction_output( #[cfg(test)] mod test { + use crate::state_repository::FetchTransactionResponse; use crate::{ identity::state_transition::asset_lock_proof::chain::ChainAssetLockProof, state_repository::MockStateRepositoryLike, @@ -101,8 +102,8 @@ mod test { let execution_context = StateTransitionExecutionContext::default(); state_repository_mock - .expect_fetch_transaction::>() - .return_once(|_, _| Ok(None)); + .expect_fetch_transaction() + .return_once(|_, _| Ok(FetchTransactionResponse::default())); execution_context.enable_dry_run(); let result = fetch_asset_lock_transaction_output( diff --git a/packages/rs-dpp/src/state_repository.rs b/packages/rs-dpp/src/state_repository.rs index 2568449c12e..8bbd4891c1d 100644 --- a/packages/rs-dpp/src/state_repository.rs +++ b/packages/rs-dpp/src/state_repository.rs @@ -17,7 +17,7 @@ impl From for ProtocolError { } } -#[derive(Clone)] +#[derive(Clone, Default)] pub struct FetchTransactionResponse { pub height: Option, pub data: Option>, From 69eb2e0fdb074f4bf755ac73e9ee7754615ba19b Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 17 Jan 2023 12:30:37 +0000 Subject: [PATCH 56/66] refactor(js-dpp): revert code change --- .../validateInstantAssetLockProofStructureFactory.spec.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/js-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js b/packages/js-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js index 18d40625709..f513684f7f1 100644 --- a/packages/js-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +++ b/packages/js-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js @@ -390,9 +390,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { }); it('should return valid result', async () => { - const result = await validateInstantAssetLockProofStructure( - rawProof, - ); + const result = await validateInstantAssetLockProofStructure(rawProof); expect(result).to.be.an.instanceOf(ValidationResult); expect(result.isValid()).to.be.true(); From 402440fff40eda110dc05c70cfdd44775aa3b27d Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 17 Jan 2023 16:26:59 +0000 Subject: [PATCH 57/66] test(wasm-dpp): increase karma timeout --- packages/wasm-dpp/karma.conf.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/wasm-dpp/karma.conf.js b/packages/wasm-dpp/karma.conf.js index dc391088263..b73064f7145 100644 --- a/packages/wasm-dpp/karma.conf.js +++ b/packages/wasm-dpp/karma.conf.js @@ -9,6 +9,11 @@ const webpackConfig = require('./webpack.config'); module.exports = (config) => { config.set({ + client: { + mocha: { + timeout: 4000, + }, + }, frameworks: ['mocha', 'chai', 'webpack'], files: [ 'lib/test/karma/loader.js', From 0c418646f906ee1ae42f0b5260df36a86091fb99 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Thu, 19 Jan 2023 11:23:12 +0000 Subject: [PATCH 58/66] refactor(wasm-dpp): Buffer::from_bytes references instead of as_slice() --- ...ty_asset_lock_proof_locked_transaction_mismatch_error.rs | 4 ++-- packages/wasm-dpp/src/identifier/mod.rs | 2 +- .../asset_lock_proof/chain/chain_asset_lock_proof.rs | 2 +- .../asset_lock_proof/instant/instant_asset_lock_proof.rs | 6 +++--- .../identity_create_transition.rs | 4 ++-- packages/wasm-dpp/src/state_repository.rs | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs index 10f1c100d49..ad972dbe8c4 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs @@ -23,7 +23,7 @@ impl IdentityAssetLockProofLockedTransactionMismatchErrorWasm { #[wasm_bindgen(js_name=getInstantLockTransactionId)] pub fn instant_lock_transaction_id(&self) -> Buffer { let tx_id = self.inner.instant_lock_transaction_id(); - Buffer::from_bytes(tx_id.to_vec().as_ref()) + Buffer::from_bytes(&tx_id.to_vec()) } #[wasm_bindgen(js_name=getAssetLockTransactionId)] @@ -32,7 +32,7 @@ impl IdentityAssetLockProofLockedTransactionMismatchErrorWasm { let mut hash_bytes = tx_id.as_hash().into_inner(); hash_bytes.reverse(); - Buffer::from_bytes(hash_bytes.as_slice()) + Buffer::from_bytes(&hash_bytes) } #[wasm_bindgen(js_name=getCode)] diff --git a/packages/wasm-dpp/src/identifier/mod.rs b/packages/wasm-dpp/src/identifier/mod.rs index e9349482179..eda8c747f4e 100644 --- a/packages/wasm-dpp/src/identifier/mod.rs +++ b/packages/wasm-dpp/src/identifier/mod.rs @@ -79,7 +79,7 @@ impl IdentifierWrapper { #[wasm_bindgen(js_name=toBuffer)] pub fn to_buffer(&self) -> Buffer { - Buffer::from_bytes(self.wrapped.buffer.as_slice()) + Buffer::from_bytes(&self.wrapped.buffer) } #[wasm_bindgen(js_name=toJSON)] diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs index 1b0e0b4c2d7..8cdcbcf7ee3 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -72,7 +72,7 @@ impl ChainAssetLockProofWasm { #[wasm_bindgen(js_name=getOutPoint)] pub fn get_out_point(&self) -> Buffer { - Buffer::from_bytes(self.0.out_point().as_slice()) + Buffer::from_bytes(self.0.out_point()) } #[wasm_bindgen(js_name=setOutPoint)] diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs index 80614f6d4e0..44dcc7dae9b 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs @@ -79,7 +79,7 @@ impl InstantAssetLockProofWasm { pub fn get_out_point(&self) -> Option { self.0 .out_point() - .map(|out_point| Buffer::from_bytes(out_point.as_slice())) + .map(|out_point| Buffer::from_bytes(&out_point)) } #[wasm_bindgen(js_name=getOutput)] @@ -105,14 +105,14 @@ impl InstantAssetLockProofWasm { pub fn get_instant_lock(&self) -> Buffer { let instant_lock = self.0.instant_lock(); let serialized_instant_lock = serialize(instant_lock); - Buffer::from_bytes(serialized_instant_lock.as_slice()) + Buffer::from_bytes(&serialized_instant_lock) } #[wasm_bindgen(js_name=getTransaction)] pub fn get_transaction(&self) -> Buffer { let transaction = self.0.transaction(); let serialized_transaction = serialize(transaction); - Buffer::from_bytes(serialized_transaction.as_slice()) + Buffer::from_bytes(&serialized_transaction) } #[wasm_bindgen(js_name=toObject)] diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index 9ce051fe106..57c5fc47cea 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -213,7 +213,7 @@ impl IdentityCreateTransitionWasm { let signature_value: JsValue = if signature.len() == 0 { JsValue::undefined() } else { - Buffer::from_bytes(signature.as_slice()).into() + Buffer::from_bytes(&signature).into() }; js_sys::Reflect::set(&js_object, &"signature".to_owned().into(), &signature_value)?; @@ -355,6 +355,6 @@ impl IdentityCreateTransitionWasm { #[wasm_bindgen(js_name=getSignature)] pub fn get_signature(&self) -> Buffer { - Buffer::from_bytes(self.0.get_signature().as_slice()) + Buffer::from_bytes(&self.0.get_signature()) } } diff --git a/packages/wasm-dpp/src/state_repository.rs b/packages/wasm-dpp/src/state_repository.rs index bdb90fb6172..8381ff272e4 100644 --- a/packages/wasm-dpp/src/state_repository.rs +++ b/packages/wasm-dpp/src/state_repository.rs @@ -247,7 +247,7 @@ impl StateRepositoryLike for ExternalStateRepositoryLikeWrapper { ) -> anyhow::Result<()> { let hashes = public_key_hashes .iter() - .map(|hash| Buffer::from_bytes(hash.as_slice())) + .map(|hash| Buffer::from_bytes(hash)) .collect(); Ok(self From f0eb1f7c4e368cd285dd442dd4a5071ba364acc3 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Thu, 19 Jan 2023 11:47:09 +0000 Subject: [PATCH 59/66] refactor(wasm-dpp): Buffer::from_bytes references instead of as_slice() --- packages/wasm-dpp/src/bls_adapter.rs | 2 +- ..._proof_locked_transaction_mismatch_error.rs | 2 +- packages/wasm-dpp/src/errors/js_conversion.rs | 2 -- .../src/identity/identity_public_key/mod.rs | 4 ++-- .../state_transition/asset_lock_proof/mod.rs | 18 +++++++++--------- .../identity_create_transition.rs | 8 ++++---- .../identity_create_transition/to_object.rs | 15 ++++++++------- .../identity_create_transition/validation.rs | 2 +- packages/wasm-dpp/src/utils.rs | 6 +++--- .../src/validation/validation_result.rs | 2 +- 10 files changed, 30 insertions(+), 31 deletions(-) diff --git a/packages/wasm-dpp/src/bls_adapter.rs b/packages/wasm-dpp/src/bls_adapter.rs index 60c25ecdf16..56346e69821 100644 --- a/packages/wasm-dpp/src/bls_adapter.rs +++ b/packages/wasm-dpp/src/bls_adapter.rs @@ -76,7 +76,7 @@ impl BlsModule for BlsAdapter { let message: String = e .message() .as_string() - .unwrap_or(String::from("Unknown error, can't sign")); + .unwrap_or_else(|| String::from("Unknown error, can't sign")); anyhow!(message).into() } Err(_) => anyhow!("Unknown error, can't sign").into(), diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs index ad972dbe8c4..a8c39bb9632 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_asset_lock_proof_locked_transaction_mismatch_error.rs @@ -23,7 +23,7 @@ impl IdentityAssetLockProofLockedTransactionMismatchErrorWasm { #[wasm_bindgen(js_name=getInstantLockTransactionId)] pub fn instant_lock_transaction_id(&self) -> Buffer { let tx_id = self.inner.instant_lock_transaction_id(); - Buffer::from_bytes(&tx_id.to_vec()) + Buffer::from_bytes(&tx_id) } #[wasm_bindgen(js_name=getAssetLockTransactionId)] diff --git a/packages/wasm-dpp/src/errors/js_conversion.rs b/packages/wasm-dpp/src/errors/js_conversion.rs index f4a6c55517d..8d3e9377721 100644 --- a/packages/wasm-dpp/src/errors/js_conversion.rs +++ b/packages/wasm-dpp/src/errors/js_conversion.rs @@ -1,9 +1,7 @@ -use dpp::dashcore::anyhow::bail; use serde_json; use serde_wasm_bindgen::Error; use thiserror::Error; use wasm_bindgen::JsValue; -use web_sys::console::log_1; /// This is a rust-specific errors. In addition to all errors defined in `js-dpp`, the /// error might be triggered when using JS bindings diff --git a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs index ad9103aef65..e00cc58d0c9 100644 --- a/packages/wasm-dpp/src/identity/identity_public_key/mod.rs +++ b/packages/wasm-dpp/src/identity/identity_public_key/mod.rs @@ -159,9 +159,9 @@ impl IdentityPublicKeyWasm { &JsValue::from(data_buffer), )?; - if skip_signatures.unwrap_or(false) != true { + if !skip_signatures.unwrap_or(false) { let signature = self.0.get_signature(); - if signature.len() != 0 { + if !signature.is_empty() { js_sys::Reflect::set( &js_object, &"signature".to_owned().into(), diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index cb5df0d9014..c312b95e12b 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -79,10 +79,10 @@ impl AssetLockProofWasm { pub fn create_identifier(&self) -> Result { match &self.0 { AssetLockProof::Instant(instant) => { - InstantAssetLockProofWasm::from(instant.to_owned().clone()).create_identifier() + InstantAssetLockProofWasm::from(instant.to_owned()).create_identifier() } AssetLockProof::Chain(chain) => { - ChainAssetLockProofWasm::from(chain.to_owned().clone()).create_identifier() + ChainAssetLockProofWasm::from(chain.to_owned()).create_identifier() } } } @@ -91,23 +91,23 @@ impl AssetLockProofWasm { pub fn to_object(&self) -> Result { match &self.0 { AssetLockProof::Instant(instant) => { - InstantAssetLockProofWasm::from(instant.to_owned().clone()).to_object() + InstantAssetLockProofWasm::from(instant.to_owned()).to_object() } AssetLockProof::Chain(chain) => { - ChainAssetLockProofWasm::from(chain.to_owned().clone()).to_object() + ChainAssetLockProofWasm::from(chain.to_owned()).to_object() } } } } fn get_lock_type(raw_asset_lock_proof: &JsValue) -> Result { - (js_sys::Reflect::get(&raw_asset_lock_proof, &JsValue::from_str("type")) + (js_sys::Reflect::get(raw_asset_lock_proof, &JsValue::from_str("type")) .map_err(|_| { RustConversionError::Error(String::from("error getting type from raw asset lock")) .to_js_value() })? .as_f64() - .ok_or(JsValue::from_str("asset lock type must be a number"))? as u64) + .ok_or_else(|| JsValue::from_str("asset lock type must be a number"))? as u64) .try_into() .map_err(|_| JsValue::from_str("unrecognized asset lock proof type")) } @@ -135,12 +135,12 @@ pub fn create_asset_lock_proof_from_wasm_instance( let get_type_function: &js_sys::Function = get_type_value .dyn_ref::() - .ok_or(default_error.clone())?; + .ok_or_else(|| default_error.clone())?; let raw_lock_type = get_type_function - .call0(&js_value)? + .call0(js_value)? .as_f64() - .ok_or(default_error.clone())? as u64; + .ok_or(default_error)? as u64; let lock_type: AssetLockProofType = raw_lock_type.try_into().map_err(|_| { UnknownAssetLockProofTypeErrorWasm::from(UnknownAssetLockProofTypeError::new(Some( diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index 57c5fc47cea..91b7ca66ea4 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -193,7 +193,7 @@ impl IdentityCreateTransitionWasm { Default::default() }; - let skip_signature = opts.skip_signature.clone(); + let skip_signature = opts.skip_signature; let object = super::to_object::to_object_struct(&self.0, opts); let js_object = js_sys::Object::new(); @@ -210,7 +210,7 @@ impl IdentityCreateTransitionWasm { )?; if let Some(signature) = object.signature { - let signature_value: JsValue = if signature.len() == 0 { + let signature_value: JsValue = if signature.is_empty() { JsValue::undefined() } else { Buffer::from_bytes(&signature).into() @@ -264,7 +264,7 @@ impl IdentityCreateTransitionWasm { )?; if let Some(signature) = object.signature { - let signature_value: JsValue = if signature.len() == 0 { + let signature_value: JsValue = if signature.is_empty() { JsValue::undefined() } else { string_encoding::encode(signature.as_slice(), Encoding::Base64).into() @@ -355,6 +355,6 @@ impl IdentityCreateTransitionWasm { #[wasm_bindgen(js_name=getSignature)] pub fn get_signature(&self) -> Buffer { - Buffer::from_bytes(&self.0.get_signature()) + Buffer::from_bytes(self.0.get_signature()) } } diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/to_object.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/to_object.rs index dbecc03f90b..69b27bbfa0c 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/to_object.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/to_object.rs @@ -29,17 +29,18 @@ pub fn to_object_struct( transition: &IdentityCreateTransition, options: ToObjectOptions, ) -> ToObject { - let mut to_object = ToObject::default(); - to_object.transition_type = transition.get_type() as u8; - to_object.protocol_version = transition.get_protocol_version(); + let mut to_object = ToObject { + transition_type: transition.get_type() as u8, + protocol_version: transition.get_protocol_version(), + public_keys: transition.get_public_keys().to_owned(), + asset_lock_proof: transition.get_asset_lock_proof().to_owned(), + identity_id: transition.get_identity_id().to_owned(), + signature: None, + }; if !options.skip_signature.unwrap_or(false) { to_object.signature = Some(transition.get_signature().to_owned()); } - to_object.public_keys = transition.get_public_keys().to_owned(); - to_object.asset_lock_proof = transition.get_asset_lock_proof().to_owned(); - to_object.identity_id = transition.get_identity_id().to_owned(); - to_object } diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs index c7b144e5662..3963d649118 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs @@ -88,7 +88,7 @@ pub async fn validate_identity_create_transition_basic_wasm( let chain_asset_lock_proof_validator = ChainAssetLockProofStructureValidator::new( state_repository_wrapper.clone(), - tx_validator.clone(), + tx_validator, ) .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; diff --git a/packages/wasm-dpp/src/utils.rs b/packages/wasm-dpp/src/utils.rs index c43811bb5fb..68cec372e6c 100644 --- a/packages/wasm-dpp/src/utils.rs +++ b/packages/wasm-dpp/src/utils.rs @@ -139,9 +139,9 @@ pub fn generic_of_js_val>( if ctor_name == class_name { let ptr = js_sys::Reflect::get(js_value, &JsValue::from_str("ptr"))?; - let ptr_u32: u32 = ptr - .as_f64() - .ok_or(JsValue::from("Invalid JS object pointer"))? as u32; + let ptr_u32: u32 = + ptr.as_f64() + .ok_or_else(|| JsValue::from("Invalid JS object pointer"))? as u32; let reference = unsafe { T::ref_from_abi(ptr_u32) }; Ok(reference) } else { diff --git a/packages/wasm-dpp/src/validation/validation_result.rs b/packages/wasm-dpp/src/validation/validation_result.rs index a6630a6c125..c220f725f80 100644 --- a/packages/wasm-dpp/src/validation/validation_result.rs +++ b/packages/wasm-dpp/src/validation/validation_result.rs @@ -49,7 +49,7 @@ impl ValidationResultWasm { #[wasm_bindgen(js_name=getFirstError)] pub fn get_first_error(&self) -> JsValue { - if self.0.errors.len() > 0 { + if !self.0.errors.is_empty() { from_consensus_error_ref(&self.0.errors[0]) } else { JsValue::undefined() From 7cfd03f2c714843efcc0e3d96aec05820a8fa414 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Thu, 19 Jan 2023 12:23:51 +0000 Subject: [PATCH 60/66] refactor(wasm-dpp): unimplemented for unrecognized from_dpp error --- .../instant/instant_asset_lock_proof.rs | 11 ++++------- packages/wasm-dpp/src/errors/dpp_error.rs | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs index 0036d681df3..cba9d3f6a8f 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof.rs @@ -104,14 +104,11 @@ impl InstantAssetLockProof { pub fn out_point(&self) -> Option<[u8; 36]> { let out_point_buffer = self.transaction.out_point_buffer(self.output_index()); - // Change tx_id endianness to match js-dpp - if let Some(mut out_point_buffer) = out_point_buffer { - let (tx_id, _) = out_point_buffer.split_at_mut(32); + out_point_buffer.map(|mut buffer| { + let (tx_id, _) = buffer.split_at_mut(32); tx_id.reverse(); - Some(out_point_buffer) - } else { - None - } + buffer + }) } pub fn output(&self) -> Option<&TxOut> { diff --git a/packages/wasm-dpp/src/errors/dpp_error.rs b/packages/wasm-dpp/src/errors/dpp_error.rs index 2dbd42f7143..b68bb74833a 100644 --- a/packages/wasm-dpp/src/errors/dpp_error.rs +++ b/packages/wasm-dpp/src/errors/dpp_error.rs @@ -12,6 +12,6 @@ pub fn from_dpp_error_ref(e: &DPPError) -> JsValue { DPPError::AssetLockTransactionIsNotFoundError(e) => { AssetLockTransactionIsNotFoundErrorWasm::from(e).into() } - _ => JsValue::from(e.to_string()), + _ => unimplemented!(), } } From 741a93996bc157ede24995a3b6f08c934621a963 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Thu, 19 Jan 2023 15:11:33 +0000 Subject: [PATCH 61/66] refactor(wasm-dpp): implement validators structs instead of functions --- ...ntity_create_transition_basic_validator.rs | 9 +- ..._create_transition_basic_validator_spec.rs | 2 +- .../src/version/protocol_version_validator.rs | 4 + ...in_asset_lock_proof_structure_validator.rs | 72 +++++++++ .../asset_lock_proof/chain/mod.rs | 3 +- .../asset_lock_proof/chain/validation.rs | 46 ------ ...nt_asset_lock_proof_structure_validator.rs | 72 +++++++++ .../asset_lock_proof/instant/mod.rs | 3 +- .../asset_lock_proof/instant/validation.rs | 46 ------ ...ntity_create_transition_basic_validator.rs | 153 ++++++++++++++++++ ...ntity_create_transition_state_validator.rs | 37 +++++ .../identity_create_transition/mod.rs | 4 +- .../identity_create_transition/validation.rs | 120 -------------- .../validate_public_key_signatures.rs | 67 +++++--- ...entityCreateTransitionBasicFactory.spec.js | 83 +++++++--- ...hainAssetLockProofStructureFactory.spec.js | 12 +- ...tantAssetLockProofStructureFactory.spec.js | 45 +++--- ...validatePublicKeySignaturesFactory.spec.js | 8 +- ...entityCreateTransitionStateFactory.spec.js | 10 +- 19 files changed, 493 insertions(+), 303 deletions(-) create mode 100644 packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs delete mode 100644 packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs create mode 100644 packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs delete mode 100644 packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs create mode 100644 packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_basic_validator.rs create mode 100644 packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs delete mode 100644 packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs diff --git a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator.rs b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator.rs index 825c8ef080b..19d7a9def8e 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator.rs @@ -1,3 +1,4 @@ +use std::borrow::{Borrow, BorrowMut}; use std::sync::Arc; use lazy_static::lazy_static; @@ -24,7 +25,7 @@ const ASSET_LOCK_PROOF_PROPERTY_NAME: &str = "assetLockProof"; pub struct IdentityCreateTransitionBasicValidator { - protocol_version_validator: Arc, + protocol_version_validator: ProtocolVersionValidator, json_schema_validator: JsonSchemaValidator, public_keys_validator: Arc, public_keys_in_identity_transition_validator: Arc, @@ -42,7 +43,7 @@ impl< > IdentityCreateTransitionBasicValidator { pub fn new( - protocol_version_validator: Arc, + protocol_version_validator: ProtocolVersionValidator, public_keys_validator: Arc, public_keys_in_identity_transition_validator: Arc, asset_lock_proof_validator: Arc>, @@ -128,4 +129,8 @@ impl< Ok(result) } + + pub fn protocol_version_validator(&mut self) -> &mut ProtocolVersionValidator { + &mut self.protocol_version_validator + } } diff --git a/packages/rs-dpp/src/tests/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator_spec.rs b/packages/rs-dpp/src/tests/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator_spec.rs index 17d5613bab5..b9bba63176e 100644 --- a/packages/rs-dpp/src/tests/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator_spec.rs +++ b/packages/rs-dpp/src/tests/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator_spec.rs @@ -68,7 +68,7 @@ pub fn setup_test( ( crate::tests::fixtures::identity_create_transition_fixture_json(None), IdentityCreateTransitionBasicValidator::new( - Arc::new(protocol_version_validator), + protocol_version_validator, public_keys_validator, public_keys_transition_validator, asset_lock_proof_validator, diff --git a/packages/rs-dpp/src/version/protocol_version_validator.rs b/packages/rs-dpp/src/version/protocol_version_validator.rs index d39ef8b777e..9fbefb45e25 100644 --- a/packages/rs-dpp/src/version/protocol_version_validator.rs +++ b/packages/rs-dpp/src/version/protocol_version_validator.rs @@ -104,4 +104,8 @@ impl ProtocolVersionValidator { pub fn protocol_version(&self) -> u32 { self.current_protocol_version } + + pub fn set_current_protocol_version(&mut self, protocol_version: u32) { + self.current_protocol_version = protocol_version; + } } diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs new file mode 100644 index 00000000000..d0da578847c --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs @@ -0,0 +1,72 @@ +use dpp::identity::state_transition::asset_lock_proof::{ + AssetLockTransactionValidator, ChainAssetLockProofStructureValidator, +}; +use dpp::state_transition::state_transition_execution_context::StateTransitionExecutionContext; +use dpp::ProtocolError; +use std::sync::Arc; +use wasm_bindgen::prelude::*; + +use crate::buffer::Buffer; +use crate::utils::ToSerdeJSONExt; +use crate::{ + errors::from_dpp_err, + state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, + validation::ValidationResultWasm, + StateTransitionExecutionContextWasm, +}; + +#[wasm_bindgen(js_name = ChainAssetLockProofStructureValidator)] +pub struct ChainAssetLockProofStructureValidatorWasm( + ChainAssetLockProofStructureValidator, +); + +impl From> + for ChainAssetLockProofStructureValidatorWasm +{ + fn from( + validator: ChainAssetLockProofStructureValidator, + ) -> Self { + Self(validator) + } +} + +#[wasm_bindgen(js_class = ChainAssetLockProofStructureValidator)] +impl ChainAssetLockProofStructureValidatorWasm { + #[wasm_bindgen(constructor)] + pub fn new( + state_repository: ExternalStateRepositoryLike, + ) -> Result { + let state_repository_wrapper = + Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository)); + + let tx_validator = Arc::new(AssetLockTransactionValidator::new( + state_repository_wrapper.clone(), + )); + + let validator = + ChainAssetLockProofStructureValidator::new(state_repository_wrapper, tx_validator) + .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; + + Ok(validator.into()) + } + + #[wasm_bindgen(js_name=validate)] + pub async fn validate( + &self, + raw_asset_lock_proof: JsValue, + execution_context: &StateTransitionExecutionContextWasm, + ) -> Result { + let asset_lock_proof_json = raw_asset_lock_proof.with_serde_to_json_value()?; + + let context: &StateTransitionExecutionContext = execution_context.into(); + let validation_result = self + .0 + .validate(&asset_lock_proof_json, context) + .await + .map_err(|e| from_dpp_err(e.into()))?; + + Ok(validation_result + .map(|item| JsValue::from(Buffer::from_bytes(&item))) + .into()) + } +} diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs index ac6d7dc626f..0b72aa9341d 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/mod.rs @@ -1,5 +1,4 @@ pub use chain_asset_lock_proof::*; -pub use validation::*; pub mod chain_asset_lock_proof; -pub mod validation; +pub mod chain_asset_lock_proof_structure_validator; diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs deleted file mode 100644 index 0f6a2753631..00000000000 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/validation.rs +++ /dev/null @@ -1,46 +0,0 @@ -use dpp::identity::state_transition::asset_lock_proof::{ - AssetLockTransactionValidator, ChainAssetLockProofStructureValidator, -}; -use dpp::state_transition::state_transition_execution_context::StateTransitionExecutionContext; -use dpp::ProtocolError; -use std::sync::Arc; -use wasm_bindgen::prelude::*; - -use crate::buffer::Buffer; -use crate::utils::ToSerdeJSONExt; -use crate::{ - errors::from_dpp_err, - state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, - validation::ValidationResultWasm, - StateTransitionExecutionContextWasm, -}; - -#[wasm_bindgen(js_name=validateChainAssetLockProofStructure)] -pub async fn validate_chain_asset_lock_proof_structure( - state_repository: ExternalStateRepositoryLike, - raw_asset_lock_proof: JsValue, - execution_context: &StateTransitionExecutionContextWasm, -) -> Result { - let state_repository_wrapper = - Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository)); - - let asset_lock_proof_json = raw_asset_lock_proof.with_serde_to_json_value()?; - - let tx_validator = Arc::new(AssetLockTransactionValidator::new( - state_repository_wrapper.clone(), - )); - - let validator = - ChainAssetLockProofStructureValidator::new(state_repository_wrapper, tx_validator) - .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; - - let context: &StateTransitionExecutionContext = execution_context.into(); - let validation_result = validator - .validate(&asset_lock_proof_json, context) - .await - .map_err(|e| from_dpp_err(e.into()))?; - - Ok(validation_result - .map(|item| JsValue::from(Buffer::from_bytes(&item))) - .into()) -} diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs new file mode 100644 index 00000000000..28083192d91 --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs @@ -0,0 +1,72 @@ +use dpp::identity::state_transition::asset_lock_proof::{ + AssetLockTransactionValidator, InstantAssetLockProofStructureValidator, +}; +use dpp::state_transition::state_transition_execution_context::StateTransitionExecutionContext; +use dpp::ProtocolError; +use std::sync::Arc; +use wasm_bindgen::prelude::*; + +use crate::buffer::Buffer; +use crate::utils::ToSerdeJSONExt; +use crate::{ + errors::from_dpp_err, + state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, + validation::ValidationResultWasm, + StateTransitionExecutionContextWasm, +}; + +#[wasm_bindgen(js_name = InstantAssetLockProofStructureValidator)] +pub struct InstantAssetLockProofStructureValidatorWasm( + InstantAssetLockProofStructureValidator, +); + +impl From> + for InstantAssetLockProofStructureValidatorWasm +{ + fn from( + validator: InstantAssetLockProofStructureValidator, + ) -> Self { + Self(validator) + } +} + +#[wasm_bindgen(js_class = InstantAssetLockProofStructureValidator)] +impl InstantAssetLockProofStructureValidatorWasm { + #[wasm_bindgen(constructor)] + pub fn new( + state_repository: ExternalStateRepositoryLike, + ) -> Result { + let state_repository_wrapper = + Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository)); + + let tx_validator = Arc::new(AssetLockTransactionValidator::new( + state_repository_wrapper.clone(), + )); + + let validator = + InstantAssetLockProofStructureValidator::new(state_repository_wrapper, tx_validator) + .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; + + Ok(validator.into()) + } + + #[wasm_bindgen(js_name=validate)] + pub async fn validate( + &self, + raw_asset_lock_proof: JsValue, + execution_context: &StateTransitionExecutionContextWasm, + ) -> Result { + let asset_lock_proof_json = raw_asset_lock_proof.with_serde_to_json_value()?; + + let context: &StateTransitionExecutionContext = execution_context.into(); + let validation_result = self + .0 + .validate(&asset_lock_proof_json, context) + .await + .map_err(|e| from_dpp_err(e.into()))?; + + Ok(validation_result + .map(|item| JsValue::from(Buffer::from_bytes(&item))) + .into()) + } +} diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/mod.rs index 920a86120b0..0910a2360a5 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/mod.rs @@ -1,5 +1,4 @@ pub use instant_asset_lock_proof::*; -pub use validation::*; pub mod instant_asset_lock_proof; -pub mod validation; +pub mod instant_asset_lock_proof_structure_validator; diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs deleted file mode 100644 index c03354599c8..00000000000 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/validation.rs +++ /dev/null @@ -1,46 +0,0 @@ -use dpp::identity::state_transition::asset_lock_proof::{ - AssetLockTransactionValidator, InstantAssetLockProofStructureValidator, -}; -use dpp::state_transition::state_transition_execution_context::StateTransitionExecutionContext; -use dpp::ProtocolError; -use std::sync::Arc; -use wasm_bindgen::prelude::*; - -use crate::buffer::Buffer; -use crate::utils::ToSerdeJSONExt; -use crate::{ - errors::from_dpp_err, - state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, - validation::ValidationResultWasm, - StateTransitionExecutionContextWasm, -}; - -#[wasm_bindgen(js_name=validateInstantAssetLockProofStructure)] -pub async fn validate_instant_asset_lock_proof_structure( - state_repository: ExternalStateRepositoryLike, // TODO: test with wrapper? - raw_asset_lock_proof: JsValue, - execution_context: &StateTransitionExecutionContextWasm, -) -> Result { - let state_repository_wrapper = - Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository)); - - let asset_lock_proof_json = raw_asset_lock_proof.with_serde_to_json_value()?; - - let tx_validator = Arc::new(AssetLockTransactionValidator::new( - state_repository_wrapper.clone(), - )); - - let validator = - InstantAssetLockProofStructureValidator::new(state_repository_wrapper, tx_validator) - .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; - - let context: &StateTransitionExecutionContext = execution_context.into(); - let validation_result = validator - .validate(&asset_lock_proof_json, context) - .await - .map_err(|e| from_dpp_err(e.into()))?; - - Ok(validation_result - .map(|item| JsValue::from(Buffer::from_bytes(&item))) - .into()) -} diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_basic_validator.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_basic_validator.rs new file mode 100644 index 00000000000..0ea27d1e967 --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_basic_validator.rs @@ -0,0 +1,153 @@ +use dpp::identity::state_transition::asset_lock_proof::{ + AssetLockProofValidator, AssetLockTransactionValidator, ChainAssetLockProofStructureValidator, + InstantAssetLockProofStructureValidator, +}; +use dpp::identity::state_transition::identity_create_transition::validation::basic::IdentityCreateTransitionBasicValidator; +use dpp::identity::state_transition::validate_public_key_signatures::PublicKeysSignaturesValidator; +use dpp::identity::validation::{ + PublicKeysValidator, RequiredPurposeAndSecurityLevelValidator, PUBLIC_KEY_SCHEMA_FOR_TRANSITION, +}; +use dpp::state_transition::state_transition_execution_context::StateTransitionExecutionContext; + +use dpp::version::{ProtocolVersionValidator, COMPATIBILITY_MAP, LATEST_VERSION}; +use dpp::ProtocolError; + +use std::sync::Arc; +use wasm_bindgen::prelude::*; + +use crate::bls_adapter::{BlsAdapter, JsBlsAdapter}; +use crate::errors::from_dpp_err; +use crate::utils::ToSerdeJSONExt; +use crate::{ + state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, + validation::ValidationResultWasm, + StateTransitionExecutionContextWasm, +}; + +#[wasm_bindgen(js_name=IdentityCreateTransitionBasicValidator)] +pub struct IdentityCreateTransitionBasicValidatorWasm( + IdentityCreateTransitionBasicValidator< + PublicKeysValidator, + RequiredPurposeAndSecurityLevelValidator, + ExternalStateRepositoryLikeWrapper, + PublicKeysSignaturesValidator, + BlsAdapter, + >, +); + +impl + From< + IdentityCreateTransitionBasicValidator< + PublicKeysValidator, + RequiredPurposeAndSecurityLevelValidator, + ExternalStateRepositoryLikeWrapper, + PublicKeysSignaturesValidator, + BlsAdapter, + >, + > for IdentityCreateTransitionBasicValidatorWasm +{ + fn from( + validator: IdentityCreateTransitionBasicValidator< + PublicKeysValidator, + RequiredPurposeAndSecurityLevelValidator, + ExternalStateRepositoryLikeWrapper, + PublicKeysSignaturesValidator, + BlsAdapter, + >, + ) -> Self { + Self(validator) + } +} + +#[wasm_bindgen(js_class=IdentityCreateTransitionBasicValidator)] +impl IdentityCreateTransitionBasicValidatorWasm { + #[wasm_bindgen(constructor)] + pub fn new( + state_repository: ExternalStateRepositoryLike, + js_bls: JsBlsAdapter, + ) -> Result { + let state_repository_wrapper = + Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository)); + + let protocol_version_validator = ProtocolVersionValidator::new( + LATEST_VERSION, + LATEST_VERSION, + COMPATIBILITY_MAP.clone(), + ); + + let public_keys_validator = PublicKeysValidator::new_with_schema( + PUBLIC_KEY_SCHEMA_FOR_TRANSITION.clone(), + BlsAdapter(js_bls.clone()), + ) + .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; + + let public_keys_transition_validator = RequiredPurposeAndSecurityLevelValidator::default(); + + let asset_lock_proof_validator: AssetLockProofValidator< + ExternalStateRepositoryLikeWrapper, + >; + { + let tx_validator = Arc::new(AssetLockTransactionValidator::new( + state_repository_wrapper.clone(), + )); + + let instant_asset_lock_proof_validator = InstantAssetLockProofStructureValidator::new( + state_repository_wrapper.clone(), + tx_validator.clone(), + ) + .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; + + let chain_asset_lock_proof_validator = + ChainAssetLockProofStructureValidator::new(state_repository_wrapper, tx_validator) + .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; + + asset_lock_proof_validator = AssetLockProofValidator::new( + instant_asset_lock_proof_validator, + chain_asset_lock_proof_validator, + ); + } + + let public_keys_signature_validator = + PublicKeysSignaturesValidator::new(BlsAdapter(js_bls.clone())); + + let validator = IdentityCreateTransitionBasicValidator::new( + protocol_version_validator, + Arc::new(public_keys_validator), + Arc::new(public_keys_transition_validator), + Arc::new(asset_lock_proof_validator), + BlsAdapter(js_bls), + public_keys_signature_validator, + ) + .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; + + Ok(validator.into()) + } + + #[wasm_bindgen(js_name=validate)] + pub async fn validate( + mut self, + raw_state_transition: JsValue, + execution_context: &StateTransitionExecutionContextWasm, + ) -> Result { + let execution_context: &StateTransitionExecutionContext = execution_context.into(); + + let current_protocol_version = + js_sys::Reflect::get(&raw_state_transition, &"protocolVersion".into()) + .map(|v| v.as_f64().unwrap_or(LATEST_VERSION as f64) as u32) + .unwrap_or(LATEST_VERSION); + + self.0 + .protocol_version_validator() + .set_current_protocol_version(current_protocol_version); + + let state_transition_json = raw_state_transition.with_serde_to_json_value()?; + + let validation_result = self + .0 + .validate(&state_transition_json, execution_context) + .await + .map_err(|e| from_dpp_err(e.into()))?; + + Ok(validation_result.map(|_| JsValue::undefined()).into()) + } +} diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs new file mode 100644 index 00000000000..abef0767251 --- /dev/null +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs @@ -0,0 +1,37 @@ +use crate::errors::from_dpp_err; +use crate::state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}; +use crate::validation::ValidationResultWasm; +use crate::IdentityCreateTransitionWasm; +use dpp::identity::state_transition::identity_create_transition::validation::state::validate_identity_create_transition_state; +use wasm_bindgen::prelude::*; +use wasm_bindgen::JsValue; + +#[wasm_bindgen(js_name=IdentityCreateTransitionStateValidator)] +pub struct IdentityCreateTransitionStateValidator { + state_repository: ExternalStateRepositoryLikeWrapper, +} + +#[wasm_bindgen(js_class=IdentityCreateTransitionStateValidator)] +impl IdentityCreateTransitionStateValidator { + #[wasm_bindgen(constructor)] + pub fn new(state_repository: ExternalStateRepositoryLike) -> Self { + Self { + state_repository: ExternalStateRepositoryLikeWrapper::new(state_repository), + } + } + + #[wasm_bindgen(js_name = validate)] + pub async fn validate( + &self, + state_transition: &IdentityCreateTransitionWasm, + ) -> Result { + let validation_result = validate_identity_create_transition_state( + &self.state_repository, + state_transition.to_owned().clone().into(), + ) + .await + .map_err(|e| from_dpp_err(e.into()))?; + + Ok(validation_result.map(|_| JsValue::undefined()).into()) + } +} diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs index 8b8a174a9f5..e2c7d563d9f 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/mod.rs @@ -1,8 +1,8 @@ pub use identity_create_transition::*; -pub use validation::*; pub mod apply_identity_create_transition; pub mod identity_create_transition; -pub mod validation; +pub mod identity_create_transition_basic_validator; +pub mod identity_create_transition_state_validator; mod to_object; diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs deleted file mode 100644 index 3963d649118..00000000000 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/validation.rs +++ /dev/null @@ -1,120 +0,0 @@ -use dpp::identity::state_transition::asset_lock_proof::{ - AssetLockProofValidator, AssetLockTransactionValidator, ChainAssetLockProofStructureValidator, - InstantAssetLockProofStructureValidator, -}; -use dpp::identity::state_transition::identity_create_transition::validation::basic::IdentityCreateTransitionBasicValidator; -use dpp::identity::state_transition::identity_create_transition::validation::state::validate_identity_create_transition_state; -use dpp::identity::state_transition::validate_public_key_signatures::PublicKeysSignaturesValidator; -use dpp::identity::validation::{ - PublicKeysValidator, RequiredPurposeAndSecurityLevelValidator, PUBLIC_KEY_SCHEMA_FOR_TRANSITION, -}; -use dpp::state_transition::state_transition_execution_context::StateTransitionExecutionContext; - -use dpp::version::{ProtocolVersionValidator, COMPATIBILITY_MAP, LATEST_VERSION}; -use dpp::ProtocolError; - -use std::sync::Arc; -use wasm_bindgen::prelude::*; - -use crate::bls_adapter::{BlsAdapter, JsBlsAdapter}; -use crate::errors::from_dpp_err; -use crate::utils::ToSerdeJSONExt; -use crate::{ - state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}, - validation::ValidationResultWasm, - IdentityCreateTransitionWasm, StateTransitionExecutionContextWasm, -}; - -#[wasm_bindgen(js_name=validateIdentityCreateTransitionState)] -pub async fn validate_identity_create_transition_state_wasm( - state_repository: ExternalStateRepositoryLike, - state_transition: &IdentityCreateTransitionWasm, -) -> Result { - let wrapped_state_repository = ExternalStateRepositoryLikeWrapper::new(state_repository); - let validation_result = validate_identity_create_transition_state( - &wrapped_state_repository, - state_transition.to_owned().clone().into(), - ) - .await - .map_err(|e| from_dpp_err(e.into()))?; - - Ok(validation_result.map(|_| JsValue::undefined()).into()) -} - -#[wasm_bindgen(js_name=validateIdentityCreateTransitionBasic)] -pub async fn validate_identity_create_transition_basic_wasm( - state_repository: ExternalStateRepositoryLike, - raw_state_transition: JsValue, - js_bls: JsBlsAdapter, - execution_context: &StateTransitionExecutionContextWasm, -) -> Result { - let execution_context: &StateTransitionExecutionContext = execution_context.into(); - - let state_repository_wrapper = - Arc::new(ExternalStateRepositoryLikeWrapper::new(state_repository)); - - let current_protocol_version = - js_sys::Reflect::get(&raw_state_transition, &"protocolVersion".into()) - .map(|v| v.as_f64().unwrap_or(LATEST_VERSION as f64) as u32) - .unwrap_or(LATEST_VERSION); - - let state_transition_json = raw_state_transition.with_serde_to_json_value()?; - - let protocol_version_validator = ProtocolVersionValidator::new( - current_protocol_version, - LATEST_VERSION, - COMPATIBILITY_MAP.clone(), - ); - - let public_keys_validator = PublicKeysValidator::new_with_schema( - PUBLIC_KEY_SCHEMA_FOR_TRANSITION.clone(), - BlsAdapter(js_bls.clone()), - ) - .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; - - let public_keys_transition_validator = RequiredPurposeAndSecurityLevelValidator::default(); - - let asset_lock_proof_validator: AssetLockProofValidator; - { - let tx_validator = Arc::new(AssetLockTransactionValidator::new( - state_repository_wrapper.clone(), - )); - - let instant_asset_lock_proof_validator = InstantAssetLockProofStructureValidator::new( - state_repository_wrapper.clone(), - tx_validator.clone(), - ) - .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; - - let chain_asset_lock_proof_validator = ChainAssetLockProofStructureValidator::new( - state_repository_wrapper.clone(), - tx_validator, - ) - .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; - - asset_lock_proof_validator = AssetLockProofValidator::new( - instant_asset_lock_proof_validator, - chain_asset_lock_proof_validator, - ); - } - - let public_keys_signature_validator = - PublicKeysSignaturesValidator::new(BlsAdapter(js_bls.clone())); - - let validator = IdentityCreateTransitionBasicValidator::new( - Arc::new(protocol_version_validator), - Arc::new(public_keys_validator), - Arc::new(public_keys_transition_validator), - Arc::new(asset_lock_proof_validator), - BlsAdapter(js_bls.clone()), - public_keys_signature_validator, - ) - .map_err(|e| from_dpp_err(ProtocolError::Generic(e.to_string())))?; - - let validation_result = validator - .validate(&state_transition_json, execution_context) - .await - .map_err(|e| from_dpp_err(e.into()))?; - - Ok(validation_result.map(|_| JsValue::undefined()).into()) -} diff --git a/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs b/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs index e77125dca64..6d6231887f4 100644 --- a/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs +++ b/packages/wasm-dpp/src/identity/state_transition/validate_public_key_signatures.rs @@ -15,30 +15,45 @@ use serde_json::Value as JsonValue; use wasm_bindgen::prelude::wasm_bindgen; use wasm_bindgen::JsValue; -#[wasm_bindgen(js_name=validatePublicKeySignatures)] -pub fn validate_public_key_signatures( - raw_state_transition: JsValue, - raw_public_keys: Vec, - bls: JsBlsAdapter, -) -> Result { - let bls_adapter = BlsAdapter(bls); - - let state_transition_json = raw_state_transition.with_serde_to_json_value()?; - - let public_keys = raw_public_keys - .into_iter() - .map(|raw_key| { - let parsed_key: IdentityPublicKey = IdentityPublicKeyWasm::new(raw_key)?.into(); - parsed_key - .to_raw_json_object(false) - .map_err(|e| from_dpp_err(e.into())) - }) - .collect::, JsValue>>()?; - - let validator = PublicKeysSignaturesValidator::new(bls_adapter); - let result = validator - .validate_public_key_signatures(&state_transition_json, &public_keys) - .map_err(|e| from_dpp_err(e.into()))?; - - Ok(result.map(|_| JsValue::undefined()).into()) +#[wasm_bindgen(js_name = PublicKeysSignaturesValidator)] +pub struct PublicKeysSignaturesValidatorWasm(PublicKeysSignaturesValidator); + +impl From> for PublicKeysSignaturesValidatorWasm { + fn from(validator: PublicKeysSignaturesValidator) -> Self { + Self(validator) + } +} + +#[wasm_bindgen(js_class = PublicKeysSignaturesValidator)] +impl PublicKeysSignaturesValidatorWasm { + #[wasm_bindgen(constructor)] + pub fn new(bls: JsBlsAdapter) -> PublicKeysSignaturesValidatorWasm { + PublicKeysSignaturesValidator::new(BlsAdapter(bls)).into() + } + + #[wasm_bindgen(js_name=validate)] + pub fn validate_public_key_signatures( + &self, + raw_state_transition: JsValue, + raw_public_keys: Vec, + ) -> Result { + let state_transition_json = raw_state_transition.with_serde_to_json_value()?; + + let public_keys = raw_public_keys + .into_iter() + .map(|raw_key| { + let parsed_key: IdentityPublicKey = IdentityPublicKeyWasm::new(raw_key)?.into(); + parsed_key + .to_raw_json_object(false) + .map_err(|e| from_dpp_err(e.into())) + }) + .collect::, JsValue>>()?; + + let result = self + .0 + .validate_public_key_signatures(&state_transition_json, &public_keys) + .map_err(|e| from_dpp_err(e.into()))?; + + Ok(result.map(|_| JsValue::undefined()).into()) + } } diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js index 2f3f80c0acf..65d08c5ef2a 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityCreateTransition/validation/basic/validateIdentityCreateTransitionBasicFactory.spec.js @@ -13,6 +13,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { let stateRepositoryMock; let mockIdentityPublicKey; + let executionContext; let validateIdentityCreateTransitionBasic; @@ -24,11 +25,10 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { let InvalidIdentityPublicKeySecurityLevelError; let InvalidIdentityPublicKeyDataError; let InvalidIdentityKeySignatureError; - let validateIdentityCreateTransitionBasicDPP; + let IdentityCreateTransitionBasicValidator; before(async () => { ({ - validateIdentityCreateTransitionBasic: validateIdentityCreateTransitionBasicDPP, IdentityCreateTransition, StateTransitionExecutionContext, UnsupportedProtocolVersionError, @@ -37,6 +37,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { InvalidIdentityPublicKeyDataError, InvalidIdentityKeySignatureError, IdentityPublicKey, + IdentityCreateTransitionBasicValidator, } = await loadWasmDpp()); mockIdentityPublicKey = (publicKey, opts = {}) => new IdentityPublicKey({ @@ -54,16 +55,12 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); stateRepositoryMock.verifyInstantLock.returns(true); - const executionContext = new StateTransitionExecutionContext(); + executionContext = new StateTransitionExecutionContext(); const blsAdapter = await getBlsAdapterMock(); - validateIdentityCreateTransitionBasic = (st) => validateIdentityCreateTransitionBasicDPP( - stateRepositoryMock, - st, - blsAdapter, - executionContext, - ); + const validator = new IdentityCreateTransitionBasicValidator(stateRepositoryMock, blsAdapter); + validateIdentityCreateTransitionBasic = (st, context) => validator.validate(st, context); const stateTransitionJS = getIdentityCreateTransitionFixture(); stateTransition = new IdentityCreateTransition(stateTransitionJS.toObject()); @@ -92,7 +89,10 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { it('should be present', async () => { delete rawStateTransition.protocolVersion; - const result = await validateIdentityCreateTransitionBasic(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic( + rawStateTransition, + executionContext, + ); await expectJsonSchemaError(result); @@ -106,7 +106,10 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { it('should be an integer', async () => { rawStateTransition.protocolVersion = '1'; - const result = await validateIdentityCreateTransitionBasic(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic( + rawStateTransition, + executionContext, + ); await expectJsonSchemaError(result); @@ -119,7 +122,10 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { it('should be valid', async () => { rawStateTransition.protocolVersion = 1000; - const result = await validateIdentityCreateTransitionBasic(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic( + rawStateTransition, + executionContext, + ); await expectValidationError(result, UnsupportedProtocolVersionError); }); @@ -129,7 +135,10 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { it('should be present', async () => { delete rawStateTransition.type; - const result = await validateIdentityCreateTransitionBasic(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic( + rawStateTransition, + executionContext, + ); await expectJsonSchemaError(result); @@ -143,7 +152,10 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { it('should be equal to 2', async () => { rawStateTransition.type = 666; - const result = await validateIdentityCreateTransitionBasic(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic( + rawStateTransition, + executionContext, + ); await expectJsonSchemaError(result); @@ -161,6 +173,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const result = await validateIdentityCreateTransitionBasic( rawStateTransition, + executionContext, ); await expectJsonSchemaError(result); @@ -175,7 +188,10 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { it('should be an object', async () => { rawStateTransition.assetLockProof = 1; - const result = await validateIdentityCreateTransitionBasic(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic( + rawStateTransition, + executionContext, + ); await expectJsonSchemaError(result, 1); @@ -188,7 +204,10 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { it('should be valid', async () => { stateRepositoryMock.verifyInstantLock.returns(false); - const result = await validateIdentityCreateTransitionBasic(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic( + rawStateTransition, + executionContext, + ); await expectValidationError(result); @@ -204,6 +223,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const result = await validateIdentityCreateTransitionBasic( rawStateTransition, + executionContext, ); await expectJsonSchemaError(result); @@ -220,6 +240,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const result = await validateIdentityCreateTransitionBasic( rawStateTransition, + executionContext, ); await expectJsonSchemaError(result); @@ -239,6 +260,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const result = await validateIdentityCreateTransitionBasic( rawStateTransition, + executionContext, ); await expectJsonSchemaError(result); @@ -254,6 +276,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const result = await validateIdentityCreateTransitionBasic( rawStateTransition, + executionContext, ); await expectJsonSchemaError(result); @@ -282,6 +305,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const result = await validateIdentityCreateTransitionBasic( rawStateTransition, + executionContext, ); await expectValidationError(result, InvalidIdentityPublicKeyDataError); @@ -306,6 +330,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const result = await validateIdentityCreateTransitionBasic( rawStateTransition, + executionContext, ); await expectValidationError(result, InvalidIdentityPublicKeySecurityLevelError); @@ -318,6 +343,7 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { const result = await validateIdentityCreateTransitionBasic( rawStateTransition, + executionContext, ); await expectValidationError(result, InvalidIdentityKeySignatureError); @@ -328,7 +354,10 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { it('should be present', async () => { delete rawStateTransition.signature; - const result = await validateIdentityCreateTransitionBasic(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic( + rawStateTransition, + executionContext, + ); await expectJsonSchemaError(result); @@ -342,7 +371,10 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { it('should be a byte array', async () => { rawStateTransition.signature = new Array(65).fill('string'); - const result = await validateIdentityCreateTransitionBasic(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic( + rawStateTransition, + executionContext, + ); await expectJsonSchemaError(result, 65); @@ -359,7 +391,10 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { it('should be not shorter than 65 bytes', async () => { rawStateTransition.signature = Buffer.alloc(64); - const result = await validateIdentityCreateTransitionBasic(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic( + rawStateTransition, + executionContext, + ); await expectJsonSchemaError(result); @@ -372,7 +407,10 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { it('should be not longer than 65 bytes', async () => { rawStateTransition.signature = Buffer.alloc(66); - const result = await validateIdentityCreateTransitionBasic(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic( + rawStateTransition, + executionContext, + ); await expectJsonSchemaError(result); @@ -384,7 +422,10 @@ describe('validateIdentityCreateTransitionBasicFactory', () => { }); it('should return valid result', async () => { - const result = await validateIdentityCreateTransitionBasic(rawStateTransition); + const result = await validateIdentityCreateTransitionBasic( + rawStateTransition, + executionContext, + ); expect(result.isValid()).to.be.true(); }); diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js index 5dd0a1aeb16..46131521e36 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js @@ -23,8 +23,7 @@ describe('validateChainAssetLockProofStructureFactory', () => { let IdentityAssetLockTransactionIsNotFoundError; let InvalidIdentityAssetLockTransactionOutputError; let InvalidAssetLockProofTransactionHeightError; - - let validateChainAssetLockProofStructureDPP; + let ChainAssetLockProofStructureValidator; before(async () => { ({ @@ -34,7 +33,7 @@ describe('validateChainAssetLockProofStructureFactory', () => { IdentityAssetLockTransactionIsNotFoundError, InvalidIdentityAssetLockTransactionOutputError, InvalidAssetLockProofTransactionHeightError, - validateChainAssetLockProofStructure: validateChainAssetLockProofStructureDPP, + ChainAssetLockProofStructureValidator, } = await loadWasmDpp()); }); @@ -63,10 +62,13 @@ describe('validateChainAssetLockProofStructureFactory', () => { publicKeyHash = Buffer.from('152073ca2300a86b510fa2f123d3ea7da3af68dc', 'hex'); + const validator = new ChainAssetLockProofStructureValidator( + stateRepositoryMock, + ); + validateChainAssetLockProofStructure = ( proof, context, - ) => validateChainAssetLockProofStructureDPP( - stateRepositoryMock, + ) => validator.validate( rawProof, context, ); }); diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js index b3d3ee9d1f0..6fe624a59a3 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/instant/validateInstantAssetLockProofStructureFactory.spec.js @@ -20,9 +20,9 @@ describe('validateInstantAssetLockProofStructureFactory', () => { let IdentityAssetLockProofLockedTransactionMismatchError; let InvalidInstantAssetLockProofSignatureError; let InvalidIdentityAssetLockTransactionError; + let InstantAssetLockProofStructureValidator; let validateInstantAssetLockProofStructure; - let validateInstantAssetLockProofStructureDPP; before(async () => { ({ @@ -32,7 +32,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { IdentityAssetLockProofLockedTransactionMismatchError, InvalidInstantAssetLockProofSignatureError, InvalidIdentityAssetLockTransactionError, - validateInstantAssetLockProofStructure: validateInstantAssetLockProofStructureDPP, + InstantAssetLockProofStructureValidator, } = await loadWasmDpp()); }); @@ -47,10 +47,10 @@ describe('validateInstantAssetLockProofStructureFactory', () => { executionContext = new StateTransitionExecutionContext(); - validateInstantAssetLockProofStructure = (proof) => validateInstantAssetLockProofStructureDPP( - stateRepositoryMock, + const validator = new InstantAssetLockProofStructureValidator(stateRepositoryMock); + validateInstantAssetLockProofStructure = (proof, context) => validator.validate( proof, - executionContext, + context, ); }); @@ -58,7 +58,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should be present', async () => { delete rawProof.type; - const result = await validateInstantAssetLockProofStructure(rawProof); + const result = await validateInstantAssetLockProofStructure(rawProof, executionContext); await expectJsonSchemaError(result); @@ -74,7 +74,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should be equal to 0', async () => { rawProof.type = -1; - const result = await validateInstantAssetLockProofStructure(rawProof); + const result = await validateInstantAssetLockProofStructure(rawProof, executionContext); await expectJsonSchemaError(result); @@ -91,7 +91,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should be present', async () => { delete rawProof.instantLock; - const result = await validateInstantAssetLockProofStructure(rawProof); + const result = await validateInstantAssetLockProofStructure(rawProof, executionContext); await expectJsonSchemaError(result); @@ -107,7 +107,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should be a byte array', async () => { rawProof.instantLock = new Array(165).fill('string'); - const result = await validateInstantAssetLockProofStructure(rawProof); + const result = await validateInstantAssetLockProofStructure(rawProof, executionContext); await expectJsonSchemaError(result, 165); @@ -122,7 +122,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should not be shorter than 160 bytes', async () => { rawProof.instantLock = Buffer.alloc(159); - const result = await validateInstantAssetLockProofStructure(rawProof); + const result = await validateInstantAssetLockProofStructure(rawProof, executionContext); await expectJsonSchemaError(result); @@ -137,7 +137,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should not be longer than 100 Kb', async () => { rawProof.instantLock = Buffer.alloc(100001); - const result = await validateInstantAssetLockProofStructure(rawProof); + const result = await validateInstantAssetLockProofStructure(rawProof, executionContext); await expectJsonSchemaError(result); @@ -152,7 +152,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should be valid', async () => { rawProof.instantLock = Buffer.alloc(200); - const result = await validateInstantAssetLockProofStructure(rawProof); + const result = await validateInstantAssetLockProofStructure(rawProof, executionContext); await expectValidationError(result, InvalidInstantAssetLockProofError); const [error] = result.getErrors(); @@ -169,7 +169,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { instantLockParsed.txid = txId.toString('hex'); rawProof.instantLock = instantLockParsed.toBuffer(); - const result = await validateInstantAssetLockProofStructure(rawProof); + const result = await validateInstantAssetLockProofStructure(rawProof, executionContext); await expectValidationError( result, @@ -188,7 +188,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should have valid signature', async () => { stateRepositoryMock.verifyInstantLock.resolves(false); - const result = await validateInstantAssetLockProofStructure(rawProof); + const result = await validateInstantAssetLockProofStructure(rawProof, executionContext); await expectValidationError( result, @@ -207,7 +207,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should be present', async () => { delete rawProof.transaction; - const result = await validateInstantAssetLockProofStructure(rawProof); + const result = await validateInstantAssetLockProofStructure(rawProof, executionContext); await expectJsonSchemaError(result); @@ -223,7 +223,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should be a byte array', async () => { rawProof.transaction = new Array(65).fill('string'); - const result = await validateInstantAssetLockProofStructure(rawProof); + const result = await validateInstantAssetLockProofStructure(rawProof, executionContext); await expectJsonSchemaError(result, 65); @@ -238,7 +238,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should not be shorter than 1 byte', async () => { rawProof.transaction = Buffer.alloc(0); - const result = await validateInstantAssetLockProofStructure(rawProof); + const result = await validateInstantAssetLockProofStructure(rawProof, executionContext); await expectJsonSchemaError(result); @@ -253,7 +253,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should not be longer than 100 Kb', async () => { rawProof.transaction = Buffer.alloc(100001); - const result = await validateInstantAssetLockProofStructure(rawProof); + const result = await validateInstantAssetLockProofStructure(rawProof, executionContext); await expectJsonSchemaError(result); @@ -268,7 +268,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should should be valid', async () => { rawProof.transaction = Buffer.alloc(1000); - const result = await validateInstantAssetLockProofStructure(rawProof); + const result = await validateInstantAssetLockProofStructure(rawProof, executionContext); await expectValidationError(result, InvalidIdentityAssetLockTransactionError); @@ -285,7 +285,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should be present', async () => { delete rawProof.outputIndex; - const result = await validateInstantAssetLockProofStructure(rawProof); + const result = await validateInstantAssetLockProofStructure(rawProof, executionContext); await expectJsonSchemaError(result); @@ -301,7 +301,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should be an integer', async () => { rawProof.outputIndex = 1.1; - const result = await validateInstantAssetLockProofStructure(rawProof); + const result = await validateInstantAssetLockProofStructure(rawProof, executionContext); await expectJsonSchemaError(result, 1); @@ -316,7 +316,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should not be less than 0', async () => { rawProof.outputIndex = -1; - const result = await validateInstantAssetLockProofStructure(rawProof); + const result = await validateInstantAssetLockProofStructure(rawProof, executionContext); await expectJsonSchemaError(result); @@ -332,6 +332,7 @@ describe('validateInstantAssetLockProofStructureFactory', () => { it('should return valid result', async () => { const result = await validateInstantAssetLockProofStructure( rawProof, + executionContext, ); expect(result).to.be.an.instanceOf(ValidationResult); diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js index c0de3cca256..94831e750b5 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js @@ -14,12 +14,13 @@ const { default: loadWasmDpp } = require('../../../../dist'); describe('validatePublicKeySignaturesFactory', () => { let identityCreateTransition; let rawIdentityCreateTransition; + let validatePublicKeySignatures; let IdentityCreateTransition; let IdentityPublicKey; let InvalidIdentityKeySignatureError; let ValidationResult; - let validatePublicKeySignatures; + let PublicKeysSignaturesValidator; let blsAdapter; before(async () => { @@ -27,7 +28,7 @@ describe('validatePublicKeySignaturesFactory', () => { IdentityCreateTransition, IdentityPublicKey, InvalidIdentityKeySignatureError, - validatePublicKeySignatures, + PublicKeysSignaturesValidator, ValidationResult, } = await loadWasmDpp()); }); @@ -118,6 +119,9 @@ describe('validatePublicKeySignaturesFactory', () => { ]); rawIdentityCreateTransition = identityCreateTransition.toObject(); + + const validator = new PublicKeysSignaturesValidator(blsAdapter); + validatePublicKeySignatures = (stateTransition, keys) => validator.validate(stateTransition, keys); }); it('should return InvalidIdentityKeySignatureError if signature is not valid', async () => { diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js index 97809751807..d5db06e4794 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/validation/state/validateIdentityCreateTransitionStateFactory.spec.js @@ -17,8 +17,7 @@ describe('validateIdentityCreateTransitionStateFactory', () => { let IdentityPublicKey; let IdentityAlreadyExistsError; let Identity; - - let validateIdentityCreateTransitionStateDPP; + let IdentityCreateTransitionStateValidator; before(async () => { ({ @@ -26,7 +25,7 @@ describe('validateIdentityCreateTransitionStateFactory', () => { IdentityAlreadyExistsError, IdentityPublicKey, Identity, - validateIdentityCreateTransitionState: validateIdentityCreateTransitionStateDPP, + IdentityCreateTransitionStateValidator, } = await loadWasmDpp()); }); @@ -34,9 +33,8 @@ describe('validateIdentityCreateTransitionStateFactory', () => { const privateKey = Buffer.from('af432c476f65211f45f48f1d42c9c0b497e56696aa1736b40544ef1a496af837', 'hex'); stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); - validateIdentityCreateTransitionState = (st) => validateIdentityCreateTransitionStateDPP( - stateRepositoryMock, st, - ); + const validator = new IdentityCreateTransitionStateValidator(stateRepositoryMock); + validateIdentityCreateTransitionState = (st) => validator.validate(st); stateTransition = new IdentityCreateTransition( getIdentityCreateTransitionFixture().toObject(), From e36b6348f5ce6be9efd9475af9ae56856e85bf2f Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Thu, 19 Jan 2023 15:19:41 +0000 Subject: [PATCH 62/66] refactor(wasm-dpp): eslint --- .../validatePublicKeySignaturesFactory.spec.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js index 94831e750b5..9d7abd0c0a1 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/validatePublicKeySignaturesFactory.spec.js @@ -121,7 +121,9 @@ describe('validatePublicKeySignaturesFactory', () => { rawIdentityCreateTransition = identityCreateTransition.toObject(); const validator = new PublicKeysSignaturesValidator(blsAdapter); - validatePublicKeySignatures = (stateTransition, keys) => validator.validate(stateTransition, keys); + validatePublicKeySignatures = ( + stateTransition, keys, + ) => validator.validate(stateTransition, keys); }); it('should return InvalidIdentityKeySignatureError if signature is not valid', async () => { From af5c81c6bfd093df89139525f2f31b1426ac8bb6 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Thu, 19 Jan 2023 16:19:24 +0000 Subject: [PATCH 63/66] fix(wasm-dpp): state_transition.to_owned().clone() --- .../identity_create_transition_state_validator.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs index abef0767251..6f240cb7775 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_state_validator.rs @@ -27,7 +27,7 @@ impl IdentityCreateTransitionStateValidator { ) -> Result { let validation_result = validate_identity_create_transition_state( &self.state_repository, - state_transition.to_owned().clone().into(), + state_transition.to_owned().into(), ) .await .map_err(|e| from_dpp_err(e.into()))?; From 18ae42ce95f4a8cd0f8fa881957440a290ce0088 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 20 Jan 2023 13:29:04 +0000 Subject: [PATCH 64/66] test(wasm-dpp): derive rawStateTransition from JS mock --- .../IdentityCreateTransition/IdentityCreateTransition.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js index c81a0122550..562088cd433 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityCreateTransition/IdentityCreateTransition.spec.js @@ -36,10 +36,10 @@ describe('IdentityCreateTransition', () => { }); beforeEach(() => { + rawStateTransition = getIdentityCreateTransitionFixture().toObject(); stateTransition = new IdentityCreateTransition( - getIdentityCreateTransitionFixture().toObject(), + rawStateTransition, ); - rawStateTransition = stateTransition.toObject(); }); describe('#constructor', () => { From fcc6a23397b2c349b58627d8d8291d1468af1d0d Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Fri, 20 Jan 2023 14:06:57 +0000 Subject: [PATCH 65/66] chore(rs-dpp): clippy errors --- .../basic/identity_create_transition_basic_validator.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator.rs b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator.rs index 19d7a9def8e..e505dfe1f2a 100644 --- a/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator.rs +++ b/packages/rs-dpp/src/identity/state_transition/identity_create_transition/validation/basic/identity_create_transition_basic_validator.rs @@ -1,4 +1,3 @@ -use std::borrow::{Borrow, BorrowMut}; use std::sync::Arc; use lazy_static::lazy_static; From 5deee50955d8faa18c493285aff27142960d0ab6 Mon Sep 17 00:00:00 2001 From: "markin.io" Date: Tue, 24 Jan 2023 16:33:37 +0400 Subject: [PATCH 66/66] refactor(wasm-dpp): remove redundant js_name --- .../wasm-dpp/src/data_contract_factory/data_contract_factory.rs | 2 +- .../chain/chain_asset_lock_proof_structure_validator.rs | 2 +- .../instant/instant_asset_lock_proof_structure_validator.rs | 2 +- .../identity_create_transition_basic_validator.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs index 812a87616a7..0de231dd61b 100644 --- a/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs +++ b/packages/wasm-dpp/src/data_contract_factory/data_contract_factory.rs @@ -42,7 +42,7 @@ impl DataContractValidatorWasm { DataContractValidator::new(std::sync::Arc::new(ProtocolVersionValidator::default())).into() } - #[wasm_bindgen(js_name=validate)] + #[wasm_bindgen] pub fn validate(&self, raw_data_contract: JsValue) -> Result { let parameters: DataContractParameters = with_js_error!(serde_wasm_bindgen::from_value(raw_data_contract))?; diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs index d0da578847c..9393008cbd8 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof_structure_validator.rs @@ -50,7 +50,7 @@ impl ChainAssetLockProofStructureValidatorWasm { Ok(validator.into()) } - #[wasm_bindgen(js_name=validate)] + #[wasm_bindgen] pub async fn validate( &self, raw_asset_lock_proof: JsValue, diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs index 28083192d91..c63068a14b7 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/instant/instant_asset_lock_proof_structure_validator.rs @@ -50,7 +50,7 @@ impl InstantAssetLockProofStructureValidatorWasm { Ok(validator.into()) } - #[wasm_bindgen(js_name=validate)] + #[wasm_bindgen] pub async fn validate( &self, raw_asset_lock_proof: JsValue, diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_basic_validator.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_basic_validator.rs index 0ea27d1e967..9d276588d5d 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_basic_validator.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition_basic_validator.rs @@ -123,7 +123,7 @@ impl IdentityCreateTransitionBasicValidatorWasm { Ok(validator.into()) } - #[wasm_bindgen(js_name=validate)] + #[wasm_bindgen] pub async fn validate( mut self, raw_state_transition: JsValue,