From 55f910777ece107a6d17b516acd4ed4132ba899e Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Thu, 28 Jul 2022 16:56:48 +0300 Subject: [PATCH] Revert "native/interop: revert management.hasMethod()" This reverts commit 6c7a401f776a37ffb7fe1b27c360931f85fe897d, introducing changes from #2598 again. --- examples/engine/go.mod | 2 +- examples/engine/go.sum | 4 +-- examples/events/go.mod | 2 +- examples/events/go.sum | 4 +-- examples/iterator/go.mod | 2 +- examples/iterator/go.sum | 4 +-- examples/nft-d/go.mod | 2 +- examples/nft-d/go.sum | 4 +-- examples/nft-nd-nns/go.mod | 2 +- examples/nft-nd-nns/go.sum | 3 +- examples/nft-nd/go.mod | 2 +- examples/nft-nd/go.sum | 4 +-- examples/oracle/go.mod | 2 +- examples/oracle/go.sum | 4 +-- examples/runtime/go.mod | 2 +- examples/runtime/go.sum | 4 +-- examples/storage/go.mod | 2 +- examples/storage/go.sum | 4 +-- examples/timer/go.mod | 2 +- examples/timer/go.sum | 4 +-- examples/token/go.mod | 2 +- examples/token/go.sum | 4 +-- go.mod | 2 +- go.sum | 4 +-- pkg/compiler/native_test.go | 1 + pkg/core/native/management.go | 34 +++++++++++++++--- .../native/native_test/management_test.go | 5 +++ pkg/interop/native/management/management.go | 6 ++++ pkg/services/rpcsrv/server_test.go | 28 ++++++++------- pkg/services/rpcsrv/testdata/testblocks.acc | Bin 34867 -> 35080 bytes 30 files changed, 94 insertions(+), 51 deletions(-) diff --git a/examples/engine/go.mod b/examples/engine/go.mod index 809bc9ba5..1776bbc04 100644 --- a/examples/engine/go.mod +++ b/examples/engine/go.mod @@ -2,4 +2,4 @@ module github.com/nspcc-dev/neo-go/examples/engine go 1.16 -require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 +require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 diff --git a/examples/engine/go.sum b/examples/engine/go.sum index aa43d98a0..64af3880f 100644 --- a/examples/engine/go.sum +++ b/examples/engine/go.sum @@ -1,2 +1,2 @@ -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 h1:+BoyBexD7gjb2IoeZemdcsjKvIs6ouE/iLDQFZMIBS4= -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 h1:Krhg2cD5mqvC+lin7irw6hj0M+x4ZOZrRGzrZQB+wcQ= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= diff --git a/examples/events/go.mod b/examples/events/go.mod index 32d864b83..e511e98fa 100644 --- a/examples/events/go.mod +++ b/examples/events/go.mod @@ -2,4 +2,4 @@ module github.com/nspcc-dev/neo-go/examples/events go 1.16 -require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 +require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 diff --git a/examples/events/go.sum b/examples/events/go.sum index aa43d98a0..64af3880f 100644 --- a/examples/events/go.sum +++ b/examples/events/go.sum @@ -1,2 +1,2 @@ -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 h1:+BoyBexD7gjb2IoeZemdcsjKvIs6ouE/iLDQFZMIBS4= -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 h1:Krhg2cD5mqvC+lin7irw6hj0M+x4ZOZrRGzrZQB+wcQ= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= diff --git a/examples/iterator/go.mod b/examples/iterator/go.mod index 906cef5f2..1e1a7998d 100644 --- a/examples/iterator/go.mod +++ b/examples/iterator/go.mod @@ -2,4 +2,4 @@ module github.com/nspcc-dev/neo-go/examples/iterator go 1.16 -require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 +require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 diff --git a/examples/iterator/go.sum b/examples/iterator/go.sum index aa43d98a0..64af3880f 100644 --- a/examples/iterator/go.sum +++ b/examples/iterator/go.sum @@ -1,2 +1,2 @@ -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 h1:+BoyBexD7gjb2IoeZemdcsjKvIs6ouE/iLDQFZMIBS4= -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 h1:Krhg2cD5mqvC+lin7irw6hj0M+x4ZOZrRGzrZQB+wcQ= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= diff --git a/examples/nft-d/go.mod b/examples/nft-d/go.mod index 23064a02f..15569b773 100644 --- a/examples/nft-d/go.mod +++ b/examples/nft-d/go.mod @@ -2,4 +2,4 @@ module github.com/nspcc-dev/neo-go/examples/nft go 1.16 -require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 +require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 diff --git a/examples/nft-d/go.sum b/examples/nft-d/go.sum index aa43d98a0..64af3880f 100644 --- a/examples/nft-d/go.sum +++ b/examples/nft-d/go.sum @@ -1,2 +1,2 @@ -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 h1:+BoyBexD7gjb2IoeZemdcsjKvIs6ouE/iLDQFZMIBS4= -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 h1:Krhg2cD5mqvC+lin7irw6hj0M+x4ZOZrRGzrZQB+wcQ= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= diff --git a/examples/nft-nd-nns/go.mod b/examples/nft-nd-nns/go.mod index c433c0ebe..689cbf921 100644 --- a/examples/nft-nd-nns/go.mod +++ b/examples/nft-nd-nns/go.mod @@ -4,6 +4,6 @@ go 1.16 require ( github.com/nspcc-dev/neo-go v0.99.1-pre.0.20220711130119-3594c4f760bc - github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 + github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 github.com/stretchr/testify v1.7.0 ) diff --git a/examples/nft-nd-nns/go.sum b/examples/nft-nd-nns/go.sum index ff1bcecd8..dae977ef3 100644 --- a/examples/nft-nd-nns/go.sum +++ b/examples/nft-nd-nns/go.sum @@ -180,8 +180,9 @@ github.com/nspcc-dev/neo-go v0.73.1-pre.0.20200303142215-f5a1b928ce09/go.mod h1: github.com/nspcc-dev/neo-go v0.98.0/go.mod h1:E3cc1x6RXSXrJb2nDWXTXjnXk3rIqVN8YdFyWv+FrqM= github.com/nspcc-dev/neo-go v0.99.1-pre.0.20220711130119-3594c4f760bc h1:jFPvWUbQeBQrBMOR2lOSHmUWJcyc2OYEBf9fh/qcPXQ= github.com/nspcc-dev/neo-go v0.99.1-pre.0.20220711130119-3594c4f760bc/go.mod h1:LRmtGkErJek0nV9lakj24lscCclkPCjgUUQLG+FPw1w= -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 h1:+BoyBexD7gjb2IoeZemdcsjKvIs6ouE/iLDQFZMIBS4= github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 h1:Krhg2cD5mqvC+lin7irw6hj0M+x4ZOZrRGzrZQB+wcQ= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= github.com/nspcc-dev/neofs-api-go/v2 v2.11.0-pre.0.20211201134523-3604d96f3fe1/go.mod h1:oS8dycEh8PPf2Jjp6+8dlwWyEv2Dy77h/XhhcdxYEFs= github.com/nspcc-dev/neofs-api-go/v2 v2.11.1/go.mod h1:oS8dycEh8PPf2Jjp6+8dlwWyEv2Dy77h/XhhcdxYEFs= github.com/nspcc-dev/neofs-crypto v0.2.0/go.mod h1:F/96fUzPM3wR+UGsPi3faVNmFlA9KAEAUQR7dMxZmNA= diff --git a/examples/nft-nd/go.mod b/examples/nft-nd/go.mod index c62a8a546..65783102f 100644 --- a/examples/nft-nd/go.mod +++ b/examples/nft-nd/go.mod @@ -2,4 +2,4 @@ module github.com/nspcc-dev/neo-go/examples/nft-nd go 1.16 -require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 +require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 diff --git a/examples/nft-nd/go.sum b/examples/nft-nd/go.sum index aa43d98a0..64af3880f 100644 --- a/examples/nft-nd/go.sum +++ b/examples/nft-nd/go.sum @@ -1,2 +1,2 @@ -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 h1:+BoyBexD7gjb2IoeZemdcsjKvIs6ouE/iLDQFZMIBS4= -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 h1:Krhg2cD5mqvC+lin7irw6hj0M+x4ZOZrRGzrZQB+wcQ= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= diff --git a/examples/oracle/go.mod b/examples/oracle/go.mod index a3051d76a..45068a400 100644 --- a/examples/oracle/go.mod +++ b/examples/oracle/go.mod @@ -2,4 +2,4 @@ module github.com/nspcc-dev/neo-go/examples/oracle go 1.16 -require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 +require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 diff --git a/examples/oracle/go.sum b/examples/oracle/go.sum index aa43d98a0..64af3880f 100644 --- a/examples/oracle/go.sum +++ b/examples/oracle/go.sum @@ -1,2 +1,2 @@ -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 h1:+BoyBexD7gjb2IoeZemdcsjKvIs6ouE/iLDQFZMIBS4= -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 h1:Krhg2cD5mqvC+lin7irw6hj0M+x4ZOZrRGzrZQB+wcQ= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= diff --git a/examples/runtime/go.mod b/examples/runtime/go.mod index 644c2f2a8..a707d8f35 100644 --- a/examples/runtime/go.mod +++ b/examples/runtime/go.mod @@ -2,4 +2,4 @@ module github.com/nspcc-dev/neo-go/examples/runtime go 1.16 -require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 +require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 diff --git a/examples/runtime/go.sum b/examples/runtime/go.sum index aa43d98a0..64af3880f 100644 --- a/examples/runtime/go.sum +++ b/examples/runtime/go.sum @@ -1,2 +1,2 @@ -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 h1:+BoyBexD7gjb2IoeZemdcsjKvIs6ouE/iLDQFZMIBS4= -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 h1:Krhg2cD5mqvC+lin7irw6hj0M+x4ZOZrRGzrZQB+wcQ= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= diff --git a/examples/storage/go.mod b/examples/storage/go.mod index 38796dab9..b88550b74 100644 --- a/examples/storage/go.mod +++ b/examples/storage/go.mod @@ -2,4 +2,4 @@ module github.com/nspcc-dev/neo-go/examples/storage go 1.16 -require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 +require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 diff --git a/examples/storage/go.sum b/examples/storage/go.sum index aa43d98a0..64af3880f 100644 --- a/examples/storage/go.sum +++ b/examples/storage/go.sum @@ -1,2 +1,2 @@ -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 h1:+BoyBexD7gjb2IoeZemdcsjKvIs6ouE/iLDQFZMIBS4= -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 h1:Krhg2cD5mqvC+lin7irw6hj0M+x4ZOZrRGzrZQB+wcQ= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= diff --git a/examples/timer/go.mod b/examples/timer/go.mod index 30c771ccc..3d3095b30 100644 --- a/examples/timer/go.mod +++ b/examples/timer/go.mod @@ -2,4 +2,4 @@ module github.com/nspcc-dev/neo-go/examples/timer go 1.16 -require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 +require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 diff --git a/examples/timer/go.sum b/examples/timer/go.sum index aa43d98a0..64af3880f 100644 --- a/examples/timer/go.sum +++ b/examples/timer/go.sum @@ -1,2 +1,2 @@ -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 h1:+BoyBexD7gjb2IoeZemdcsjKvIs6ouE/iLDQFZMIBS4= -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 h1:Krhg2cD5mqvC+lin7irw6hj0M+x4ZOZrRGzrZQB+wcQ= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= diff --git a/examples/token/go.mod b/examples/token/go.mod index 97535b00b..efe33bb30 100644 --- a/examples/token/go.mod +++ b/examples/token/go.mod @@ -2,4 +2,4 @@ module github.com/nspcc-dev/neo-go/examples/token go 1.16 -require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 +require github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 diff --git a/examples/token/go.sum b/examples/token/go.sum index aa43d98a0..64af3880f 100644 --- a/examples/token/go.sum +++ b/examples/token/go.sum @@ -1,2 +1,2 @@ -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 h1:+BoyBexD7gjb2IoeZemdcsjKvIs6ouE/iLDQFZMIBS4= -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 h1:Krhg2cD5mqvC+lin7irw6hj0M+x4ZOZrRGzrZQB+wcQ= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= diff --git a/go.mod b/go.mod index 0624594ce..9ca23d4cc 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/mr-tron/base58 v1.2.0 github.com/nspcc-dev/dbft v0.0.0-20220629112714-fd49ca59d354 github.com/nspcc-dev/go-ordered-json v0.0.0-20220111165707-25110be27d22 - github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 + github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 github.com/nspcc-dev/neofs-sdk-go v0.0.0-20220113123743-7f3162110659 github.com/nspcc-dev/rfc6979 v0.2.0 github.com/pierrec/lz4 v2.6.1+incompatible diff --git a/go.sum b/go.sum index e5b0f74ef..efd958ae1 100644 --- a/go.sum +++ b/go.sum @@ -185,8 +185,8 @@ github.com/nspcc-dev/hrw v1.0.9 h1:17VcAuTtrstmFppBjfRiia4K2wA/ukXZhLFS8Y8rz5Y= github.com/nspcc-dev/hrw v1.0.9/go.mod h1:l/W2vx83vMQo6aStyx2AuZrJ+07lGv2JQGlVkPG06MU= github.com/nspcc-dev/neo-go v0.73.1-pre.0.20200303142215-f5a1b928ce09/go.mod h1:pPYwPZ2ks+uMnlRLUyXOpLieaDQSEaf4NM3zHVbRjmg= github.com/nspcc-dev/neo-go v0.98.0/go.mod h1:E3cc1x6RXSXrJb2nDWXTXjnXk3rIqVN8YdFyWv+FrqM= -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1 h1:+BoyBexD7gjb2IoeZemdcsjKvIs6ouE/iLDQFZMIBS4= -github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220711125924-78e5f16573a1/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42 h1:Krhg2cD5mqvC+lin7irw6hj0M+x4ZOZrRGzrZQB+wcQ= +github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220713145417-4f184498bc42/go.mod h1:QBE0I30F2kOAISNpT5oks82yF4wkkUq3SCfI3Hqgx/Y= github.com/nspcc-dev/neofs-api-go/v2 v2.11.0-pre.0.20211201134523-3604d96f3fe1/go.mod h1:oS8dycEh8PPf2Jjp6+8dlwWyEv2Dy77h/XhhcdxYEFs= github.com/nspcc-dev/neofs-api-go/v2 v2.11.1 h1:SVqc523pZsSaS9vnPS1mm3VV6b6xY0gvdA0uYJ/GWZQ= github.com/nspcc-dev/neofs-api-go/v2 v2.11.1/go.mod h1:oS8dycEh8PPf2Jjp6+8dlwWyEv2Dy77h/XhhcdxYEFs= diff --git a/pkg/compiler/native_test.go b/pkg/compiler/native_test.go index 6b8027205..8dc484e98 100644 --- a/pkg/compiler/native_test.go +++ b/pkg/compiler/native_test.go @@ -206,6 +206,7 @@ func TestNativeHelpersCompile(t *testing.T) { {"destroy", nil}, {"getContract", []string{u160}}, {"getMinimumDeploymentFee", nil}, + {"hasMethod", []string{u160, `"method"`, "0"}}, {"setMinimumDeploymentFee", []string{"42"}}, {"update", []string{"nil", "nil"}}, {"updateWithData", []string{"nil", "nil", "123"}}, diff --git a/pkg/core/native/management.go b/pkg/core/native/management.go index 549289b8d..acb538500 100644 --- a/pkg/core/native/management.go +++ b/pkg/core/native/management.go @@ -141,6 +141,13 @@ func newManagement() *Management { md = newMethodAndPrice(m.setMinimumDeploymentFee, 1<<15, callflag.States) m.AddMethod(md, desc) + desc = newDescriptor("hasMethod", smartcontract.IntegerType, + manifest.NewParameter("hash", smartcontract.Hash160Type), + manifest.NewParameter("method", smartcontract.StringType), + manifest.NewParameter("pcount", smartcontract.IntegerType)) + md = newMethodAndPrice(m.hasMethod, 1<<15, callflag.ReadStates) + m.AddMethod(md, desc) + hashParam := manifest.NewParameter("Hash", smartcontract.Hash160Type) m.AddEvent(contractDeployNotificationName, hashParam) m.AddEvent(contractUpdateNotificationName, hashParam) @@ -148,10 +155,8 @@ func newManagement() *Management { return m } -// getContract is an implementation of public getContract method, it's run under -// VM protections, so it's OK for it to panic instead of returning errors. -func (m *Management) getContract(ic *interop.Context, args []stackitem.Item) stackitem.Item { - hashBytes, err := args[0].TryBytes() +func toHash160(si stackitem.Item) util.Uint160 { + hashBytes, err := si.TryBytes() if err != nil { panic(err) } @@ -159,6 +164,13 @@ func (m *Management) getContract(ic *interop.Context, args []stackitem.Item) sta if err != nil { panic(err) } + return hash +} + +// getContract is an implementation of public getContract method, it's run under +// VM protections, so it's OK for it to panic instead of returning errors. +func (m *Management) getContract(ic *interop.Context, args []stackitem.Item) stackitem.Item { + hash := toHash160(args[0]) ctr, err := m.GetContract(ic.DAO, hash) if err != nil { if err == storage.ErrKeyNotFound { @@ -456,6 +468,20 @@ func contractToStack(cs *state.Contract) stackitem.Item { return si } +func (m *Management) hasMethod(ic *interop.Context, args []stackitem.Item) stackitem.Item { + cHash := toHash160(args[0]) + method, err := stackitem.ToString(args[1]) + if err != nil { + panic(err) + } + pcount := int(toInt64((args[2]))) + cs, err := m.GetContract(ic.DAO, cHash) + if err != nil { + return stackitem.NewBool(false) + } + return stackitem.NewBool(cs.Manifest.ABI.GetMethod(method, pcount) != nil) +} + // Metadata implements the Contract interface. func (m *Management) Metadata() *interop.ContractMD { return &m.ContractMD diff --git a/pkg/core/native/native_test/management_test.go b/pkg/core/native/native_test/management_test.go index a74a20e8d..ce846a95e 100644 --- a/pkg/core/native/native_test/management_test.go +++ b/pkg/core/native/native_test/management_test.go @@ -213,6 +213,11 @@ func TestManagement_ContractDeploy(t *testing.T) { t.Run("get after deploy", func(t *testing.T) { managementInvoker.Invoke(t, si, "getContract", cs1.Hash.BytesBE()) }) + t.Run("hasMethod after deploy", func(t *testing.T) { + managementInvoker.Invoke(t, stackitem.NewBool(true), "hasMethod", cs1.Hash.BytesBE(), "add", 2) + managementInvoker.Invoke(t, stackitem.NewBool(false), "hasMethod", cs1.Hash.BytesBE(), "add", 1) + managementInvoker.Invoke(t, stackitem.NewBool(false), "hasMethod", cs1.Hash.BytesLE(), "add", 2) + }) t.Run("get after restore", func(t *testing.T) { w := io.NewBufBinWriter() require.NoError(t, chaindump.Dump(c.Executor.Chain, w.BinWriter, 0, c.Executor.Chain.BlockHeight()+1)) diff --git a/pkg/interop/native/management/management.go b/pkg/interop/native/management/management.go index 0f3fbe20f..8e392a2c7 100644 --- a/pkg/interop/native/management/management.go +++ b/pkg/interop/native/management/management.go @@ -40,6 +40,12 @@ func GetMinimumDeploymentFee() int { return neogointernal.CallWithToken(Hash, "getMinimumDeploymentFee", int(contract.ReadStates)).(int) } +// HasMethod represents `hasMethod` method of Management native contract. It allows to check +// if the "hash" contract has a method named "method" with parameters number equal to "pcount". +func HasMethod(hash interop.Hash160, method string, pcount int) bool { + return neogointernal.CallWithToken(Hash, "hasMethod", int(contract.ReadStates), hash, method, pcount).(bool) +} + // SetMinimumDeploymentFee represents `setMinimumDeploymentFee` method of Management native contract. func SetMinimumDeploymentFee(value int) { neogointernal.CallWithTokenNoRet(Hash, "setMinimumDeploymentFee", int(contract.States), value) diff --git a/pkg/services/rpcsrv/server_test.go b/pkg/services/rpcsrv/server_test.go index 3f7fe8971..77b73fd46 100644 --- a/pkg/services/rpcsrv/server_test.go +++ b/pkg/services/rpcsrv/server_test.go @@ -73,12 +73,12 @@ const ( verifyContractHash = "06ed5314c2e4cb103029a60b86d46afa2fb8f67c" verifyContractAVM = "VwIAQS1RCDBwDBTunqIsJ+NL0BSPxBCOCPdOj1BIskrZMCQE2zBxaBPOStkoJATbKGlK2SgkBNsol0A=" verifyWithArgsContractHash = "0dce75f52adb1a4c5c6eaa6a34eb26db2e5b3781" - nnsContractHash = "ee92563903e4efd53565784080b2dbdc5c37e21f" + nnsContractHash = "bdbfe1a280a0e23ca5b569c8f5845169bd93cb06" nnsToken1ID = "6e656f2e636f6d" - nfsoContractHash = "c7ec8e0fb4d669913e4ffdd4ba4fa3502e5d2d10" + nfsoContractHash = "0e15ca0df00669a2cd5dcb03bfd3e2b3849c2969" nfsoToken1ID = "7e244ffd6aa85fb1579d2ed22e9b761ab62e3486" invokescriptContractAVM = "VwIADBQBDAMOBQYMDQIODw0DDgcJAAAAAErZMCQE2zBwaEH4J+yMqiYEEUAMFA0PAwIJAAIBAwcDBAUCAQAOBgwJStkwJATbMHFpQfgn7IyqJgQSQBNA" - block20StateRootLE = "af7fad57fc622305b162c4440295964168a07967d07244964e4ed0121b247dee" + block20StateRootLE = "c0abd1e544338e2da6bb8ea7c1915fc44ff4226150b053ca8ff8ca75d50faf49" storageContractHash = "ebc0c16a76c808cd4dde6bcc063f09e45e331ec7" ) @@ -896,10 +896,11 @@ var rpcTestCases = map[string][]rpcTestCase{ name: "positive, with notifications", params: `["` + nnsContractHash + `", "transfer", [{"type":"Hash160", "value":"0x0bcd2978634d961c24f5aea0802297ff128724d6"},{"type":"String", "value":"neo.com"},{"type":"Any", "value":null}],["0xb248508f4ef7088e10c48f14d04be3272ca29eee"]]`, result: func(e *executor) interface{} { - script := []byte{0x0b, 0x0c, 0x07, 0x6e, 0x65, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x0c, 0x14, 0xd6, 0x24, 0x87, 0x12, 0xff, 0x97, 0x22, 0x80, 0xa0, 0xae, 0xf5, 0x24, 0x1c, 0x96, 0x4d, 0x63, 0x78, 0x29, 0xcd, 0xb, 0x13, 0xc0, 0x1f, 0xc, 0x8, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0xc, 0x14, 0x1f, 0xe2, 0x37, 0x5c, 0xdc, 0xdb, 0xb2, 0x80, 0x40, 0x78, 0x65, 0x35, 0xd5, 0xef, 0xe4, 0x3, 0x39, 0x56, 0x92, 0xee, 0x41, 0x62, 0x7d, 0x5b, 0x52} + script := append([]byte{0x0b, 0x0c, 0x07, 0x6e, 0x65, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x0c, 0x14, 0xd6, 0x24, 0x87, 0x12, 0xff, 0x97, 0x22, 0x80, 0xa0, 0xae, 0xf5, 0x24, 0x1c, 0x96, 0x4d, 0x63, 0x78, 0x29, 0xcd, 0xb, 0x13, 0xc0, 0x1f, 0xc, 0x8, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0xc, 0x14}, nnsHash.BytesBE()...) + script = append(script, 0x41, 0x62, 0x7d, 0x5b, 0x52) return &result.Invoke{ State: "HALT", - GasConsumed: 32167260, + GasConsumed: 32414250, Script: script, Stack: []stackitem.Item{stackitem.Make(true)}, Notifications: []state.NotificationEvent{{ @@ -929,7 +930,7 @@ var rpcTestCases = map[string][]rpcTestCase{ chg := []dboper.Operation{{ State: "Changed", Key: []byte{0xfa, 0xff, 0xff, 0xff, 0xb}, - Value: []byte{0x70, 0xd9, 0x59, 0x9d, 0x51, 0x79, 0x12}, + Value: []byte{0xf6, 0x8b, 0x4e, 0x9d, 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}, @@ -941,7 +942,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, 0x88, 0x3e, 0xfa, 0xdb, 0x08}, + Value: []byte{0x41, 0x01, 0x21, 0x05, 0xe4, 0x74, 0xef, 0xdb, 0x08}, }} // Can be returned in any order. assert.ElementsMatch(t, chg, res.Diagnostics.Changes) @@ -951,7 +952,8 @@ var rpcTestCases = map[string][]rpcTestCase{ name: "positive, verbose", params: `["` + nnsContractHash + `", "resolve", [{"type":"String", "value":"neo.com"},{"type":"Integer","value":1}], [], true]`, result: func(e *executor) interface{} { - script := []byte{0x11, 0xc, 0x7, 0x6e, 0x65, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x12, 0xc0, 0x1f, 0xc, 0x7, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0xc, 0x14, 0x1f, 0xe2, 0x37, 0x5c, 0xdc, 0xdb, 0xb2, 0x80, 0x40, 0x78, 0x65, 0x35, 0xd5, 0xef, 0xe4, 0x3, 0x39, 0x56, 0x92, 0xee, 0x41, 0x62, 0x7d, 0x5b, 0x52} + script := append([]byte{0x11, 0xc, 0x7, 0x6e, 0x65, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x12, 0xc0, 0x1f, 0xc, 0x7, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0xc, 0x14}, nnsHash.BytesBE()...) + script = append(script, 0x41, 0x62, 0x7d, 0x5b, 0x52) stdHash, _ := e.chain.GetNativeContractScriptHash(nativenames.StdLib) cryptoHash, _ := e.chain.GetNativeContractScriptHash(nativenames.CryptoLib) return &result.Invoke{ @@ -1041,10 +1043,11 @@ var rpcTestCases = map[string][]rpcTestCase{ name: "positive, with notifications", params: `[20, "` + nnsContractHash + `", "transfer", [{"type":"Hash160", "value":"0x0bcd2978634d961c24f5aea0802297ff128724d6"},{"type":"String", "value":"neo.com"},{"type":"Any", "value":null}],["0xb248508f4ef7088e10c48f14d04be3272ca29eee"]]`, result: func(e *executor) interface{} { - script := []byte{0x0b, 0x0c, 0x07, 0x6e, 0x65, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x0c, 0x14, 0xd6, 0x24, 0x87, 0x12, 0xff, 0x97, 0x22, 0x80, 0xa0, 0xae, 0xf5, 0x24, 0x1c, 0x96, 0x4d, 0x63, 0x78, 0x29, 0xcd, 0xb, 0x13, 0xc0, 0x1f, 0xc, 0x8, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0xc, 0x14, 0x1f, 0xe2, 0x37, 0x5c, 0xdc, 0xdb, 0xb2, 0x80, 0x40, 0x78, 0x65, 0x35, 0xd5, 0xef, 0xe4, 0x3, 0x39, 0x56, 0x92, 0xee, 0x41, 0x62, 0x7d, 0x5b, 0x52} + script := append([]byte{0x0b, 0x0c, 0x07, 0x6e, 0x65, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x0c, 0x14, 0xd6, 0x24, 0x87, 0x12, 0xff, 0x97, 0x22, 0x80, 0xa0, 0xae, 0xf5, 0x24, 0x1c, 0x96, 0x4d, 0x63, 0x78, 0x29, 0xcd, 0xb, 0x13, 0xc0, 0x1f, 0xc, 0x8, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0xc, 0x14}, nnsHash.BytesBE()...) + script = append(script, 0x41, 0x62, 0x7d, 0x5b, 0x52) return &result.Invoke{ State: "HALT", - GasConsumed: 32167260, + GasConsumed: 32414250, Script: script, Stack: []stackitem.Item{stackitem.Make(true)}, Notifications: []state.NotificationEvent{{ @@ -1064,7 +1067,8 @@ var rpcTestCases = map[string][]rpcTestCase{ name: "positive, verbose", params: `[20, "` + nnsContractHash + `", "resolve", [{"type":"String", "value":"neo.com"},{"type":"Integer","value":1}], [], true]`, result: func(e *executor) interface{} { - script := []byte{0x11, 0xc, 0x7, 0x6e, 0x65, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x12, 0xc0, 0x1f, 0xc, 0x7, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0xc, 0x14, 0x1f, 0xe2, 0x37, 0x5c, 0xdc, 0xdb, 0xb2, 0x80, 0x40, 0x78, 0x65, 0x35, 0xd5, 0xef, 0xe4, 0x3, 0x39, 0x56, 0x92, 0xee, 0x41, 0x62, 0x7d, 0x5b, 0x52} + script := append([]byte{0x11, 0xc, 0x7, 0x6e, 0x65, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x12, 0xc0, 0x1f, 0xc, 0x7, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0xc, 0x14}, nnsHash.BytesBE()...) + script = append(script, 0x41, 0x62, 0x7d, 0x5b, 0x52) stdHash, _ := e.chain.GetNativeContractScriptHash(nativenames.StdLib) cryptoHash, _ := e.chain.GetNativeContractScriptHash(nativenames.CryptoLib) return &result.Invoke{ @@ -2592,7 +2596,7 @@ func checkNep17Balances(t *testing.T, e *executor, acc interface{}) { }, { Asset: e.chain.UtilityTokenHash(), - Amount: "37100367680", + Amount: "37099660700", LastUpdated: 22, Decimals: 8, Name: "GasToken", diff --git a/pkg/services/rpcsrv/testdata/testblocks.acc b/pkg/services/rpcsrv/testdata/testblocks.acc index 62dbbe3dfbc4fcddabdf39bdc2b6db94a5d5ed6d..965230d6a41c18d15ae5096cba629b1e7f2bda78 100644 GIT binary patch delta 6101 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