From 4543de0923fcb92b493042dbf998057705493e16 Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Tue, 6 Sep 2022 13:31:20 +0300 Subject: [PATCH] *: update basic test chain Apply new NNS rules. --- pkg/services/rpcsrv/client_test.go | 9 +++--- pkg/services/rpcsrv/server_test.go | 33 +++++++++++++++----- pkg/services/rpcsrv/testdata/testblocks.acc | Bin 35080 -> 35871 bytes 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/pkg/services/rpcsrv/client_test.go b/pkg/services/rpcsrv/client_test.go index dc7fb1119..be3a23994 100644 --- a/pkg/services/rpcsrv/client_test.go +++ b/pkg/services/rpcsrv/client_test.go @@ -1370,7 +1370,7 @@ func TestClient_NEP11_ND(t *testing.T) { t.Run("TotalSupply", func(t *testing.T) { s, err := n11.TotalSupply() require.NoError(t, err) - require.EqualValues(t, big.NewInt(1), s) // the only `neo.com` of acc0 + require.EqualValues(t, big.NewInt(2), s) // `neo.com` of acc0 and TLD `com` of committee }) t.Run("Symbol", func(t *testing.T) { sym, err := n11.Symbol() @@ -1403,14 +1403,14 @@ func TestClient_NEP11_ND(t *testing.T) { require.NoError(t, err) items, err := iter.Next(config.DefaultMaxIteratorResultItems) require.NoError(t, err) - require.Equal(t, 1, len(items)) - require.Equal(t, [][]byte{[]byte("neo.com")}, items) + require.Equal(t, 2, len(items)) + require.Equal(t, [][]byte{[]byte("neo.com"), []byte("com")}, items) require.NoError(t, iter.Terminate()) }) t.Run("TokensExpanded", func(t *testing.T) { items, err := n11.TokensExpanded(config.DefaultMaxIteratorResultItems) require.NoError(t, err) - require.Equal(t, [][]byte{[]byte("neo.com")}, items) + require.Equal(t, [][]byte{[]byte("neo.com"), []byte("com")}, items) }) t.Run("Properties", func(t *testing.T) { p, err := n11.Properties([]byte("neo.com")) @@ -1421,6 +1421,7 @@ func TestClient_NEP11_ND(t *testing.T) { expected := stackitem.NewMap() expected.Add(stackitem.Make([]byte("name")), stackitem.Make([]byte("neo.com"))) expected.Add(stackitem.Make([]byte("expiration")), stackitem.Make(blockRegisterDomain.Timestamp+365*24*3600*1000)) // expiration formula + expected.Add(stackitem.Make([]byte("admin")), stackitem.Null{}) require.EqualValues(t, expected, p) }) t.Run("Transfer", func(t *testing.T) { diff --git a/pkg/services/rpcsrv/server_test.go b/pkg/services/rpcsrv/server_test.go index d5a9fce4a..903f0db92 100644 --- a/pkg/services/rpcsrv/server_test.go +++ b/pkg/services/rpcsrv/server_test.go @@ -74,12 +74,12 @@ const ( verifyContractHash = "06ed5314c2e4cb103029a60b86d46afa2fb8f67c" verifyContractAVM = "VwIAQS1RCDBwDBTunqIsJ+NL0BSPxBCOCPdOj1BIskrZMCQE2zBxaBPOStkoJATbKGlK2SgkBNsol0A=" verifyWithArgsContractHash = "0dce75f52adb1a4c5c6eaa6a34eb26db2e5b3781" - nnsContractHash = "bdbfe1a280a0e23ca5b569c8f5845169bd93cb06" + nnsContractHash = "cb93bcab0d6d435b61fa96a3bbce3b6f043968b5" nnsToken1ID = "6e656f2e636f6d" nfsoContractHash = "0e15ca0df00669a2cd5dcb03bfd3e2b3849c2969" nfsoToken1ID = "7e244ffd6aa85fb1579d2ed22e9b761ab62e3486" invokescriptContractAVM = "VwIADBQBDAMOBQYMDQIODw0DDgcJAAAAAErZMCQE2zBwaEH4J+yMqiYEEUAMFA0PAwIJAAIBAwcDBAUCAQAOBgwJStkwJATbMHFpQfgn7IyqJgQSQBNA" - block20StateRootLE = "f1380226a217b5e35ea968d42c50e20b9af7ab83b91416c8fb85536c61004332" + block20StateRootLE = "7f80c7e265a44faa7374953d4d5059d21b34e65e06a7695d57ca8c59cc9a36fa" storageContractHash = "ebc0c16a76c808cd4dde6bcc063f09e45e331ec7" ) @@ -287,6 +287,7 @@ var rpcTestCases = map[string][]rpcTestCase{ return &map[string]interface{}{ "name": "neo.com", "expiration": "lhbLRl0B", + "admin": nil, // no admin was set } }, }, @@ -935,7 +936,7 @@ var rpcTestCases = map[string][]rpcTestCase{ chg := []dboper.Operation{{ State: "Changed", Key: []byte{0xfa, 0xff, 0xff, 0xff, 0xb}, - Value: []byte{0xf6, 0x8b, 0x4e, 0x9d, 0x51, 0x79, 0x12}, + Value: []byte{0x6e, 0xaf, 0xba, 0x5e, 0x51, 0x79, 0x12}, }, { State: "Added", Key: []byte{0xfb, 0xff, 0xff, 0xff, 0x14, 0xd6, 0x24, 0x87, 0x12, 0xff, 0x97, 0x22, 0x80, 0xa0, 0xae, 0xf5, 0x24, 0x1c, 0x96, 0x4d, 0x63, 0x78, 0x29, 0xcd, 0xb}, @@ -947,7 +948,7 @@ var rpcTestCases = map[string][]rpcTestCase{ }, { State: "Changed", Key: []byte{0xfa, 0xff, 0xff, 0xff, 0x14, 0xee, 0x9e, 0xa2, 0x2c, 0x27, 0xe3, 0x4b, 0xd0, 0x14, 0x8f, 0xc4, 0x10, 0x8e, 0x8, 0xf7, 0x4e, 0x8f, 0x50, 0x48, 0xb2}, - Value: []byte{0x41, 0x01, 0x21, 0x05, 0xe4, 0x74, 0xef, 0xdb, 0x08}, + Value: []byte{0x41, 0x01, 0x21, 0x05, 0xda, 0xb5, 0x8c, 0xda, 0x08}, }} // Can be returned in any order. assert.ElementsMatch(t, chg, res.Diagnostics.Changes) @@ -963,7 +964,7 @@ var rpcTestCases = map[string][]rpcTestCase{ cryptoHash, _ := e.chain.GetNativeContractScriptHash(nativenames.CryptoLib) return &result.Invoke{ State: "HALT", - GasConsumed: 15928320, + GasConsumed: 22192980, Script: script, Stack: []stackitem.Item{stackitem.Make("1.2.3.4")}, Notifications: []state.NotificationEvent{}, @@ -975,6 +976,15 @@ var rpcTestCases = map[string][]rpcTestCase{ { Current: nnsHash, Calls: []*invocations.Tree{ + { + Current: stdHash, + }, + { + Current: cryptoHash, + }, + { + Current: stdHash, + }, { Current: stdHash, }, @@ -1078,7 +1088,7 @@ var rpcTestCases = map[string][]rpcTestCase{ cryptoHash, _ := e.chain.GetNativeContractScriptHash(nativenames.CryptoLib) return &result.Invoke{ State: "HALT", - GasConsumed: 15928320, + GasConsumed: 22192980, Script: script, Stack: []stackitem.Item{stackitem.Make("1.2.3.4")}, Notifications: []state.NotificationEvent{}, @@ -1090,6 +1100,15 @@ var rpcTestCases = map[string][]rpcTestCase{ { Current: nnsHash, Calls: []*invocations.Tree{ + { + Current: stdHash, + }, + { + Current: cryptoHash, + }, + { + Current: stdHash, + }, { Current: stdHash, }, @@ -2717,7 +2736,7 @@ func checkNep17Balances(t *testing.T, e *executor, acc interface{}) { }, { Asset: e.chain.UtilityTokenHash(), - Amount: "37099660700", + Amount: "37076412050", LastUpdated: 22, Decimals: 8, Name: "GasToken", diff --git a/pkg/services/rpcsrv/testdata/testblocks.acc b/pkg/services/rpcsrv/testdata/testblocks.acc index 965230d6a41c18d15ae5096cba629b1e7f2bda78..2fcfdc437ee892ed3d3cda3e39f247a60343b4df 100644 GIT binary patch delta 5889 zcmbtWc|25Y`=7<`*i&|6EXlr2_8iL~`&O1jmch)#Fv^%pLq#M@ohTwIibB>xib&bB zl(m$tloBc`GVkH(dEV#wJ)ifl-}!uI?sG5K^}WB>{k^VpC!R;;T|$*xs-ZwEWUZ!v zF%CL;f%a`&;rvl7`#1I}-<^HbDe&MO9?1#(UOwfxHYin1l`*H}-(Gv`fTtnyL}FB> za)E#h&1k-{;_}k)s@4*1&xBDjO{|d*Q^7yH=3exX9lFMn-l~oPrKgg_eP8UQ6$4h;YRjr&h?;lcg$Ag6KNXwe^6Y_m?52?67ed3wIJP7!i=5|BDO>a-iMi0RanMjMX z4N7zKtOAg&#v{lnP#CpSACl1&fo^M7vS?}I^dLX23n(pZ=n+mGa@6F9#`P5;A8jGD zu9gnes4ojO8Hhub+FQ_Cnwsz$eJD#y0ZP%Af-H5mqIEaT)i&)GxcRF}b%c;8Eq&Of z9`qCEiQ0*S4ru-1mchXfecOrBo01B2z#t8&yUo8?kd~HYqWqH?jrm~j;0@R!wIn?5CUTuh|^34CBg}*n31_y zkkR~O7$@9)PUxzc5+lTBSdO&=%Yx^p0!WO_h=v@?n1;=;0xKRsgpdUCdVUWjM-s_S zrswz1Y7Q%ikpvV40UkFy3rra05GIInI4sZrh5?EEA+9=T(48G^daorB9e(65=K^^V zM~FRCVkDVfs}MjYDgsByJpfXTkW5O3fo1*)O#0o$sl!Z?4@ZaofqdxTumal#&cWaF zx=4i0h$*~d)2NUz!5)pxNpfx^HV38%y7Qy{pjrauo5@4#_S}qrQzZV4B6Tyokz~?u zIHG`(8cqWa;lW|KZGhkgU%!J?f?psVLx?6u9*Q&|llWat-?jcp_R6o9`6cK0U& zg=<5k02(%jA+W#ge=7}!5O6hptx=mzKX6^0V_)i5dDXm{vjqJwAb2Bxab?aY+X-B^(_Sf|P1a7oxqe;9DH8sIKMhjv>a*`T`JM5GBMYlAnlxTUap#sXAQ z^xty4MnNo^)Pqn}EDY;IaKUu^xxO@=%AqsHfFpma1s5>JRJI9BMzSqo2@#M zrD~_GG7@h5?V^w@GiyvHBr^S8)h~^v>d*zm9f-&01|-i6fgy&^KOD5p z=P>w^p)gZ7Us1r(ktU(1$1nC+MpOv^lXbeHjZdrO`Nw$%oe4@mg3YRu@Thp}KId;@ z_?!x~FO4}qa13F;x=0>Ue=nxxv2x-Ky}Uc@iJy0(Qyo5W^&kKW1x@XXk~U~bi(%vY zIa&9#b?E15j3DZLj#_X{xSdOXhoKGcG`G!^Q^?BFf({^y+u8Q&+U1}oF2a=YrwH%z88&75MRom7lh}1i+xz8=k&m8BOIk4&}i!}GS+}3zIIggg$h$v;Z zexUDxGO7);;yd!tZTX}Uz`=9w;B%W1wvQQ5ysIiBFmYm#r$n~A^Y-A$TWx2_&OdKv z{~~@#?c`)VIV$iy*3!9ms6Y0@nNgRs^S7)`t~6;~w4RwpotG9&QHr+18w22>Z5ko~ zORr7OliQ@ElKw!I&*0Ash)WaZ+S%n5IsV|n<96}6(+GbFVoFE#(DBEsttUoSioe$` z+A8l0#w!Yj0U)=PY}@YQhV5oA))bZj?u3gHdgBMTTLhdVzVezbF>UTs(bCXLFUY3_ zjn=y@uqIjtL!7(#MxPm$W~Li{VXxna4IdvIl1nP&T^pfM(GP&c_h69bP>S<520DNe zD%d0qa8L=s@P~&$1-8_L=(A7^d+uM){OPyPJe22l1Jr5iAG6N|`HKSyfWIP*8@L&y za}J^*9KTFg1wF>f>2~~=X4Op6={KL;%$GFU>b(3hFA34<#8Nj|o7UdXHQ z9NJQB?o@K?;Fo<)kqHWWwU!D~?Vh8$yRWsmjEb@0&@upcJNLj2mtdpF)~Hvwdz__0 z-Y4HQeCjm5C^i2Hdb^j}_R(;1+L^h=rqYM)v0P}5J6K{#>gIGt@0fSmnGt!bbzo!* zB%@4*=sQBKi+`(*7B`x;d+FxMir24Ri$cqphh>kSQ@e)Y6WJqhd^;Yxa3Lfrg^P=N z?abX%g^j!Y)(UIy9KEcgm!wvHk}ECLwGGO2S7l^={BFHHN$bkiD7;ffqTM4~v$$XB zc`9BBN;lpp5;)oFGvOYLNvl=uVphD|!B1dU3@%<|v90zj@*zS}ZQ zUp~IkrX0_TJlFBEUaws>gm-rEy3E}>HIWk6n2W*ZO3%|g65S@JIv)GF5BvHbSoo+} zdro}*Ek0ZQ761~(jgaoTq!s#6{h`&_s_mVc%^68`^ZlN->1`#~Zt$MTXmA6svmGvV zohU!7HkNP6o2t8Dc4$L<2wwPyg3kE}Z*y@` zEF}qbu14f(t@KtWMz?p1zKlg!LFE!#p#V>j{r^*jC^G<@xA-I}!`>dRvYyYEm!fSdU`3N=v9VEBrabMYsx2^TA!=Vgj`@^m2eI3@%vB<(=DAs!i zV^hwT6IiLVYpBKbqPCc7|F#P}0{rPQw)3`h@2VEXZ=?E>uR64O({{0jib-dO5~{Qv zmM?#AEI++2%n_yFTKQ230Qb7;pVG9;+H*;_XozMsmOD6ib%Gxt+gcfj`pxBN1QRFO zcB)}TyNXh3)ZGCMGxu%%B97zCbjF7#_LRBAxq<&b9RSq7IW`d2F&z87tP>PHT!3F~ z7!kSx9#ClcpxiT`g=ChYl18ruyv~cE_P%F(p=f2iPn++`!P?+TYmVOBb<-fRzsb1( zzEEsD^lqQy*JtNLXFpOJ(+%-@O=9kjV~zrt@rfle<4N{tkKGObT04XO(}O(*%UFSm z?Z5H~2+LT-xh)f8y8U8H&~7hP#)-th0n6g!HD|q&mAitwQm;?dEov2?m4$Xqf1BL( zu4drK6syDu&OWa_>9V$=^;ZgPaH9a=HKR95RFP$pU=5UwxPAm~eZn=xXp3Q3J^E~!U9$(fYVqj60r~`l% z4^nrWX4e)YbXmz8fLFF(uyKf(p0uzu7kpe4Zp@lSnV&rW3XS3_Fw7rp)w4^V*iRig zB`-U%;|()^zs6-~Vt)qIvyY8M@0L0W8s2C7zr~4!#c30D$Pqf?)KDaMN}@luG3}Eo zMzs0z}BoGW)?H2>Z9LE)Isl_$EhTXqFSZHLgSWBYV}wE7%HK=of{$9pk$Sdml9aXcIkS zlJdbmC2ZeYbyr0U2P*MYu}3afx3vG$r>C2Hg^iS<Ocjc#wB3xh zxnM_7UQx|MmfMGY%H6K%eEfCwX{7r6wiuky(#x5W2c)9_IC-o=o0|Q zXFeG>CH^X)DS>FTyh`T8kT_qMx+!){k)SINFp1!dgny=jWm zg-|Zdp3zrajOi6?=&C23)s5Jreuv}6bJCuMoZF;F6F=N6FX{DWw%JV^`4=dU)=DAP zauS=9u+g*9>&z28O}p&hUknGppIbSyPCo2S^vq-6C*I4}t_Tw@X4NDhx?H6g%-lV; zi8EIpsODdobn%NeiF(~A)U6cY+OF2!#Wyge=Z079gE?bKb*rfn1^6Eov+uY@?4`07 z^U6vrJcH(yc7WA8&m3PiDkIQ#gj=5)L10MFl$Uw*x{&48?bkSu_7T?Pz65P@wxC-e zF~_SH%2Yde0uRs5-}hfW6c+CCRa!i9O4ixiUb#;MV+$1>v1h20B!7HztU*XsKgxL# z7kFi)E(&qpomODMyYyqf>I=|7WhwAS=hgF?@>QKinX7=)S*8O3 zey68P6u!W^_4Rg3Csa^VE}|pkj!N)k$qdqj?ZOQ7rC&aNp1vfO8@0~cmp1z7oFkoj zZ}FI0oE&?ts2AQ-W39hqqew$Vj>ST$ zIm0&$M!sLU-&Yf;e0r*U%IfEFgoS01cHN~Po17hw2_oTq^y%X8AMQ4EmbhH&@ev}{ z&FFkHDB3c(@a`$C>+xD??o)pwl zL3b{en4Qh*(sYbsB%aSs-*rI)`J-&cvsmyn|j zr*V;~>^IjlOP)H%Zse{hEY059rtt~8zT$e2(t6DJanJQDCXc^Q{PcJbf;Y$A2SC<~ zmf7Xd(<1RE-+)PDQsc70w`v2;2>HkLSLUUUM5qnE|K;yPSFOR&!u&Jm=2LrP^2eA3 zdr~}7<===cy}Z52S&^}X#0>DRtc+B&j>KL2Wgc_&f^wPYR9Zh))^>5RYSBn0#2zw; zvu6~3II6N>S4h=QSGn*0^a}4@ur+P%DV|i?A~-)D$SV6%Y`$TghIi!nSmz^uWu8a1 z@oQ{tQeXGUuEwo=BaS%$cy9|gBfKCzjsti-Y8J+*ZtGf5N}P1r(dKvHa$E7kaVFXW z%qwuUo8U>#&yQWp59JGRe|osJX8%w}n>_xm5d#1v63PysJwA>tQIw74zU~*&E(@)8 z-NiL;TYRc}Tksa6Pd({^TbcDqr%-c&Z)ZEDIOWIrg|3%qPf8v=&^xa}*yKEMLI8=m zt>0o8ZfVQhm+RXQ?9A;D7fyPT;8v+P^I)C2wC)lQ37)cNFo`c2xb*6iTfEhM=Hky7 z3OgkrsXAs^EGW)bj!;6Ln9{EIV)h2@Yes5iW)5NwSSx%=Xwq$|m?k8qAcJrbzP<{- zUd$h)mA=N!8I{IYwEO?e9ZzeI>DDY6EgO1UVQ)tX&>PpJ!4p>L`+m{wu-V=Ky%>q4+g-I)YlfkbkgxLcejbtSwcov$ klFgpnxn5yTeXD?cT3@=#FFmfuWBnypQF@beUA!auKi~`gA^-pY delta 5208 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