From 9015e508478028296a95215505a716f6ae6c984b Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Tue, 9 Mar 2021 18:11:21 +0300 Subject: [PATCH] core: refactor Neo.Crypto.CheckMultisigWithECDsaSecpr1 Rename it to Neo.Crypto.CheckMultisig and remove `message` parameter. --- .docker/wallets/wallet1.json | 4 +- .docker/wallets/wallet1_solo.json | 8 +-- .docker/wallets/wallet2.json | 4 +- .docker/wallets/wallet3.json | 4 +- .docker/wallets/wallet4.json | 4 +- cli/executor_test.go | 4 +- cli/nep17_test.go | 6 +- cli/testdata/chain50x2.acc | Bin 45374 -> 45322 bytes cli/testdata/wallet1_solo.json | 12 ++-- cli/testdata/wallets/testwallet_NEO3.json | 4 +- cli/wallet_test.go | 8 +-- pkg/compiler/syscall_test.go | 60 ++++++++--------- pkg/consensus/testdata/wallet1.json | 4 +- pkg/consensus/testdata/wallet2.json | 4 +- pkg/consensus/testdata/wallet3.json | 4 +- pkg/consensus/testdata/wallet4.json | 4 +- pkg/core/fee/calculate.go | 2 +- pkg/core/interop/crypto/ecdsa.go | 25 +------ pkg/core/interop/crypto/ecdsa_test.go | 36 +++++----- pkg/core/interop/crypto/interop.go | 6 +- pkg/core/interop/interopnames/names.go | 76 +++++++++++----------- pkg/core/interops.go | 2 +- pkg/core/oracle_test.go | 6 +- pkg/core/util_test.go | 6 +- pkg/interop/crypto/crypto.go | 13 ++-- pkg/rpc/server/server_test.go | 4 +- pkg/rpc/server/testdata/testblocks.acc | Bin 9801 -> 9788 bytes pkg/smartcontract/contract.go | 4 +- pkg/smartcontract/contract_test.go | 3 +- pkg/vm/contract_checks.go | 9 ++- pkg/vm/contract_checks_test.go | 8 +-- pkg/wallet/account_test.go | 4 +- pkg/wallet/testdata/wallet1.json | 4 +- pkg/wallet/testdata/wallet2.json | 4 +- 34 files changed, 157 insertions(+), 189 deletions(-) diff --git a/.docker/wallets/wallet1.json b/.docker/wallets/wallet1.json index 1141c9777..1ade05d76 100644 --- a/.docker/wallets/wallet1.json +++ b/.docker/wallets/wallet1.json @@ -19,11 +19,11 @@ "isdefault": false }, { - "address": "NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY", + "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", "key": "6PYL8Gnjsz4RBKX18jx5ZAQTDH7PKkZwEVjPKEkjNzCDNFE6TKZwaFLibL", "label": "", "contract": { - "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw==", + "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", "parameters": [ { "name": "parameter0", diff --git a/.docker/wallets/wallet1_solo.json b/.docker/wallets/wallet1_solo.json index da7a6d01e..2fcf9fd44 100644 --- a/.docker/wallets/wallet1_solo.json +++ b/.docker/wallets/wallet1_solo.json @@ -19,11 +19,11 @@ "isdefault": false }, { - "address": "NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY", + "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", "key": "6PYL8Gnjsz4RBKX18jx5ZAQTDH7PKkZwEVjPKEkjNzCDNFE6TKZwaFLibL", "label": "", "contract": { - "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw==", + "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", "parameters": [ { "name": "parameter0", @@ -44,11 +44,11 @@ "isdefault": false }, { - "address": "NVNvVRW5Q5naSx2k2iZm7xRgtRNGuZppAK", + "address": "NNudMSGzEoktFzdYGYoNb3bzHzbmM1genF", "key": "6PYL8Gnjsz4RBKX18jx5ZAQTDH7PKkZwEVjPKEkjNzCDNFE6TKZwaFLibL", "label": "", "contract": { - "script": "EQwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CEQtBE43vrw==", + "script": "EQwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CEUF7zmyl", "parameters": [ { "name": "parameter0", diff --git a/.docker/wallets/wallet2.json b/.docker/wallets/wallet2.json index 35284cba6..d09780587 100644 --- a/.docker/wallets/wallet2.json +++ b/.docker/wallets/wallet2.json @@ -19,11 +19,11 @@ "isdefault": false }, { - "address": "NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY", + "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", "key": "6PYXADog3RQCwKRhqQsobwZEFopdcCJuMfPosM9pXPaDWSguKvznLdpADk", "label": "", "contract": { - "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw==", + "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", "parameters": [ { "name": "parameter0", diff --git a/.docker/wallets/wallet3.json b/.docker/wallets/wallet3.json index 6369f8030..2b7691e7f 100644 --- a/.docker/wallets/wallet3.json +++ b/.docker/wallets/wallet3.json @@ -19,11 +19,11 @@ "isdefault": false }, { - "address": "NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY", + "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", "key": "6PYScv3Vgvdi9EkhDNvHXdvQeuaXK9gRwXDmytCswZMNpTzMLvfgR3U5dK", "label": "", "contract": { - "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw==", + "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", "parameters": [ { "name": "parameter0", diff --git a/.docker/wallets/wallet4.json b/.docker/wallets/wallet4.json index ab3783401..92909322b 100644 --- a/.docker/wallets/wallet4.json +++ b/.docker/wallets/wallet4.json @@ -19,11 +19,11 @@ "isdefault": false }, { - "address": "NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY", + "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", "key": "6PYVwp1Sdg9DfTzvg42PZxgzMDf5a5FYBgT6ynKKzwmSHuhGkipoNjyW3a", "label": "", "contract": { - "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw==", + "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", "parameters": [ { "name": "parameter0", diff --git a/cli/executor_test.go b/cli/executor_test.go index 92435afc6..64b488145 100644 --- a/cli/executor_test.go +++ b/cli/executor_test.go @@ -31,8 +31,8 @@ import ( const ( validatorWIF = "KxyjQ8eUa4FHt3Gvioyt1Wz29cTUrE4eTqX3yFSk1YFCsPL8uNsY" - validatorAddr = "NVNvVRW5Q5naSx2k2iZm7xRgtRNGuZppAK" - multisigAddr = "NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY" + validatorAddr = "NNudMSGzEoktFzdYGYoNb3bzHzbmM1genF" + multisigAddr = "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6" validatorWallet = "testdata/wallet1_solo.json" ) diff --git a/cli/nep17_test.go b/cli/nep17_test.go index c81d00ef9..6930cfe85 100644 --- a/cli/nep17_test.go +++ b/cli/nep17_test.go @@ -60,12 +60,12 @@ func TestNEP17Balance(t *testing.T) { e.checkNextLine(t, "^\\s*Updated:") e.checkNextLine(t, "^\\s*$") - addr2, err := address.StringToUint160("NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY") + addr2, err := address.StringToUint160("NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6") require.NoError(t, err) e.checkNextLine(t, "^Account "+address.Uint160ToString(addr2)) e.checkNextLine(t, "^\\s*$") - addr3, err := address.StringToUint160("NVNvVRW5Q5naSx2k2iZm7xRgtRNGuZppAK") + addr3, err := address.StringToUint160("NNudMSGzEoktFzdYGYoNb3bzHzbmM1genF") require.NoError(t, err) e.checkNextLine(t, "^Account "+address.Uint160ToString(addr3)) // The order of assets is undefined. @@ -85,7 +85,7 @@ func TestNEP17Balance(t *testing.T) { } e.checkNextLine(t, "^\\s*$") - addr4, err := address.StringToUint160("NWTDxsHVde5qSjRkTRUAg6i8xC3JSWEC9k") // deployed verify.go contract + addr4, err := address.StringToUint160("NTe3yHH5zsaEGvEHTsFRpCjTef6Aod4yb6") // deployed verify.go contract require.NoError(t, err) e.checkNextLine(t, "^Account "+address.Uint160ToString(addr4)) e.checkEOF(t) diff --git a/cli/testdata/chain50x2.acc b/cli/testdata/chain50x2.acc index f40e752f172555cb37245d61918a6059a4c42c71..cae5ac69f7dc2be0a0c6e1cfb49b2424c3663215 100644 GIT binary patch literal 45322 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 HPzU=DkRM)8 literal 45374 zcmd44byQVR|F28OW&?t>v~){1o0jhG2I-cPMp8gRLg_}j5u{sM8YHBYKF9c=M$zaBTKNjbA>9_!=kX)49#>2+N`Ge?fNzCQI# z(KYwlTgfYMx{Dj{-CeJ0bjIGCGH+@-4YTZAuqdbQG4I}e^78)EetzH|Kdlo8Vu!7^ zWHQR_V>?JVd$LNFn^T@t+-^tepM0&lDw2>AL!KBr3Zn+CN-Vf1&g2QLPxS7|>!(k` ztY>oR!#3#4;DMlpNTmdT^DCCdN86@Sem=-C~%l>Z3QOSxZkk?WfqsKoY1&+}>V8SSo?< z&f<|NJFv323~7%cJ?6h-cZBZfNjnP=TYA;T!`S9dIDKkw@{VW)l0Z)Z;pdH3qXt}~ z86FiXeC!daHrIdZp&u?6>5sTZxSEK8B=|UDuLSC65t}D-f4-u73IBZk@h;>aYXPB! z1O>5p0t>`Q;RO7#;rSY?5L7=QXl7|ldL1Sbar8%I+U2O!3Y(I%*Y zicbaww*5^eY{g-kBWO?1&`V2^3-Z3w=16S~R4lGs3002~Bh`_is=ih6?2mMh#p^Eb zMrv+9optIi2MJ=viy}bc1@p#7)DwSyHDD7LhFwi8uu!8u3k1Q`jt4RjBaFr=#NULi z^o1QG8i#6sDCg@qnkn}sES9o~)>#$HDPA(TUJYqdmcf{g78={TPMqIKclS?a_6rAs z;9eh*w-sRGVRSejeYWV`O`0~o4#65+P$MBJt&-}6j2lpFP@y+{YM{Th$q!weFqX=x zNr{L+_9cJ&r4iR6%0F4@|EtjD;s39N)c=D}{9&V7oq;wQfuF;EHSc{VcC9-v$afO(CBgUssr_)DC zTAZ2foHco!sN>EQwORUDtnR4aNtp!*a_Mi_lC!V;guFb|F4tF!ID+22nycrYkgev) zBg}6kP0#;L;0a9}Bn7TsT4jjhr|eP}6TThY>@GZkrx6J=BtQ_`h;WQ))^)jVkOJ^S z*(U;OiFhde%2A5)4-Iisk&mojq<`DYWJhYw`nYo)v;g}1X`V|O=%JmQb0K!_Yoj&_?%E7Ecyo|lkrg*m1# zPl2n5r~+C?X>}TLS@XxNuQq5jTKwvqe|8gpa{Gs}jy|zT8k<7RsPZqrC%(gVg@g7PTE=RE$9c~Xb<_6PRswLi|Z+s#nl^HI5?y)c8crT~y8ccAo z%TaG)H7FDa8Vn;3Hn2={w$V$8~5?Hm)IW=d&> zv~B|@XNi>=yV2-cr|aNQK|6{zR^jE=-6vr|jPYyf%JmJZ)7VIX<=90R%C@UiU4ppLcpLnl2MWJrcCj zhNz&YER~|CFLC6F4u_qJERhKGAjkT}Z>YU`sjo?PVjjuK%_cwK0JxH1g{@o@I) zP`d2o_v(wQ+l9<1$=x)N54-byc8|@n-%Ig|nIdPD6&BVGFWYaP^UJ7XlMV*)(+1by zN?DTcP{Imi{FB`e)PIi25&8a8%wMlRY61DD?gtWr2MB=I)u6rkoGKbk2L#B|AZNP~ zYed2!{y-G^zDEFJlyozGwMjK+_VSGSsz;)yiyY6>@?SnfxvY?A&Td^)_F=x_uAdrU z+@ypTi?ITYvCaxdQJO?Z)Jh{KHE?!Eh6<8G7mS~85N2R7M_xR^C3eZJX_##Qn@@TG-O>l+OOuuKIZ2V!aVBszl`>=g33&QWB^@&F;zK8-p+#GQZ$p&ui@ zfLURT%|rX;=h!u`ktsTB7fEaLV&UUV$u7gIb(N;x~dv-y!y7ak1AWy2g=l#MrqJK*^_( zLV)+;PXc<9u|*m{>b;8L`8haC=j4cUFTMvzu%yf4kn*hk00xc$)|kV z{_^5e6S2jmm?4o_^G&H%RJ-6Kl(xMQ!yUsKQUsU~5fSDjHqRRdltJcsjIuBt zYb;F;u=#}e3DjQ&bD`ZfHmH(*#^?hCJd?~cG%jf^;5G*{Sf1c(5!&yJJH?;QqV>iM zPMf91XYWE&1XSLVm(4n(PS4hk(ga%a`CWzBKs=@E7^8JvqJ|q%8IU}h%^pqQumn5U zZ}GJJ?4^p!{OhEi2!DLRK#r_qJe<*-*aQ82WC5C=C|Gsob}mJJYf6}5S$|niAbbu! za%csJq88%h14mqM&rV_WOT3?xD-Ve`I$0Ga971c)q3zLK$Z9!H*()9+iRfEDfwCY(t1_nkFh1{=QfrdULq z(4)}P=rGTZkHL$U7GJ2)8ys><>*^vjk3zxm2{Or@NEIKm-h{Tw&L_8rqNePE@}qh~ zUXD?9gb#MG-{NU>knsxN=-Elr9)CObV_x-n>!DK z?_7g|_3=|x7j0c74dmj9Hj3!o3t?32U*i4TPY;QwsSf?Igo!L(Rx8CdL*ercj(-Du zl3eii1>)j0=0$f2_lR(u#q@>_GZ`i!UGrdmG|*ZE;&lJ0ngBZ^Flw@onQwAIf9g@~ccZ)0=BXSB_vKH53%rAUtEAa0uF*1&E}}I-KuNLQ;f%a* zYY{rMQZ_0f#!d#(3|Ltf#V9E||EPHIf8g^+Eglw+#PQ@&bRRce>H-k3J0fb3fpCND zW&|dm-?+X&Q>0k+b8R2Qs|SB<&fK9yB_WS6svc!FWFHXVK$w+LWspMv!U8jx*mNnz zDo50e0{w!KT7AxqLh)mY&c2tc-wgtbIMc_}ab)V%Dp`kV6u%HHmB5pk>M>QEZEt-` zep|IavFUey3wE&I;_YDbytXQIddlr3_Qb(^Q~lPb9Cq6OOe>rx(;(fYa+5P*%XNqa zK5eFuL(&y^x28a}M_93R{P|D}$TZ2WN^0{&P^QKl=`p8iWDM=(czt=sjIB`>OIGdYHo`>jyd)tz6O3psOyWxWT2`12A^ zUSuoFY$(YhjK6&EdpkKFE5VDF*-^wO5n%JIwEh_l{t9mn>}elKOUI45LxkMh7%Z}Bo1X3`OXrS9VLOv{-U@b`k?6Xq|Zr&n#Y6 zjBSjq*TiE#PHw_-I`yGv*+U?vPAay4R6N8#@cE+_4~qvUn0QY4?z`O<5fH$UlIG(# zP$mj74JMyTu!ft9wJ-#eroI+%R#-I0VTYYf`6=ZtU3Gd?c9gQ;xZk=n3}il$C2RPO zP@98%b|hM8xo*i#Mq5qTVF!q*4Hs^Sbp zF2gSj>dRgHD%_004)$9-GgY*#ThvXtfr?1w5QgcX?^jGhy;LyI@ZW|sbYGIjY7b9L z(2@GhN^0Y+i*uXjyAme~9psb|JXbp%HtaT2wf!aD&kpJ#@f7R2O^!)?6gI+Qo%a+i z++;Iuc}8l=T*G|5@psW2u_VJH1ZV97kz1>V@;qN&c6_bXx6TeN&`XY z{xW*W1!)zoxEC}*f=4D3J|E_Vm%LKKhMJ#C-xyi#E zD56`V=#`k?y8d{e*J?Nu@M0EtRR=bo5Wv3<)_nb46YdpmRizvdpeP!1(5i%Wp@#!z zuw(S{r6b-KMfSm8T3yOT02ONtI9$fxkvlqe2K@H*6yJUG7aU=?AGk`O0z{bOsYxzv z^t)A>Q~Ab@xnPvmmug{9jX zuL5Q;Xj6QONaF?Pm@$MGZS;HjS+>LM#%$767+yoX5>C&PNgaLtW@Xn} zCtQV;1{u91aKhYbE#iVkwY*KXB4F{Fdt8&Bt$)3B9K~$rk%mafOxv0cb;KSYhgL3@ z5>o?$6efaj`2Zl##?QX7BwG#2Z@W7I@YR|^G{^(f!JU#!+w=%*m6)!kwj{Fm_`Gk1%*TE1M(oXmX4wwDD0|8L5v_48t zfqb5qUx!G4RUPjS#E9-xOVvFQ|7d7vVmgO`d)BS@rZx;g@(n4|yIE?@gS>you(t zdR3m!_NV&jp^wTpIFeKL%oB$nTpNw%Vtr6iKGY` z(ms~Ln!8^Fu!A$PM*_oNVmZhr!q42Szrjb=B@>h|5u09#QzYVS)9iKliKgx91esc~ z*Scqg`*oc1NBAen9oOnbVmg6tKv0xcG7`2UQ8HJueuR*M2A?pgrf~9Lf>;RRY@Bq~ zsjxZFVsMy8??@hfnAY=1M9{Z;YfRb*1z}c!oSp5)ci+U2Wji}>@-C2+X9S*Sp2M5kZe)#$CC4oh4Y|2q zz`<+A_MNYgwNq=Y#QXdigxgEh&ne*Ahp1LBbJb=iC3K* zfVQMX+~c+zh34lf4&-N(kL%(+kOe!~Z}F1&%Itlgy9DcfdRb)LR6QLKT^F0)R?l7` zNXxTj6u)PS&`_u(d(s0r+c78?f|hDBSxG(63Bss+Hp~$oV=v?QOT3?lofBi*rSyi9oC{;*NeifMf<+%mT;EF_lp2tb&3V~P)0}!8Q1vXP_x-A1 zOgBQ83Wro45ac{m)sJ3E{v62Sy7J`CI_WsH_$!>R$RlKEmaGd&9PBDT1~jG~P1cHy z`ZY#QhpLa;p;a=I1L*AgF<$T$qNzN=N}z%z4Jt_IC)0L0?|MMyb@PG038# zQ$R9NR)%davM$9C<((B^c`(H!Mytz9`mUcQ<1`AzO>#kz{-feO{sW&sYVojm%a-bm zs{&-=wK71!QEGzeDgKHOrU#gO;zM5y+k2Nu$Bk{#zMXT!Gmrn+S}?q2l!1)UTHkIy zVL-RSUkxN)mLdG=F1Ab6(%r2WXtO(g7P%^a<`;nZ1Z+MbF#b9i+owBDs;aqusw*JC zxOkUCnc1Q+2;9k)yeL*pOw;yPvNGv95hl43G|m3JQMKG1HLu#5-fhj@5Z7TTTqo1b z@?Wh9KXN;KNoyS-lwb3bp>WF{xqQy`G1$R=i&uEd)AWgxTu9yhN$Qvm1Ec;8Bzb^<*wGq?M9AqBeGuDCx9+Patq4xP#QS-!@sM~| zIp|S5wv-ehbHHZ9Fy155mG?Z6Y1y#EI9LqkdqIrlNV*lQ*ss zs-eDuL^nNAQof-fuQHc+*`*{rXSxi-fRe66*SRD*SN`tSLNA%{kBW!+2R?t);$iXP zhp;{S{d;M=8i0WEl#bT~#M?w6Z@?69L}xjo&&JlQL^6T8AewJvlMZpx7S<;3m~(5@ z_ETkrPxM{e47IXc9G!r!l8D2kevvJwFcPx0$xZ2DKb)x?*nC1@{dKTJ`vc*D*TI2E z^*{gtBMPv>XT6Z@8JNLHxV~qgizXr>n82TjGW0)De^W+f(1k6$460)JGPxW(DQi99 z*H5`Ay$L1AqD2C~#wQKf@=|fZvoz6VfXLVXIAIfQ% zKNpeeET2QwaAS>3S=}-qZk$+dPo3d6E9qDX3$I8z$ z;P5eBY53S`=@7uSnR35m>_VH*@L3X+;hLp*pZwaUS-$>U|5%_j(FbYiOIVrPJ-mv& z>QepSfpGh63AYlo>1M#MRc^$|{=BV_U_!nfdDaQP+P z&y)Oz#6#nD38zPmKPH@zB5YG2bBp74y%0I}`V689LzK}b9)Jlw2Z_~kEhm|o1P^Tz zur|A4xi$%8u~*y2ITiT0y}Q4h@MT|sg6hTUv0GtwPgWACiF%kd+AAmjDqrf>y!1Ao zFmp=ytT~h-(d>RLdhynevp3r3=Pn0dlYLU0>}YRZ13@PS^04Avk?FFKL+P)CTEDBq zebauo&;5*F?+wF&a+rG(FNVdP|t<+suIL7AgpBCpYk>sfC7SSw4ZOu7>k9*nC3Z{dKTW zresFO+VDG~r$E5l{2;lFRNJK)9WaAQs-=2zID>-x-#`}|npeQ@lvB#S$oirRrlO zB;!NY?q)YPJ)Ci|^^$ywE!}U950y^LS-mzm>BDh71SvfeY*w*O;#P8V?SrN&l^ql% z;rdIwpOa7ziHB%BF^*ig>NBIl*@J0QJFYf}RT?&?dokC@ClY*RbnS&xBRVy% zTVnNQb+xM@ecYsVl(&n{9$!>-^cDyjpp7wPaDyFcdB;mg#sH|awM{QtKuB*)ef-4u z@w*X{Iq}szYdYh1-H6Z=DtD`0n|UR2gWa#p&v&&4HWUH(YhPk9=E^%TF@^-bsb=B1 zMU!L%MI6&%2Q_X*t`X44DkF4$dWy-lF7$~fL$@u~9JdD^zJpG0G%G|_Z4Ey575DK! zD&CVn@cE+_4~zFPOH(a*2C9tE00?L^KG%>}RDKZ#?i|E*YWF}Hoerd!4$7|x#JPdyszG4I{fG$5igW^JQFF|E=_c+ zp7M-_QqR}lmWr)Ua%!7oSMk$T#%+sI%~ z751-=cm#jo^G7Wn7H|C|aa*me)#K(E2uNq&Jq~A5BBGE1lg}fy66?;0HaCJ1PK>da z{ngIO`)+jNV>5Gc>P3N19IS*nuY{6c;CK=e5L+M5>I-}I*OOtd`o;@FO@DJ$*N+C9 zPYA-l4rZPa@zf??S7GM@2mpNM49|}dZmmrKGuS&1(c*KTdlF3ho^Xky>0Lk|=FnLZQ%&~kt}hlA2m8Pd_FFvvoSRm6 zRB9SZDs@%kAy0Z*WjClu1xLPyH2PHZA^W|kmB=El!mM#-7;h(|O4f|KLdP#VG@lP) zMg5S3fUT5nzr_1F`}>f10Ww>KE?O=WJG4xsC!e3@ym;;q!^`Rs z0(I+Q(evZ?iyI(6%Ul>nRJKQ-U}By*U7%Hew*-RHkuQ|7!ZrQhzBkvP*li6cgPOHj zwU`gRMA&C-Di5iCEylp0mivVfJs#;xyXqE=Dsns8IBEUu4zD@=R!dI;5L6Pk%O4hT z+tt^ic2`2opI3&M4b=#UnF^1p-hK-Iq46|yRaaP45H*?(a@`H6Kbxm8q>L2_~P+cFs zddcTclW#&Us^3hXm%^)5#;aNIz~1(>PTIyWXnxJ@s|(DiMa(r#WajEiSTLaHr72k~ z;&0Lbn@MjE>6K-?=DcAN)Ml z=Da(B6F(|-SQf^B7r>78dDMeZc8T|`YmC*GBd@5Knhn44+Y6tuhBgBz3E>j3gZ&mS zFP9zSNCd|eowmkVtxIR6-kq-$3j0w)t?)%ab>wtWn+dC#lyN(;N#9v7sEu*Wj~0s8 ze-vSZ_WO2)>6&A|`!Df+PHR6T9w8)GwQn}1dQhygyS}B*Y6dZN8?aS)Xr@_NvVKar zx(RCTvlPb7VXZvgYl0E68NqYWFLF#)%vHTprwf%xrT3S=9Zr0D{inU^&=MHQ@NQb* z2$=Z*QhT0Ea#~#u&L#@ka&#-C)Zw_|apom!q?Wo%*+|gI`qTl7HJxv5>oo440f5+5 zKX(`QCe-5C)e%KI>uQnIJ~e%~PKQ~z-$47D6-_cnDI`4Q>p>EnuOG+;;f#VOr5!nt zhctbQ`QLUYknI1X;*tD;&mXmTSiCGnXR*@f#mx@PEPbX<3A(5Ou6slFby}4sH4gY*Z^zO zlK=zGtYonHgdqLvVAJBl$`%usE}X?cK(NZF=Rt2{;wd_q!PE;LJu|uZR92=P^9*2S z{#<&zD#Jltv3bxgt-p`GEyaS&UY*KL&oV9MQ`l!6SHJhIFCiCq7#*I+qc5Jn?P>)( z*l+P(PgD{{)bxd~JYzt}l0$b2?3S}XsNLsF)!~>DkMd_}uKK!dy)l{H_W6t9_=)=N zlyy=Ay5lMtiwL4CXX~Mt$1m}IUUqp%ya_E>^)YgtGwUMcPOfEFjg-Ty4mi6)rYn(p zm%h&qNG2qggnay|{4{v^>TkTihcp>h*j8G09W)E)nR%&Ta05YE^u&b$3ix+us?Hxn zthSAU2@(W}UVi8M(0MUZxAX3tR5j6ajzubWiRUGK4nqe?1O%FJb|&l7?SxC_E$gEl zASfVNK|MSR`t6*0?;*wxGMx%q`l8L}?H(xSu5+;fr6q+bK;l_6=zBCY-BqcO z!#=v)RbGYO_xdkZu8{q8FeAsuB`2=tceb-YKx^!F6QY9WP7pbm!K6i?i=&E1rP(j_ zGa{>$@z71%zA3Oy(fHviMRJhry2O7QDYuG)E<%MryYp_^*u;+yR8GgEeX}r_!V}7v z67bjJVW+#wa1I1ObmERZ30=a1OSMaD!74$mRn~bwXJJ2YaZKg3jP`Q=$gzJv{nXut zRGL;LsCt(4bNZV{k)#^ka%nt`}Hs{n-Ns7j0&GmwT>g79;MAA#16(! zIG>J1vtkYB!)(@>HUo^6P5a@Ka-A7SpJwl{eU*W(};-UoNXI=o<8}zF)V-j@F5nS-FJy?3-cT9z5y+ zQAckAQUXk8P9DT;qW}U(eCn#_1lXwXK^e#vXO< z+@(r>S$?xdg+dAmBE~S{mH)ZbJJ-j1?HyG=;^mQkhg>e(-9;Jnv;BxF^;x6gaOW=3hSccUP+0x9CDE=H)lSC^xV)~` zvH3cBZdI~RCIip`*HOE{3(pIaE>OIFiTCq*=R@LMe^EF1^my|`%T0S{!?BimV7`a~ zi|Rv^t>w-stB3^(r7OL1Q^&OHQ69&{9?OuC9naZpn0=r_q6$iGKVAVO5JW>-+9~cK zBNW)4A^dqV$~27^$5v?aCTNTO>A(if$2Urg%lrpB8GWg=mX=p4tq$A>U-XV3Ryi%; z5__Z$vABSs>0Q>^vrW+&laP4tkzM}2X@{zQYCD1cQq|4DY-R71tO;&&f@MQOb_p_0 zp|9+tnCz9_ud2&2Qm<0U5Wib9{G;Mg{(;XQwRl)O2D>Ima|o53@8$Q8e#rXJ`;k!r zR|y|XK5Nz{33JefeVxc^a1l7Lu4=`#xwQ_5mUJMc^Z7Fjx}PNkXFo!Yy?$~arg6YN z4B+X{LNda})cVq5o-oGfLJBsY5LAC1EGNUNKPS{HKwjdWV>h=8BNgNPh22*`0 zyOut0_xOTpF{r-n5j_8nthH)~>^2!%;24X(;&~FIEw#vTg08xzf4e3+MoE5rm5J;* zo*$2Ngn*yN7f-N*{T6TiY(sj$w5SfmHm7XXeb~X%ZiJ~_#*md1xWK|${c-bUXiYUs z;aojx*HdchHXZ{%_4(&Tk0uZ#9nCZzi@^51`X%1a3%L)8m!M_Wr7u+{e=Cb}`bs1I z#0%E{lEEghmx6`#RG8FfyJ~8C@00nvM~~1{sRRodgU`=9Hq+of#cJ5gl^sT)p50%^ z+kOO-=I>FI=iiJ53)cE7ranTpG2$YM7FNI@tgggFG@u>g6=Z{)EEZ*v?5_=De=O6U)Tln}z>E3otTV0|&Jf_@Htt93ez7Jwc<3Q4$NAVLQjYT- zCA=@6u^A$IW;s+WNE8C-6N>P7@>ITq%_juSUk5v+0_wr59c{JT&l;8D#8h1-bFLSD z12dR$|D#$@Y;CV*3YJ9A1VuGf%9f39JJKyXJ_!QLepUT|t=)sFidBD(KFtMv>xlVG zo|8GQGJ$iNC=}}raq>n?)vo+rH(Aw)lyLPMfO6qJl-oM2AxzON2@y_)7y?B$C&DY|D zhN>m45MCB*!c8noHd?Da~RHA>^3ryu#v4NG;zZ_sp?VH z1%em{H@a(Z$5BhrSr7o4&E|mbY#zijDt-|q)5CZ{pJPpd@R@a%t$NND z;+ZChu#LrqJN|02+?znq%P$+~adMwmI6n-+Hg97a1gcEYF%foM#_@hXoEn`GEn*2q zPZoM}ih9lVjQvFPNDbk(i?WKuQ^I#G>3&{3^&b_F_78misKvwL88I_OyG?j!MGgZ2 z>Y!x9`rKLFG9)nhWVd6#YRE#5E=VwNW6Tpjl79Xo{M`g^axb>!QWW+!4A%A=5ejDG z>(k-R8Z6o6(qU(gVu4I zIvrpJQw^iV4`U(9QCO}*(XSEJ-(|nVr)O`5!XU7d(CkZ>Z{)Xp6YW4Rcf;n+)!yH3 zssS6|vzjjffqT;v@XJ9_p(Ji<{{Ltw-Zk+vwZP(3K} z7$AaB^_T|&?@)B*h%&U`4Fzt+boI!Y6aHsJ9(A5MSz(`F;{9Af@sM~L?9lv6uZ*EX zvgD{!Ue_%KxyI0XOk+Tmf*_##zhy)uyzk(J-fmqto_CFN)&$LN5*|@IzAyuV_>S9l@I~bA1ks`7OT-y4Tp9`moSA#=j1GMjlYf) zOZMg&v$rX=oTz|&kJQUnNKqgN1m)ebyH|+*f*=aX!#viXbEUdg89RELUC-KNA%p1K zzHxQ)_4|oqj*rd!ffUFu5HZ3b##M7Ku&nad&dvgo|55Si|G?*uT0AV?$c)XPc(!SE z+3o!zehr5g^FxWqW`1Du*>{%S*ibq)O}Cv#m#T}?0BLKTjl>$@%`$)W=(2o@qdH9e zqVAi2cO{7xd{iC?$-Bo^watUp{(x@xt>x8QL9qFRVEF4`Obt(Nc^)qV79oHDSl25m zL~*n#Vj?hu&9m^sdS>ec9C4Zu?K~xr&a9L7r(IxLVz<#b-IlDvp!4e%WMXt4O1M&w z3s5!gZ~gRgr}2esNRsbG&jF;S6xhLji>FrLmN7mW!cn@>-xEih0%d3wUp!@59%KMt z@}6zoSJ-gOOT*6b$ujNK2kd-5JSOTvSJ{zfZOoJA7+GK#d8+R(@qVuGc}P4#Bf>4} zD@>uOJ~QU`h@A;NqDJ+DOw3PJ%f2>m*E7$wx^4%kGSTcz!!i>fY07(;CLfD)m!`g{ z*J`Db7LIBJg7UQ97uYXR(X*EXZ8n*~j})j4j#VkDA&3zUUOGQH%E8zhNIX_YPFivw z+E{=PSnHCg$#LkaX3DGbJmwq)cD zN<~QtBqK7nm)_d<>dI7Y9%XqDlzF?s)aNtl=SMa++&O3etLJ!(f8g^+EglxHzwhqJ z!EIQR{mA_sgruQJN$XOwKn0k5p6ilbZE-3U-R)0(ZM3I3($o|Xr!F5iHH53z-O5$3 zR-IDwVgNBWBDLtgAnu$lU1HLoiV(trMM>E>Y1k+E3O1h*On)7$!kd*f_%w;Fo1ERklv-u${AxyI(7{pt%r*Zj0??(qhJU7EnbO`Q!W-jZyRxSk7TxnCa zt3tGNq=4;W)l4WOdQvzq?6wyzp(D1E(Kb**2o}}XxDr6jyKL>{MH0VX;{9B@^pJSw zpwQK~3x(C{TWv4Ha`}lZJdw$oG1(^JWe9CA3`?rMd%{|VcBr&!ILGNgc{Q3292v?z zGrFYuP}5}QoZH$81OY3Ajc+)5gH9K|(SCr2`Pg3&xEeZ!$S!7J5R0hTGnE^4{{%9F zLbJD=Q1`123|X;+WylDq6h~-PblCA?O?mFe%%CSreVwAC=mSRt2IZ_baLt(&-SGV* zZ`vH7tJHPitG@to9mI8clje+98s*--2@)mf7mlkeE(lE8JqcC&@{f*q&;G#Yk6Jt| zo`XX{M?~c-rA-wefM<;qIw;rXoi!Jj;>8wKsGf}>U%0{}D`B$ey_r2h_%x#@lGnuw z@-?1!W2&F5cF$Bewa=}!x3cPQjZkdilF>zu3LrhPk`!ur%MLc55X^ratjqTj?tL=w zU32^Wt@Rstfwq@TH2K_M2J;hvuTlBTX2sHU`}E)`hnJMZcM{jh_@-}6Usf7d0-`&G z_qH>pP;r<|Hha*9dKo?eqKsr?1i7t^NgTz5F1A!jVAWg zCt*zNu>|bxUz=5Dr)w~*06|+H$A*pkZg^@Da`p@hdqmUcI%*l+P@5tH4Gq{HH~&Mf=` zV=p?CEvVD0WXDMlC4P5daYI$ z@Jqa(YX%<@PeOFb>BIbqD?*Uxdk8znoZ;O#^;*!&@;u-V9yfzNn+`Kz9sxNg#(;eI>Vd_u7Q zb+B^gb>`QX9ydDgfq>V#(Bg!Fl#f=yT{5<|v@ouyvjd@1Y6~KyTOdd~HHYM^lixqq z#?1EP+Rl$p-DwK-qqfR34g3CFR5ECZoMlYgp(f}Moj~4ic10iTV86wK%jQXH_r*0t zZQ9*ddA_bf4;#a52|sT!Yn(6g6TbdYjM>=T?wL1<|q4G7&( zIl;#7U51q8w(T`a3ZfR2O+qKty($cSe+dLF?!Qs<@mfPpvr4JDH1j}=48tN}(qqOe zgy49+u4Jy*IMs2KoGfH3+5YO;&R9fNl`bpmmf0D$KAN1B0X*IPlCjo)MobXw8jdQc z%6 zDi{ro^vs#h&_RR9hyyF!oV1HI2QJa5!$BpBox0eM=j(QuOF>lG!b&UNa4NJHO5i`5 z1cLLggVm!xi;aSU7kZrn1X$Vl)UfD@1xbSYY_e<&eTn;`w+Bj-`D=I3sR+2-Kd+QKo+_-Y&Y^zKOc^ zsNND9vs|xe$?{N;LK9zYfTJq*G#x|1**X~-Jz@;s`SXk_+N(hvW=_b2hr9#W8}m z-iN7+sBe!;EMi`43)RSGL*k;hR}c2)rriGrJhD?&)g7zfKEC0E6%A=(-c02S{t7wj z_WqnxJ&X){KE*D)FkO+wIIw})=_C!5%3;c_6K%{&4V13tj3zZqKL>(z+)I$R9((s% zn+B6Co_;|$wRe97DXf??UZYQ{xN}{XQNUiSZpaY`XK7S%R{wY&R=7o`aj8MDJX%6_ zFEix(KPn#AANc%Hi-*NSf_$z(`L@QmIRXf%i&eHcs-$2I9|u#sD6xu9smlJoqE_$C zyKp7gZASWHcldQQ)$DV*Nh@S1KMORN@WUjR265NG&Ds@>b$r2*?M&cLAre}F)_8O3 z1~#7%+0S&&xPk=?ctXC+CJ{)_#X`m?$SiCu{tCYzX;n zmiwP#(6|>~4KTwHvF&fZ3;o*qby1p$W$#;!-OXZt{(;m6I$Ms%>?7OQIIx5L9`UNC zq3#?lZb@<+T1{lBL_La;O`u!%eeldOU2PREB6?C}y9siGaLeG3YEg1VeUz25)IK%V z^rsn*Pk*&yw)cGfOFZHq`{^O^h6+9^6xQpU^mW`g4$Yv?+FidU9a!Fk94#+&WoNx1 zPFf6{8Y$$x+%@%OFVHhCD{(eI+|JY~+KZJt?B;r$4+N=?miy4lXqfbV5cfpN(F(-g z!0+8wz-AF#uIRyxYvXophNLzNe@xsti$q;IOrBiqSpEUYM&;9W3C!F}O+1wQ+k)<{ zhdqY{px!0`Z^Z##L(+U1^T_S$63MwsaQj_-Z*{yhv=L0r2N0xTG4Kx-VCmM95L(^* zrXt~&_$02GPybQzc>ciWk6Jt|9wI4bt)^81q--G&U^)!3F`M&h&m3Gn?H7m!-ls`w zS6tQ`eIIyd@Bz`dGQ6;&QnTO%psW(_#-l&K2{u8*PbNz&qsrf<5e|!HmN@clLz;=Z zZTjoDV6gdw;Qi}h+B;S~`+_fCGYbI$-e={Ve&xeBfdXKPmwD-z=TzH1AOvNQBHcte zGbL&TXd}VD#QV8Q{vq)ipvc53uNL&ba`jQ3!pAUaBKIT8JTci~*ywD# zG7smOYWPG(z>JshW-K<~QyYo|w-6a#uc$|9=(EmwC8Al_`*kNn94B2coJ7^MCi>+I z&pKRo`K*>=E2U*Esxooi{S9ODU3C=@bXDhB=QUu4zf>UL%Qvoj^&s=vMfK46s~rPD z%=MHgvGCIe9_-4Y@oyAgI9f3f=>4cy9G-1AVGPw8S6LkzZPv16xry(Wq$HsT!S?4odY$Fvo)ul<4N-MR6YdX+}&7LipJXVvQD3y2Kv zKnpB0T!Nr%Ww7~#;Q#Aj&XdEiTCp^j)%lk3pHF{r-Z*-{)AzTJ<9x8Nh9_Ho!wa{ z=1vwnBKS&X--;ejVBOcXxKr{)dZ1=Wiu7w&@h;`KPabi&(I78n=tBYQ!!9i0t3ubsc+u>YKVP*IcHryZz|pFuljbqxJX98XkLjGa~4d;2b zl_i$BJMBx_j?x9q%<-+z4+6E16GJLHo4fXz8|wB`hG`m2XNdZVPa*n%peMm%w#SdU zXK0;pN@8I|(4l&I>EV!Os8dNqX1Q}UVRFnD`HXY|(4tSVf_v-E=fA9+rqyZqF)T7j zheN&eDF=cG39!AYYQL|y=UX3=gzV3y_3*#<6rz|w(4Uxu#bXqgwTE)1!^0ww8=SG5 z2q3nVS+PB&pUgGY(NkE!ds_Oh-UuuB2R?t);$iWc6SN?aPdG^Sr+@&9se|j=<2IeC zBry3*avq4dKc`W=+roQP{cdT-T8p^JeO4wJsev#FThtsv#P(}xYuo6X=TG5$%Rv!# zfqGw8qi>!D>f-JsJw0;F246g(zYc~SrR9ZzhWRD$3lK0A`qk&!%R{^m56obxi8515 zWmQ|4WqylXtDakv%ND@@)!bQjMcIW>7({yL9vTVhlCB|@Mp_W*?rxCoZikj`LBgR+ zQb3Sylx_r+e$nOoP1YK|`4jfK_qEQ_?HT z3apjD%2Zdb)0rDobGXane(8Q zr0pZNDsOrkFO?mlPH%1K@8`aOHXy+y~0()6vNT!w()CEA$3@VC5VPYcK|3rVM1*8bb~RE}9enr{Qa>|J2NVHPL}`9yK<8K1#2@y4 z((Lke;D4nqwsX=msICC18C2Go06>I3Yb)wZieG6;V(R?mL`;UuCm|e9;Xh#Oze88a zYg&si0cU4+mAo%iH)Y#znI2B_q(rBscup`qOTu6}^YLHp#}ogHKYz{QZt&s^V5XKy z+$SY&!883v3iL+BDm>+c(w|H9ugX7=jtODY7_)il7M6m^NQ5TvyTNd;l-^W+ss+SH z@&*hNECkylh0AJwgctd}LavK=;saG9Ys;3OpBDRh02Bv{%5Uy*~0w`AG=ec>_BX zWVYzOw@!guiTnfJ@4c|Qz&oK; zNXf()hLt`vSU*`dVh~O$ zlL{5xYz~Wtm*63-eeJ2$ zrXrO4IQpiz?lb!v0&r=o247r)ZD{lLZTrGAy#zxdJt0le>Us0W`lXUhtA#T=d@s`d z^FVCs;PtkUm*D5(t(pl6hV98f?+#4mI@3lgKrC*+W@`a^tLWc12c9X#*zsKQkc2uk-s_ zB`$K4QW2{QOt!t!U)(T^4pMxMtPNpGbctXe)uL1(wR89&0kuD2r0y;3iv4Y9&ajl` z@a+XU+3On|5(>xMYC0%|>6|@-kPVIWAv(Q!`6|Z^=CbL_1=Pa+2XD1b65xY~4RgH_!X6C1{ku0Y zu_>Uh%OT`SFs;^U^%zS+D@(quSh$on+yTX!MFQz1DL$c57J7^(Parclcqi%)c)#}+ z?*h;Hup-SmF4mRXO4ihlZ;s-}+@~iZe$!{5HLIwE!~V$e>QkkE!?< z9OUd|O$CsruhDX2A+K+@>E3S`pxe=YpiTdPRyTXyE*DH;b#jf@sIO11kU^I8#~;Vl56dTz%`kRWZVpG)rWb zTPui8;*6CizZw|0sA*|KiVI zv$z{P5i~tLX$7Kk^nL(}cZ8@oumMEyH4aLDHm9Qim7}%d^|RGT1Pi}Q$k26Zwjo}h z;4o5OCKpD^^f1^Mj&jds?;b5z77|}U#CioJ`zJOV#WGdd-MfLkQ2P_+*}a9i#MI^_ zuV1KE+=BO0V6B_Yw+H88ut=3RlHB^blr^hs4SH9f;i2H@tCVB$Io9)17r0W1-3y=101CmdCWTG;>K0qT$R-<|?PyQEMSi`qSP zzdZschz93o_?@IIQX5d(T~JS*u^WdeY{5DR70nGzp2Hi%9S6vh+C(mJepZ2LkNyMR z?}f~}!29Ic>)6Qw6D;W1D80j2g|UYhxpk(;CB2{BecV5W3CUD?)#Dgr0*9?TBzXJa zU;usvJN5@9F&Ylb1rnmO%=cf>50YRPUH8uiHIP)z@!cT7h5V<*W5~yAtq2GYi&8Kl z5{r*-+8laU(`;%x1fSf2az5P4d(hJ1IuY<1^j@o7h z{V21UD-Wrn3F}`!BMo(PW-YfMy*&jGWu@eJwzw^bdusNJu{I~axZ3nZxBa8wN&m&4 zzh-eac=q92y8|9^&(Ch(Y93+utosMl^vgmU;odUpO%dbiqjF7Ep+;1)U@u^#o$bQ0 zG+80kXVaAEMw-gu$zGp-z!>O&p2Xx=5G`h|+R5cq0WZJC-Q`O zFhS7hO<6zAEJRV2EIsq|t?FbN5&+~iP|ig(@f8z$s8P*FO6%Zfx6^yPSZd5rMUsss zLF#vlfkCJRvYH8vYJOId;Vs++L-n5#*;u_=xTSYu#Hy(Qpo&>e90Ks_dg1r z>|gx(YZiBdryhUFhtwdHeR#VFo6QGdJyqn!M8<&f#9K1~cLYuns>nM|)vq%Is`_?_ zIPf7&&OWTv0Q`uaNqEaseWFS$I8ps`pMfE+g^cXD{pfnb=xcb}+jK1(h3 z4|u;fq3;53d`s`O^4uEP&U}jsC|rQ>TN*GG=jZJZG>5dt z-L2Xntwk2#&)`ptRx8TaV@Taq#gSbArqpq4j4DOcy-)xsjK6q=sb{s{y>WbpWTt;q zZ<`&@XH51qGZ4`@=(;FNDC<-UMYQ-?7hcB4>$hz@LLMLI)dtkfom18~UcdT)^^bxl z{}+G$n#JAVF=x3wKy4mZrnLp2R05h;r;LMrc`u;^?{bY+Z($<+K$dx8?5mpxA;W`( zP|xhaa6H&>+f3pMLVp5ko5Vx3a9)Hg!mj}((TxxJ{J(a0grcpFqgaBT(r3WJUFoY)`wHkSWSJh;5ga#p1}`pRDS zfj(55Xxq_Rc0Y|CmeasE0?+n3CWN4D{m{1UO~SVmSg2tPx{P{YGle+2VO#TJL(?(FTMzwvW*VpeS zpM%eswIF~@H&aD4$FHbF)enK0e9(1%NNcm#Pi%$Eq*m%#>a3$;ef zD2|nN2vdvBb)>tjI<&7I&~!@Z4`kOy!2yM-6krpC0jxB`x2Y|n%ydk?#ZB(9gtl{s zUdgqY5pPKKOglQ?lxeA|}Lb|>Uz#ULOsglUV+VF2ahh7#Ob z_3)!Cp3Y^dlEU$v&8AcO^8s-sk&VpM^BR;k$chNZ(%jGiK?Pmu=!s;8Id!mL$;funChVoY73ld}1p)i41)u z@>;+M*#g!3N$16o8Bj(Jf64QNvl#&ZqJ7dg6*oe<4Sz$)6KpA(`@}L7Rpzl4UT37= zaAl2qNxT^UVR+I|{p_nM-Y^)9<>A~(9w+u!o-={1azdp0ZvddB*UMQkB=L1ij|j48 z5=>?hJGi^y>ljKwEu)Jt?WFDRCA7pA5CaERxVD9-+@k>`DWcu_NMeB_2~W#Z>zvR2 zQShGs#h<@saW{C5arR;wu{0m#KLSwb47bgQ<yb4xZ~y0x>Wsw&6h=@= z*_0-e(ay*c>WU@7DzZ;Gj3BAodgL{kwwy#Td|6n2sOdj9wD7IY4gji?OhWmHr1vsl_@bFbEO#dX-L?#Mf_DlnU+H&rSbxKl^OIk zaxkj*7Ip|T6OOzP#$$fF7L@e8&iuT7pV@yIN?}*Wk#oPZ5i<4rMArG%uhm(xSYxmlM%s(h69RcCBqB7j}v z6)cill!V76JtgP$8`%ox$0wY#dzAp#e%N7$+tL!m{%NV<%UYg_47fu<4-QNpmf1i< zw8@eEJ`m?#oHlx=rH-Y%y&nVf!4!t6rIO=#N4HG>T6cqSKHTI8Y7_u;E$l<|{QL*iV~;$~%2^q=gzZ z*C)3N@=4ppo|J}DxGW{@9~Hy_{j=c@1P))H=4mU8)YmOPQ%nntP=EQ#3>l#{9#~e& z3H8AMqkeB;icDxKrC~p=GH?JW>YCwI2*=!4SI~yZCDhTvT_v@@+u43EJ1^v=R-!$gaZeV8t$0S*&kJGV4XB0v51z!} zEb)@I?}#LB$~;&+cm^toU0efQSx=>h zS?V+pY)6Jt@kP(ozaz^E*+=|{LInyKqZZ^9k1VBi@U*d?y|MPE}z(HzO4!;1O_VCM=0!5*+U85y} z*HlQRL+wu(&3g;$FSTAq@ZVBIrvsqmUF*@DPFc{Pxj-ol32hP15LQv9E@0O=Ey0aU zm}1)>LQ7YF)A||P4VhR53t<8Lm{TC2sBJvV5ueR>F+(>mZ20lMTCh%Wf78}`sD=Fx zo*(V192<|at>g&fXE=QdB*KS_ws!36ECLIeVv zMYBKHje*X%Ng@)SFH$MHhLkaxag=8 zGF(r32(FlMtCzChpmo~Pk*bAjFur~>4ldzGHJb0;_ zLB{5$#Vl-RAR6VTMm{1*tCd=?w3F(@CH@qdiwUwv5`hwz65=eEo9>rveYrT7={+q3 zsD=FxUZ5Sz@bgN5oz3pa_dTBIAvfz;~6&RfaxsnfG&-aVh$CK`a ze7P;9Yus`rCr5?vHl(1}4^R06-tSPTyTId79u6oILGzDGGt{?r-)&&$br5X4D2u$d zi}yHkivR)J%*mY;NXLgXbJ!|YYb{#~0*q$iA3T`H5f*7<^S%u`3fZ|a7xPE_8n9k< zGrY7={GvD1Ka(xXhbWG)Z!m|wczZw1o^>rf&cdY=i_M(IMBJ4d(;x5B&L=4s=mBdn z3IILd&8Xb-tP^+cZRQW+H1eWc*UzXh>Du*}RX&49RpxxYigx4KuCJ)|Jcf`Th~tl- z4X-K|t)ka$B~{_7W9q4ejs znCOM-uS|vxLZTvVJ@mn(1=SG=&6PZmAd`(uS7xp~A}+7T?*z>Dq&s(D0MVlpq%mJA z^jg>wbA&+>HxKUdRrBS&g~{eLh6$g5GmWhPD23PU!I%gTgl7>@3M=0X2EvwN?_ACf zGsSzIrhFu~HzvCX%TnR5dwnH1<-;xyuej%BF*Z)M7gL0(GJrDa$nGv%*;)aBIM z(SgwYZLn35hgSHC&)WoNKJ^cHztgVn0&ij(hX;RmO5~vgR*;gc^jQHR)8Pl4Y+hYX zoqejzy!+~Ip3KQe#F`r-14Dm%F2YV{R@rVGCLXF2?0TeFj$C3e-94(A^642JGM z5&@vJ;`avV58lvrpCoMY1fg~#)!-8liGBY%T(YMWp7l}ri)FU_W`{&=bWYETbsc8B`Pw%wT87<-=?@Y{!#FB{^HMHv$z|)FDIcIjN;*RQMX^+1>Lwl0O2P0-Jz`t zCs>ByS`$77o~=jaN5uvjuZ9|gvH~U$mwsOJ5;zWAUu#GS!sQt(K0&z5=Qg{+H9f#& z?6eK$iwc$!aouviM|Z-jdkX^yBg)!5qX;j$&DDJ2qwZ$+NCOEU2TJf9=C@z7!?TTf zGt}w4AEz$ICMLXQ=3Pl>*_m*ch%ehkp?!xZwxlJuWjcHK7VON{DIW_|k-T#vO^}>>&SXNacJhw+ zz2J7_=MpTDQis!hAPt&R1U_uqAMk#svE2n;h;CrVk#utBi<(a0u_`T5kGA!izC-in zIRvC3k*eYDz2;ppDH_HT4+{f^t@|iF5S|;<4NAV^bP~%uS8oylfJB1e(qo<6F4bKW zc=<{K`VQECs+q`|;>4$pLzF*ThY50!^VK4)P|0p5d-7{fhyRe5O5Jf$3_}bOvSMZm z6b68%Nqy55*Cm=)IynVTHbB&Elt6Suh1*NbY55$AsEV9JX zGkh11Woum0=N(8>K;}I3$BraY++?*iD5)abv8IuPi^kyc%FSl6H8uLsIcb?h9t+W% K0z>HI{r&@xdX4n} diff --git a/cli/testdata/wallet1_solo.json b/cli/testdata/wallet1_solo.json index 5bad532d4..bab9b7b66 100644 --- a/cli/testdata/wallet1_solo.json +++ b/cli/testdata/wallet1_solo.json @@ -19,11 +19,11 @@ "isdefault": true }, { - "address": "NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY", + "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", "key": "6PYL8Gnjsz4RBKX18jx5ZAQTDH7PKkZwEVjPKEkjNzCDNFE6TKZwaFLibL", "label": "", "contract": { - "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw==", + "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", "parameters": [ { "name": "parameter0", @@ -44,11 +44,11 @@ "isdefault": false }, { - "address": "NVNvVRW5Q5naSx2k2iZm7xRgtRNGuZppAK", + "address": "NNudMSGzEoktFzdYGYoNb3bzHzbmM1genF", "key": "6PYL8Gnjsz4RBKX18jx5ZAQTDH7PKkZwEVjPKEkjNzCDNFE6TKZwaFLibL", "label": "", "contract": { - "script": "EQwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CEQtBE43vrw==", + "script": "EQwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CEUF7zmyl", "parameters": [ { "name": "parameter0", @@ -61,11 +61,11 @@ "isdefault": false }, { - "address" : "NWTDxsHVde5qSjRkTRUAg6i8xC3JSWEC9k", + "address" : "NTe3yHH5zsaEGvEHTsFRpCjTef6Aod4yb6", "key" : "6PYSgdjUPVjo3ZJLg2CsheXnEZzyvUuSm4jCtXP6X7FT82sAQHWt2wpu5A", "label" : "", "contract" : { - "script" : "VwMAQS1RCDAhcAwUVVQtU+0PVUb61E1umZEoZwIvzl7bMHFoE87bKGnbKJdA", + "script" : "VwEAEdsgQFcAA0A=", "deployed" : true, "parameters" : [] }, diff --git a/cli/testdata/wallets/testwallet_NEO3.json b/cli/testdata/wallets/testwallet_NEO3.json index 1141c9777..1ade05d76 100644 --- a/cli/testdata/wallets/testwallet_NEO3.json +++ b/cli/testdata/wallets/testwallet_NEO3.json @@ -19,11 +19,11 @@ "isdefault": false }, { - "address": "NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY", + "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", "key": "6PYL8Gnjsz4RBKX18jx5ZAQTDH7PKkZwEVjPKEkjNzCDNFE6TKZwaFLibL", "label": "", "contract": { - "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw==", + "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", "parameters": [ { "name": "parameter0", diff --git a/cli/wallet_test.go b/cli/wallet_test.go index 10ae7d669..67d44fa4b 100644 --- a/cli/wallet_test.go +++ b/cli/wallet_test.go @@ -346,12 +346,12 @@ func TestDumpKeys(t *testing.T) { e.checkNextLine(t, "NTh9TnZTstvAePEYWDGLLxidBikJE24uTo") e.checkNextLine(t, pubRegex) e.checkNextLine(t, "^\\s*$") - e.checkNextLine(t, "NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY") + e.checkNextLine(t, "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6") for i := 0; i < 4; i++ { e.checkNextLine(t, pubRegex) } e.checkNextLine(t, "^\\s*$") - e.checkNextLine(t, "NVNvVRW5Q5naSx2k2iZm7xRgtRNGuZppAK") + e.checkNextLine(t, "NNudMSGzEoktFzdYGYoNb3bzHzbmM1genF") e.checkNextLine(t, pubRegex) e.checkEOF(t) }) @@ -363,7 +363,7 @@ func TestDumpKeys(t *testing.T) { e.checkEOF(t) }) t.Run("3/4 multisig", func(t *testing.T) { - cmd := append(cmd, "-a", "NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY") + cmd := append(cmd, "-a", "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6") e.Run(t, cmd...) e.checkNextLine(t, "3 out of 4 multisig contract") for i := 0; i < 4; i++ { @@ -372,7 +372,7 @@ func TestDumpKeys(t *testing.T) { e.checkEOF(t) }) t.Run("1/1 multisig", func(t *testing.T) { - cmd := append(cmd, "--address", "NVNvVRW5Q5naSx2k2iZm7xRgtRNGuZppAK") + cmd := append(cmd, "--address", "NNudMSGzEoktFzdYGYoNb3bzHzbmM1genF") e.Run(t, cmd...) e.checkNextLine(t, "1 out of 1 multisig contract") e.checkNextLine(t, pubRegex) diff --git a/pkg/compiler/syscall_test.go b/pkg/compiler/syscall_test.go index cfb2f6bf6..c9a960629 100644 --- a/pkg/compiler/syscall_test.go +++ b/pkg/compiler/syscall_test.go @@ -61,36 +61,36 @@ func TestSyscallExecution(t *testing.T) { sigs := "[]interop.Signature{" + sig + "}" sctx := "storage.Context{}" interops := map[string]syscallTestCase{ - "contract.Call": {interopnames.SystemContractCall, []string{u160, `"m"`, "1", "3"}, false}, - "contract.CreateMultisigAccount": {interopnames.SystemContractCreateMultisigAccount, []string{"1", pubs}, false}, - "contract.CreateStandardAccount": {interopnames.SystemContractCreateStandardAccount, []string{pub}, false}, - "contract.IsStandard": {interopnames.SystemContractIsStandard, []string{u160}, false}, - "contract.GetCallFlags": {interopnames.SystemContractGetCallFlags, nil, false}, - "iterator.Create": {interopnames.SystemIteratorCreate, []string{pubs}, false}, - "iterator.Next": {interopnames.SystemIteratorNext, []string{"iterator.Iterator{}"}, false}, - "iterator.Value": {interopnames.SystemIteratorValue, []string{"iterator.Iterator{}"}, false}, - "runtime.CheckWitness": {interopnames.SystemRuntimeCheckWitness, []string{b}, false}, - "runtime.GasLeft": {interopnames.SystemRuntimeGasLeft, nil, false}, - "runtime.GetCallingScriptHash": {interopnames.SystemRuntimeGetCallingScriptHash, nil, false}, - "runtime.GetEntryScriptHash": {interopnames.SystemRuntimeGetEntryScriptHash, nil, false}, - "runtime.GetExecutingScriptHash": {interopnames.SystemRuntimeGetExecutingScriptHash, nil, false}, - "runtime.GetInvocationCounter": {interopnames.SystemRuntimeGetInvocationCounter, nil, false}, - "runtime.GetNotifications": {interopnames.SystemRuntimeGetNotifications, []string{u160}, false}, - "runtime.GetScriptContainer": {interopnames.SystemRuntimeGetScriptContainer, nil, false}, - "runtime.GetTime": {interopnames.SystemRuntimeGetTime, nil, false}, - "runtime.GetTrigger": {interopnames.SystemRuntimeGetTrigger, nil, false}, - "runtime.Log": {interopnames.SystemRuntimeLog, []string{`"msg"`}, true}, - "runtime.Notify": {interopnames.SystemRuntimeNotify, []string{`"ev"`, "1"}, true}, - "runtime.Platform": {interopnames.SystemRuntimePlatform, nil, false}, - "storage.Delete": {interopnames.SystemStorageDelete, []string{sctx, b}, true}, - "storage.Find": {interopnames.SystemStorageFind, []string{sctx, b, "storage.None"}, false}, - "storage.Get": {interopnames.SystemStorageGet, []string{sctx, b}, false}, - "storage.GetContext": {interopnames.SystemStorageGetContext, nil, false}, - "storage.GetReadOnlyContext": {interopnames.SystemStorageGetReadOnlyContext, nil, false}, - "storage.Put": {interopnames.SystemStoragePut, []string{sctx, b, b}, true}, - "storage.ConvertContextToReadOnly": {interopnames.SystemStorageAsReadOnly, []string{sctx}, false}, - "crypto.ECDSASecp256r1CheckMultisig": {interopnames.NeoCryptoCheckMultisigWithECDsaSecp256r1, []string{b, pubs, sigs}, false}, - "crypto.CheckSig": {interopnames.NeoCryptoCheckSig, []string{pub, sig}, false}, + "contract.Call": {interopnames.SystemContractCall, []string{u160, `"m"`, "1", "3"}, false}, + "contract.CreateMultisigAccount": {interopnames.SystemContractCreateMultisigAccount, []string{"1", pubs}, false}, + "contract.CreateStandardAccount": {interopnames.SystemContractCreateStandardAccount, []string{pub}, false}, + "contract.IsStandard": {interopnames.SystemContractIsStandard, []string{u160}, false}, + "contract.GetCallFlags": {interopnames.SystemContractGetCallFlags, nil, false}, + "iterator.Create": {interopnames.SystemIteratorCreate, []string{pubs}, false}, + "iterator.Next": {interopnames.SystemIteratorNext, []string{"iterator.Iterator{}"}, false}, + "iterator.Value": {interopnames.SystemIteratorValue, []string{"iterator.Iterator{}"}, false}, + "runtime.CheckWitness": {interopnames.SystemRuntimeCheckWitness, []string{b}, false}, + "runtime.GasLeft": {interopnames.SystemRuntimeGasLeft, nil, false}, + "runtime.GetCallingScriptHash": {interopnames.SystemRuntimeGetCallingScriptHash, nil, false}, + "runtime.GetEntryScriptHash": {interopnames.SystemRuntimeGetEntryScriptHash, nil, false}, + "runtime.GetExecutingScriptHash": {interopnames.SystemRuntimeGetExecutingScriptHash, nil, false}, + "runtime.GetInvocationCounter": {interopnames.SystemRuntimeGetInvocationCounter, nil, false}, + "runtime.GetNotifications": {interopnames.SystemRuntimeGetNotifications, []string{u160}, false}, + "runtime.GetScriptContainer": {interopnames.SystemRuntimeGetScriptContainer, nil, false}, + "runtime.GetTime": {interopnames.SystemRuntimeGetTime, nil, false}, + "runtime.GetTrigger": {interopnames.SystemRuntimeGetTrigger, nil, false}, + "runtime.Log": {interopnames.SystemRuntimeLog, []string{`"msg"`}, true}, + "runtime.Notify": {interopnames.SystemRuntimeNotify, []string{`"ev"`, "1"}, true}, + "runtime.Platform": {interopnames.SystemRuntimePlatform, nil, false}, + "storage.Delete": {interopnames.SystemStorageDelete, []string{sctx, b}, true}, + "storage.Find": {interopnames.SystemStorageFind, []string{sctx, b, "storage.None"}, false}, + "storage.Get": {interopnames.SystemStorageGet, []string{sctx, b}, false}, + "storage.GetContext": {interopnames.SystemStorageGetContext, nil, false}, + "storage.GetReadOnlyContext": {interopnames.SystemStorageGetReadOnlyContext, nil, false}, + "storage.Put": {interopnames.SystemStoragePut, []string{sctx, b, b}, true}, + "storage.ConvertContextToReadOnly": {interopnames.SystemStorageAsReadOnly, []string{sctx}, false}, + "crypto.CheckMultisig": {interopnames.NeoCryptoCheckMultisig, []string{pubs, sigs}, false}, + "crypto.CheckSig": {interopnames.NeoCryptoCheckSig, []string{pub, sig}, false}, } ic := &interop.Context{} core.SpawnVM(ic) // set Functions field diff --git a/pkg/consensus/testdata/wallet1.json b/pkg/consensus/testdata/wallet1.json index 1141c9777..1ade05d76 100644 --- a/pkg/consensus/testdata/wallet1.json +++ b/pkg/consensus/testdata/wallet1.json @@ -19,11 +19,11 @@ "isdefault": false }, { - "address": "NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY", + "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", "key": "6PYL8Gnjsz4RBKX18jx5ZAQTDH7PKkZwEVjPKEkjNzCDNFE6TKZwaFLibL", "label": "", "contract": { - "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw==", + "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", "parameters": [ { "name": "parameter0", diff --git a/pkg/consensus/testdata/wallet2.json b/pkg/consensus/testdata/wallet2.json index 35284cba6..d09780587 100644 --- a/pkg/consensus/testdata/wallet2.json +++ b/pkg/consensus/testdata/wallet2.json @@ -19,11 +19,11 @@ "isdefault": false }, { - "address": "NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY", + "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", "key": "6PYXADog3RQCwKRhqQsobwZEFopdcCJuMfPosM9pXPaDWSguKvznLdpADk", "label": "", "contract": { - "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw==", + "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", "parameters": [ { "name": "parameter0", diff --git a/pkg/consensus/testdata/wallet3.json b/pkg/consensus/testdata/wallet3.json index 6369f8030..2b7691e7f 100644 --- a/pkg/consensus/testdata/wallet3.json +++ b/pkg/consensus/testdata/wallet3.json @@ -19,11 +19,11 @@ "isdefault": false }, { - "address": "NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY", + "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", "key": "6PYScv3Vgvdi9EkhDNvHXdvQeuaXK9gRwXDmytCswZMNpTzMLvfgR3U5dK", "label": "", "contract": { - "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw==", + "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", "parameters": [ { "name": "parameter0", diff --git a/pkg/consensus/testdata/wallet4.json b/pkg/consensus/testdata/wallet4.json index ab3783401..92909322b 100644 --- a/pkg/consensus/testdata/wallet4.json +++ b/pkg/consensus/testdata/wallet4.json @@ -19,11 +19,11 @@ "isdefault": false }, { - "address": "NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY", + "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", "key": "6PYVwp1Sdg9DfTzvg42PZxgzMDf5a5FYBgT6ynKKzwmSHuhGkipoNjyW3a", "label": "", "contract": { - "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw==", + "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", "parameters": [ { "name": "parameter0", diff --git a/pkg/core/fee/calculate.go b/pkg/core/fee/calculate.go index 24c7c096f..7a64caa2a 100644 --- a/pkg/core/fee/calculate.go +++ b/pkg/core/fee/calculate.go @@ -24,7 +24,7 @@ func Calculate(base int64, script []byte) (int64, int) { sizeInv := 66 * m size += io.GetVarSize(sizeInv) + sizeInv + io.GetVarSize(script) netFee += calculateMultisig(base, m) + calculateMultisig(base, n) - netFee += Opcode(base, opcode.PUSHNULL) + base*ECDSAVerifyPrice*int64(n) + netFee += base * ECDSAVerifyPrice * int64(n) } else { // We can support more contract types in the future. } diff --git a/pkg/core/interop/crypto/ecdsa.go b/pkg/core/interop/crypto/ecdsa.go index 91004f902..78b9ddb1e 100644 --- a/pkg/core/interop/crypto/ecdsa.go +++ b/pkg/core/interop/crypto/ecdsa.go @@ -7,21 +7,14 @@ import ( "github.com/nspcc-dev/neo-go/pkg/core/fee" "github.com/nspcc-dev/neo-go/pkg/core/interop" - "github.com/nspcc-dev/neo-go/pkg/crypto" - "github.com/nspcc-dev/neo-go/pkg/crypto/hash" "github.com/nspcc-dev/neo-go/pkg/crypto/keys" - "github.com/nspcc-dev/neo-go/pkg/util" "github.com/nspcc-dev/neo-go/pkg/vm" - "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" ) // ECDSASecp256r1CheckMultisig checks multiple ECDSA signatures at once using // Secp256r1 elliptic curve. func ECDSASecp256r1CheckMultisig(ic *interop.Context) error { - hashToCheck, err := getMessageHash(ic, ic.VM.Estack().Pop().Item()) - if err != nil { - return err - } + hashToCheck := ic.Container.GetSignedHash() pkeys, err := ic.VM.Estack().PopSigElements() if err != nil { return fmt.Errorf("wrong parameters: %w", err) @@ -43,22 +36,6 @@ func ECDSASecp256r1CheckMultisig(ic *interop.Context) error { return nil } -func getMessageHash(ic *interop.Context, item stackitem.Item) (util.Uint256, error) { - var msg []byte - switch val := item.(type) { - case *stackitem.Interop: - return val.Value().(crypto.Verifiable).GetSignedHash(), nil - case stackitem.Null: - return ic.Container.GetSignedHash(), nil - default: - var err error - if msg, err = val.TryBytes(); err != nil { - return util.Uint256{}, err - } - } - return hash.Sha256(msg), nil -} - // ECDSASecp256r1CheckSig checks ECDSA signature using Secp256r1 elliptic curve. func ECDSASecp256r1CheckSig(ic *interop.Context) error { hashToCheck := ic.Container.GetSignedHash() diff --git a/pkg/core/interop/crypto/ecdsa_test.go b/pkg/core/interop/crypto/ecdsa_test.go index 73140dd4b..e82f64414 100644 --- a/pkg/core/interop/crypto/ecdsa_test.go +++ b/pkg/core/interop/crypto/ecdsa_test.go @@ -13,6 +13,7 @@ import ( "github.com/nspcc-dev/neo-go/pkg/core/transaction" "github.com/nspcc-dev/neo-go/pkg/crypto/keys" "github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger" + "github.com/nspcc-dev/neo-go/pkg/util" "github.com/nspcc-dev/neo-go/pkg/vm" "github.com/nspcc-dev/neo-go/pkg/vm/opcode" "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" @@ -60,12 +61,15 @@ func subSlice(arr []stackitem.Item, indices []int) []stackitem.Item { return result } -func initCheckMultisigVMNoArgs() *vm.VM { +func initCheckMultisigVMNoArgs(container *transaction.Transaction) *vm.VM { buf := make([]byte, 5) buf[0] = byte(opcode.SYSCALL) - binary.LittleEndian.PutUint32(buf[1:], ecdsaSecp256r1CheckMultisigID) + binary.LittleEndian.PutUint32(buf[1:], neoCryptoCheckMultisigID) - ic := &interop.Context{Trigger: trigger.Verification} + ic := &interop.Context{ + Trigger: trigger.Verification, + Container: container, + } Register(ic) v := ic.SpawnVM() v.LoadScript(buf) @@ -73,10 +77,13 @@ func initCheckMultisigVMNoArgs() *vm.VM { } func initCHECKMULTISIGVM(t *testing.T, n int, ik, is []int) *vm.VM { - v := initCheckMultisigVMNoArgs() - msg := []byte("NEO - An Open Network For Smart Economy") + tx := transaction.New(netmode.UnitTestNet, []byte("NEO - An Open Network For Smart Economy"), 10) + tx.Signers = []transaction.Signer{{Account: util.Uint160{1, 2, 3}}} + tx.Scripts = []transaction.Witness{{}} - pubs, sigs, _, err := initCHECKMULTISIG(msg, n) + v := initCheckMultisigVMNoArgs(tx) + + pubs, sigs, _, err := initCHECKMULTISIG(tx.GetSignedPart(), n) require.NoError(t, err) pubs = subSlice(pubs, ik) @@ -84,7 +91,6 @@ func initCHECKMULTISIGVM(t *testing.T, n int, ik, is []int) *vm.VM { v.Estack().PushVal(sigs) v.Estack().PushVal(pubs) - v.Estack().PushVal(msg) return v } @@ -142,26 +148,20 @@ func testCurveCHECKMULTISIGBad(t *testing.T) { pubs, sigs, _, err := initCHECKMULTISIG(msg, 1) require.NoError(t, err) arr := stackitem.NewArray([]stackitem.Item{stackitem.NewArray(nil)}) + tx := transaction.New(netmode.UnitTestNet, []byte("NEO - An Open Network For Smart Economy"), 10) + tx.Signers = []transaction.Signer{{Account: util.Uint160{1, 2, 3}}} + tx.Scripts = []transaction.Witness{{}} - t.Run("invalid message type", func(t *testing.T) { - v := initCheckMultisigVMNoArgs() - v.Estack().PushVal(sigs) - v.Estack().PushVal(pubs) - v.Estack().PushVal(stackitem.NewArray(nil)) - require.Error(t, v.Run()) - }) t.Run("invalid public keys", func(t *testing.T) { - v := initCheckMultisigVMNoArgs() + v := initCheckMultisigVMNoArgs(tx) v.Estack().PushVal(sigs) v.Estack().PushVal(arr) - v.Estack().PushVal(msg) require.Error(t, v.Run()) }) t.Run("invalid signatures", func(t *testing.T) { - v := initCheckMultisigVMNoArgs() + v := initCheckMultisigVMNoArgs(tx) v.Estack().PushVal(arr) v.Estack().PushVal(pubs) - v.Estack().PushVal(msg) require.Error(t, v.Run()) }) } diff --git a/pkg/core/interop/crypto/interop.go b/pkg/core/interop/crypto/interop.go index 8a06c7fc3..ebfd1c719 100644 --- a/pkg/core/interop/crypto/interop.go +++ b/pkg/core/interop/crypto/interop.go @@ -6,12 +6,12 @@ import ( ) var ( - ecdsaSecp256r1CheckMultisigID = interopnames.ToID([]byte(interopnames.NeoCryptoCheckMultisigWithECDsaSecp256r1)) - neoCryptoCheckSigID = interopnames.ToID([]byte(interopnames.NeoCryptoCheckSig)) + neoCryptoCheckMultisigID = interopnames.ToID([]byte(interopnames.NeoCryptoCheckMultisig)) + neoCryptoCheckSigID = interopnames.ToID([]byte(interopnames.NeoCryptoCheckSig)) ) var cryptoInterops = []interop.Function{ - {ID: ecdsaSecp256r1CheckMultisigID, Func: ECDSASecp256r1CheckMultisig}, + {ID: neoCryptoCheckMultisigID, Func: ECDSASecp256r1CheckMultisig}, {ID: neoCryptoCheckSigID, Func: ECDSASecp256r1CheckSig}, } diff --git a/pkg/core/interop/interopnames/names.go b/pkg/core/interop/interopnames/names.go index 8e043beba..96f7e0ddd 100644 --- a/pkg/core/interop/interopnames/names.go +++ b/pkg/core/interop/interopnames/names.go @@ -2,43 +2,43 @@ package interopnames // Names of all used interops. const ( - SystemCallbackCreate = "System.Callback.Create" - SystemCallbackCreateFromMethod = "System.Callback.CreateFromMethod" - SystemCallbackCreateFromSyscall = "System.Callback.CreateFromSyscall" - SystemCallbackInvoke = "System.Callback.Invoke" - SystemContractCall = "System.Contract.Call" - SystemContractCallNative = "System.Contract.CallNative" - SystemContractCreateMultisigAccount = "System.Contract.CreateMultisigAccount" - SystemContractCreateStandardAccount = "System.Contract.CreateStandardAccount" - SystemContractIsStandard = "System.Contract.IsStandard" - SystemContractGetCallFlags = "System.Contract.GetCallFlags" - SystemContractNativeOnPersist = "System.Contract.NativeOnPersist" - SystemContractNativePostPersist = "System.Contract.NativePostPersist" - SystemIteratorCreate = "System.Iterator.Create" - SystemIteratorNext = "System.Iterator.Next" - SystemIteratorValue = "System.Iterator.Value" - SystemRuntimeCheckWitness = "System.Runtime.CheckWitness" - SystemRuntimeGasLeft = "System.Runtime.GasLeft" - SystemRuntimeGetCallingScriptHash = "System.Runtime.GetCallingScriptHash" - SystemRuntimeGetEntryScriptHash = "System.Runtime.GetEntryScriptHash" - SystemRuntimeGetExecutingScriptHash = "System.Runtime.GetExecutingScriptHash" - SystemRuntimeGetInvocationCounter = "System.Runtime.GetInvocationCounter" - SystemRuntimeGetNotifications = "System.Runtime.GetNotifications" - SystemRuntimeGetScriptContainer = "System.Runtime.GetScriptContainer" - SystemRuntimeGetTime = "System.Runtime.GetTime" - SystemRuntimeGetTrigger = "System.Runtime.GetTrigger" - SystemRuntimeLog = "System.Runtime.Log" - SystemRuntimeNotify = "System.Runtime.Notify" - SystemRuntimePlatform = "System.Runtime.Platform" - SystemStorageDelete = "System.Storage.Delete" - SystemStorageFind = "System.Storage.Find" - SystemStorageGet = "System.Storage.Get" - SystemStorageGetContext = "System.Storage.GetContext" - SystemStorageGetReadOnlyContext = "System.Storage.GetReadOnlyContext" - SystemStoragePut = "System.Storage.Put" - SystemStorageAsReadOnly = "System.Storage.AsReadOnly" - NeoCryptoCheckMultisigWithECDsaSecp256r1 = "Neo.Crypto.CheckMultisigWithECDsaSecp256r1" - NeoCryptoCheckSig = "Neo.Crypto.CheckSig" + SystemCallbackCreate = "System.Callback.Create" + SystemCallbackCreateFromMethod = "System.Callback.CreateFromMethod" + SystemCallbackCreateFromSyscall = "System.Callback.CreateFromSyscall" + SystemCallbackInvoke = "System.Callback.Invoke" + SystemContractCall = "System.Contract.Call" + SystemContractCallNative = "System.Contract.CallNative" + SystemContractCreateMultisigAccount = "System.Contract.CreateMultisigAccount" + SystemContractCreateStandardAccount = "System.Contract.CreateStandardAccount" + SystemContractIsStandard = "System.Contract.IsStandard" + SystemContractGetCallFlags = "System.Contract.GetCallFlags" + SystemContractNativeOnPersist = "System.Contract.NativeOnPersist" + SystemContractNativePostPersist = "System.Contract.NativePostPersist" + SystemIteratorCreate = "System.Iterator.Create" + SystemIteratorNext = "System.Iterator.Next" + SystemIteratorValue = "System.Iterator.Value" + SystemRuntimeCheckWitness = "System.Runtime.CheckWitness" + SystemRuntimeGasLeft = "System.Runtime.GasLeft" + SystemRuntimeGetCallingScriptHash = "System.Runtime.GetCallingScriptHash" + SystemRuntimeGetEntryScriptHash = "System.Runtime.GetEntryScriptHash" + SystemRuntimeGetExecutingScriptHash = "System.Runtime.GetExecutingScriptHash" + SystemRuntimeGetInvocationCounter = "System.Runtime.GetInvocationCounter" + SystemRuntimeGetNotifications = "System.Runtime.GetNotifications" + SystemRuntimeGetScriptContainer = "System.Runtime.GetScriptContainer" + SystemRuntimeGetTime = "System.Runtime.GetTime" + SystemRuntimeGetTrigger = "System.Runtime.GetTrigger" + SystemRuntimeLog = "System.Runtime.Log" + SystemRuntimeNotify = "System.Runtime.Notify" + SystemRuntimePlatform = "System.Runtime.Platform" + SystemStorageDelete = "System.Storage.Delete" + SystemStorageFind = "System.Storage.Find" + SystemStorageGet = "System.Storage.Get" + SystemStorageGetContext = "System.Storage.GetContext" + SystemStorageGetReadOnlyContext = "System.Storage.GetReadOnlyContext" + SystemStoragePut = "System.Storage.Put" + SystemStorageAsReadOnly = "System.Storage.AsReadOnly" + NeoCryptoCheckMultisig = "Neo.Crypto.CheckMultisig" + NeoCryptoCheckSig = "Neo.Crypto.CheckSig" ) var names = []string{ @@ -77,6 +77,6 @@ var names = []string{ SystemStorageGetReadOnlyContext, SystemStoragePut, SystemStorageAsReadOnly, - NeoCryptoCheckMultisigWithECDsaSecp256r1, + NeoCryptoCheckMultisig, NeoCryptoCheckSig, } diff --git a/pkg/core/interops.go b/pkg/core/interops.go index 4a91c0e95..ee30a429b 100644 --- a/pkg/core/interops.go +++ b/pkg/core/interops.go @@ -75,7 +75,7 @@ var systemInterops = []interop.Function{ } var neoInterops = []interop.Function{ - {Name: interopnames.NeoCryptoCheckMultisigWithECDsaSecp256r1, Func: crypto.ECDSASecp256r1CheckMultisig, Price: 0, ParamCount: 3}, + {Name: interopnames.NeoCryptoCheckMultisig, Func: crypto.ECDSASecp256r1CheckMultisig, Price: 0, ParamCount: 2}, {Name: interopnames.NeoCryptoCheckSig, Func: crypto.ECDSASecp256r1CheckSig, Price: fee.ECDSAVerifyPrice, ParamCount: 2}, } diff --git a/pkg/core/oracle_test.go b/pkg/core/oracle_test.go index 968296a3b..332a5a338 100644 --- a/pkg/core/oracle_test.go +++ b/pkg/core/oracle_test.go @@ -97,9 +97,9 @@ func TestCreateResponseTx(t *testing.T) { bc.SetOracle(orc) tx, err := orc.CreateResponseTx(int64(req.GasForResponse), 1, resp) require.NoError(t, err) - assert.Equal(t, 167, tx.Size()) - assert.Equal(t, int64(2216640), tx.NetworkFee) - assert.Equal(t, int64(97783360), tx.SystemFee) + assert.Equal(t, 166, tx.Size()) + assert.Equal(t, int64(2215610), tx.NetworkFee) + assert.Equal(t, int64(97784390), tx.SystemFee) } func TestOracle_InvalidWallet(t *testing.T) { diff --git a/pkg/core/util_test.go b/pkg/core/util_test.go index 8772038ef..4cd46e6ca 100644 --- a/pkg/core/util_test.go +++ b/pkg/core/util_test.go @@ -17,14 +17,14 @@ func TestGenesisBlockMainNet(t *testing.T) { block, err := createGenesisBlock(cfg.ProtocolConfiguration) require.NoError(t, err) - expect := "d71dfebcc59d42b2f3b3f0e0d6b3b77a4880276db1df92c08c7c1bac94bece35" + expect := "de3bfe3e328af04d48f62bd7a9c533641cc0e1fb6a7741c5119d6a6eaedc5269" assert.Equal(t, expect, block.Hash().StringLE()) } func TestGetConsensusAddressMainNet(t *testing.T) { var ( - consensusAddr = "NiVihDFvZacZhujTWkBhRz32UDuNRp416f" - consensusScript = "f7b4d00143932f3b6243cfc06cb4a68f22c739e2" + consensusAddr = "NSX179gdoQmF8nu34rQdL4dYAfdCQhHtQS" + consensusScript = "4870eaa62eee7c76b76d2ae933d4c027f5f5c77d" ) cfg, err := config.Load("../../config", netmode.MainNet) diff --git a/pkg/interop/crypto/crypto.go b/pkg/interop/crypto/crypto.go index 2cea41e56..726a3e2cf 100644 --- a/pkg/interop/crypto/crypto.go +++ b/pkg/interop/crypto/crypto.go @@ -8,14 +8,15 @@ import ( "github.com/nspcc-dev/neo-go/pkg/interop/neogointernal" ) -// ECDSASecp256r1CheckMultisig checks multiple ECDSA signatures at once. It uses -// `Neo.Crypto.CheckMultisigWithECDsaSecp256r1` syscall. -func ECDSASecp256r1CheckMultisig(msg []byte, pubs []interop.PublicKey, sigs []interop.Signature) bool { - return neogointernal.Syscall3("Neo.Crypto.CheckMultisigWithECDsaSecp256r1", msg, pubs, sigs).(bool) +// CheckMultisig checks that script container (transaction) is signed by multiple +// ECDSA keys at once. It uses `Neo.Crypto.CheckMultisig` syscall. +func CheckMultisig(pubs []interop.PublicKey, sigs []interop.Signature) bool { + return neogointernal.Syscall2("Neo.Crypto.CheckMultisig", pubs, sigs).(bool) } -// CheckSig checks that sig is correct script-container's signature for a given pub -// (serialized public key). It uses `Neo.Crypto.CheckSig` syscall. +// CheckSig checks that sig is correct signature of the script container +// (transaction) for a given pub (serialized public key). It uses +// `Neo.Crypto.CheckSig` syscall. func CheckSig(pub interop.PublicKey, sig interop.Signature) bool { return neogointernal.Syscall2("Neo.Crypto.CheckSig", pub, sig).(bool) } diff --git a/pkg/rpc/server/server_test.go b/pkg/rpc/server/server_test.go index c817561df..2a5c18335 100644 --- a/pkg/rpc/server/server_test.go +++ b/pkg/rpc/server/server_test.go @@ -60,8 +60,8 @@ type rpcTestCase struct { } const testContractHash = "1e1c3024bd955ff3baf7cb92e3b7608c7bb3712b" -const deploymentTxHash = "9b14d575ae0f45a4e2765929a28a118693428edb8143615cc2ae58d5039d1c38" -const genesisBlockHash = "9e7cf6fcfc8d0d6831fac75fa895535a5f1960f45a34754b57bff4d4929635c5" +const deploymentTxHash = "7cf43b182dee2e8bd2c5209cd230799aeba1b5b13000db682d917c89eacd1eae" +const genesisBlockHash = "d237e3500d8b4cf0df3fd9c4c053016afae141207a6c732303bdd91aff444ecc" const verifyContractHash = "5bb4bac40e961e334ba7bd36d2496010f67e246e" const verifyContractAVM = "VwMAQS1RCDAhcAwUVVQtU+0PVUb61E1umZEoZwIvzl7bMHFoE87bKGnbKJdA" diff --git a/pkg/rpc/server/testdata/testblocks.acc b/pkg/rpc/server/testdata/testblocks.acc index 1cb4dcb1878e19d4e2d8d1b52f0ff8c7a12c5540..f6ff51a72b692ac24d2516f90ea290e9adeddb36 100644 GIT binary patch delta 3994 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 delta 4047 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 e`bY