From 56a616f21c52e773294aef327fdc45c4f7f6ec23 Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Tue, 11 May 2021 11:39:13 +0300 Subject: [PATCH 01/11] wallet: add test to regenerate Notary testwallets --- pkg/wallet/regenerate_test.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/pkg/wallet/regenerate_test.go b/pkg/wallet/regenerate_test.go index f12ced41e..56499e5a9 100644 --- a/pkg/wallet/regenerate_test.go +++ b/pkg/wallet/regenerate_test.go @@ -123,3 +123,35 @@ func TestRegenerateWalletTestdata(t *testing.T) { require.NoError(t, w.savePretty()) w.Close() } + +func TestRegenerateNotaryWallets(t *testing.T) { + if !regenerate { + return + } + const ( + walletDir = "../services/notary/testdata/" + acc1WIF = "L1MstxuD8SvS9HuFcV5oYzcdA1xX8D9bD9qPwg8fU5SSywYBecg3" + acc2WIF = "L2iGxPvxbyWpYEbCZk2L3PgT7sCQaSDAbBC4MRLAjhs1s2JZ1xs5" + acc3WIF = "L1xD2yiUyARX8DAkWa8qGpWpwjqW2u717VzUJyByk6s7HinhRVZv" + acc4WIF = "L1ioz93TNt6Nu1aoMpZQ4zgdtgC8ZvJMC6pyHFkrovdR3SFwbn6n" + ) + + acc1 := getAccount(t, acc1WIF, "one") + acc2 := getAccount(t, acc2WIF, "one") + acc3 := getAccount(t, acc3WIF, "four") + + w, err := NewWallet(path.Join(walletDir, "notary1.json")) + require.NoError(t, err) + w.AddAccount(acc1) + w.AddAccount(acc2) + w.AddAccount(acc3) + require.NoError(t, w.savePretty()) + w.Close() + + acc4 := getAccount(t, acc4WIF, "two") + w, err = NewWallet(path.Join(walletDir, "notary2.json")) + require.NoError(t, err) + w.AddAccount(acc4) + require.NoError(t, w.savePretty()) + w.Close() +} From 14189c50aa6d45f9312d8949d2573180ff0964cc Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Tue, 11 May 2021 12:03:28 +0300 Subject: [PATCH 02/11] wallet: add test to regenerate Oracle testwallets --- pkg/wallet/regenerate_test.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/pkg/wallet/regenerate_test.go b/pkg/wallet/regenerate_test.go index 56499e5a9..19cae1c91 100644 --- a/pkg/wallet/regenerate_test.go +++ b/pkg/wallet/regenerate_test.go @@ -155,3 +155,28 @@ func TestRegenerateNotaryWallets(t *testing.T) { require.NoError(t, w.savePretty()) w.Close() } + +func TestRegenerateOracleWallets(t *testing.T) { + if !regenerate { + return + } + const ( + walletDir = "../services/oracle/testdata/" + acc1WIF = "L38E2tRktb2kWc5j3Kx6Cg3ifVoi4DHhpVZrQormEFTT92C4iSUa" + acc2WIF = "KyA8z2MyLCSjJFG3F4SUp85CZ4WJm4qgWihFJZFEDYGEyw8oGcEP" + ) + + acc1 := getAccount(t, acc1WIF, "one") + w, err := NewWallet(path.Join(walletDir, "oracle1.json")) + require.NoError(t, err) + w.AddAccount(acc1) + require.NoError(t, w.savePretty()) + w.Close() + + acc2 := getAccount(t, acc2WIF, "two") + w, err = NewWallet(path.Join(walletDir, "oracle2.json")) + require.NoError(t, err) + w.AddAccount(acc2) + require.NoError(t, w.savePretty()) + w.Close() +} From 68d0249c500ff5565c6cbfcf5ca7a0deaf6d2ca5 Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Tue, 11 May 2021 12:17:00 +0300 Subject: [PATCH 03/11] wallet: refactor regenerate test Move common code to a separate function. --- pkg/wallet/regenerate_test.go | 61 +++++++++-------------------------- 1 file changed, 15 insertions(+), 46 deletions(-) diff --git a/pkg/wallet/regenerate_test.go b/pkg/wallet/regenerate_test.go index 19cae1c91..c6846a64e 100644 --- a/pkg/wallet/regenerate_test.go +++ b/pkg/wallet/regenerate_test.go @@ -56,13 +56,7 @@ func TestRegenerateSoloWallet(t *testing.T) { acc3 := getAccount(t, wif, "one") require.NoError(t, acc3.ConvertMultisig(1, keys.PublicKeys{getKeys(t)[0]})) - w, err := NewWallet(walletPath) - require.NoError(t, err) - w.AddAccount(acc1) - w.AddAccount(acc2) - w.AddAccount(acc3) - require.NoError(t, w.savePretty()) - w.Close() + createWallet(t, walletPath, acc1, acc2, acc3) } func regenerateWallets(t *testing.T, dir string) { @@ -72,12 +66,7 @@ func regenerateWallets(t *testing.T, dir string) { acc2 := getAccount(t, privnetWIFs[i], passwords[i]) require.NoError(t, acc2.ConvertMultisig(3, pubs)) - w, err := NewWallet(path.Join(dir, fmt.Sprintf("wallet%d.json", i+1))) - require.NoError(t, err) - w.AddAccount(acc1) - w.AddAccount(acc2) - require.NoError(t, w.savePretty()) - w.Close() + createWallet(t, path.Join(dir, fmt.Sprintf("wallet%d.json", i+1)), acc1, acc2) } } @@ -108,20 +97,9 @@ func TestRegenerateWalletTestdata(t *testing.T) { acc3 := getAccount(t, privnetWIFs[1], "two") acc3.Default = true - w, err := NewWallet(path.Join(walletDir, "wallet1.json")) - require.NoError(t, err) - w.AddAccount(acc1) - w.AddAccount(acc2) - require.NoError(t, w.savePretty()) - w.Close() + createWallet(t, path.Join(walletDir, "wallet1.json"), acc1, acc2) - w, err = NewWallet(path.Join(walletDir, "wallet2.json")) - require.NoError(t, err) - w.AddAccount(acc1) - w.AddAccount(acc2) - w.AddAccount(acc3) - require.NoError(t, w.savePretty()) - w.Close() + createWallet(t, path.Join(walletDir, "wallet2.json"), acc1, acc2, acc3) } func TestRegenerateNotaryWallets(t *testing.T) { @@ -139,21 +117,10 @@ func TestRegenerateNotaryWallets(t *testing.T) { acc1 := getAccount(t, acc1WIF, "one") acc2 := getAccount(t, acc2WIF, "one") acc3 := getAccount(t, acc3WIF, "four") - - w, err := NewWallet(path.Join(walletDir, "notary1.json")) - require.NoError(t, err) - w.AddAccount(acc1) - w.AddAccount(acc2) - w.AddAccount(acc3) - require.NoError(t, w.savePretty()) - w.Close() + createWallet(t, path.Join(walletDir, "notary1.json"), acc1, acc2, acc3) acc4 := getAccount(t, acc4WIF, "two") - w, err = NewWallet(path.Join(walletDir, "notary2.json")) - require.NoError(t, err) - w.AddAccount(acc4) - require.NoError(t, w.savePretty()) - w.Close() + createWallet(t, path.Join(walletDir, "notary2.json"), acc4) } func TestRegenerateOracleWallets(t *testing.T) { @@ -167,16 +134,18 @@ func TestRegenerateOracleWallets(t *testing.T) { ) acc1 := getAccount(t, acc1WIF, "one") - w, err := NewWallet(path.Join(walletDir, "oracle1.json")) - require.NoError(t, err) - w.AddAccount(acc1) - require.NoError(t, w.savePretty()) - w.Close() + createWallet(t, path.Join(walletDir, "oracle1.json"), acc1) acc2 := getAccount(t, acc2WIF, "two") - w, err = NewWallet(path.Join(walletDir, "oracle2.json")) + createWallet(t, path.Join(walletDir, "oracle2.json"), acc2) +} + +func createWallet(t *testing.T, path string, accs ...*Account) { + w, err := NewWallet(path) require.NoError(t, err) - w.AddAccount(acc2) + for _, acc := range accs { + w.AddAccount(acc) + } require.NoError(t, w.savePretty()) w.Close() } From 5017f2d2e6db3d07741919236b38bcb013a415a1 Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Tue, 11 May 2021 12:44:40 +0300 Subject: [PATCH 04/11] wallet: add test to regenerate examples wallet --- pkg/wallet/regenerate_test.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pkg/wallet/regenerate_test.go b/pkg/wallet/regenerate_test.go index c6846a64e..b5f1a319b 100644 --- a/pkg/wallet/regenerate_test.go +++ b/pkg/wallet/regenerate_test.go @@ -140,6 +140,20 @@ func TestRegenerateOracleWallets(t *testing.T) { createWallet(t, path.Join(walletDir, "oracle2.json"), acc2) } +func TestRegenerateExamplesWallet(t *testing.T) { + if !regenerate { + return + } + const ( + walletPath = "../../examples/my_wallet.json" + acc1WIF = "L46dn46AMZY7NQGZHemAdgcMabKon85eme45hgQkAUQBiRacY8MB" + ) + + acc1 := getAccount(t, acc1WIF, "qwerty") + acc1.Label = "my_account" + createWallet(t, walletPath, acc1) +} + func createWallet(t *testing.T, path string, accs ...*Account) { w, err := NewWallet(path) require.NoError(t, err) From 5071173dfda8e87f87f677815217750760917806 Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Tue, 11 May 2021 15:15:39 +0300 Subject: [PATCH 05/11] wallet: add test to regenerate CLI testwallet --- pkg/wallet/regenerate_test.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pkg/wallet/regenerate_test.go b/pkg/wallet/regenerate_test.go index b5f1a319b..b44003d41 100644 --- a/pkg/wallet/regenerate_test.go +++ b/pkg/wallet/regenerate_test.go @@ -154,6 +154,20 @@ func TestRegenerateExamplesWallet(t *testing.T) { createWallet(t, walletPath, acc1) } +func TestRegenerateCLITestwallet(t *testing.T) { + if !regenerate { + return + } + const ( + walletPath = "../../cli/testdata/testwallet.json" + accWIF = "L23LrQNWELytYLvb5c6dXBDdF2DNPL9RRNWPqppv3roxacSnn8CN" + ) + + acc := getAccount(t, accWIF, "testpass") + acc.Label = "kek" + createWallet(t, walletPath, acc) +} + func createWallet(t *testing.T, path string, accs ...*Account) { w, err := NewWallet(path) require.NoError(t, err) From ab53d5dfa5a08077bbb918c68179f401e0b47e93 Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Tue, 11 May 2021 15:39:25 +0300 Subject: [PATCH 06/11] scripts: increase sysfee for tx execution in gendump script --- scripts/gendump/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/gendump/main.go b/scripts/gendump/main.go index 60a8024bc..879059726 100644 --- a/scripts/gendump/main.go +++ b/scripts/gendump/main.go @@ -99,7 +99,7 @@ func main() { emit.AppCall(w.BinWriter, contractHash, "put", callflag.All, key, value) handleError("can't create transaction", w.Err) - tx := transaction.New(w.Bytes(), 4_000_000) + tx := transaction.New(w.Bytes(), 4_040_000) tx.ValidUntilBlock = i + 1 tx.NetworkFee = 4_000_000 tx.Nonce = nonce From af16c3e009c535d89a70a51a37da272c4c7334ad Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Tue, 11 May 2021 16:28:33 +0300 Subject: [PATCH 07/11] wallet: add test to regenerate testwallet_NEO3.json --- pkg/wallet/regenerate_test.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/pkg/wallet/regenerate_test.go b/pkg/wallet/regenerate_test.go index b44003d41..4332aaffa 100644 --- a/pkg/wallet/regenerate_test.go +++ b/pkg/wallet/regenerate_test.go @@ -168,6 +168,19 @@ func TestRegenerateCLITestwallet(t *testing.T) { createWallet(t, walletPath, acc) } +func TestRegenerateCLITestwallet_NEO3(t *testing.T) { + if !regenerate { + return + } + const walletPath = "../../cli/testdata/wallets/testwallet_NEO3.json" + + pubs := getKeys(t) + acc1 := getAccount(t, privnetWIFs[0], passwords[0]) + acc2 := getAccount(t, privnetWIFs[0], passwords[0]) + require.NoError(t, acc2.ConvertMultisig(3, pubs)) + createWallet(t, walletPath, acc1, acc2) +} + func createWallet(t *testing.T, path string, accs ...*Account) { w, err := NewWallet(path) require.NoError(t, err) From 366e79b9b88494211350c829c5bc35e60cbaa0de Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Tue, 11 May 2021 16:32:09 +0300 Subject: [PATCH 08/11] core: rename Neo.Crypto.CheckSig interop --- .docker/wallets/wallet1.json | 8 +- .docker/wallets/wallet1_solo.json | 10 +- .docker/wallets/wallet2.json | 8 +- .docker/wallets/wallet3.json | 8 +- .docker/wallets/wallet4.json | 8 +- cli/nep11_test.go | 2 +- cli/nep17_test.go | 4 +- cli/testdata/chain50x2.acc | Bin 45322 -> 45336 bytes cli/testdata/testwallet.json | 41 ++++---- cli/testdata/wallet1_solo.json | 66 ++++++------ cli/testdata/wallets/testwallet_NEO3.json | 8 +- cli/wallet_test.go | 8 +- examples/my_wallet.json | 40 ++++---- examples/nft-nd/nft.go | 2 +- examples/runtime/runtime.go | 2 +- examples/timer/timer.go | 2 +- examples/token-sale/token_sale.go | 2 +- examples/token/token.go | 2 +- internal/keytestcases/testcases.go | 12 +-- pkg/compiler/syscall_test.go | 2 +- pkg/compiler/verify_test.go | 2 +- pkg/consensus/testdata/wallet1.json | 8 +- pkg/consensus/testdata/wallet2.json | 8 +- pkg/consensus/testdata/wallet3.json | 8 +- pkg/consensus/testdata/wallet4.json | 8 +- pkg/core/helper_test.go | 2 +- pkg/core/interop/crypto/interop.go | 2 +- pkg/core/interop/interopnames/names.go | 4 +- pkg/core/interops.go | 2 +- pkg/crypto/keys/publickey.go | 2 +- pkg/crypto/keys/publickey_test.go | 2 +- pkg/interop/crypto/crypto.go | 4 +- pkg/rpc/client/rpc_test.go | 6 +- pkg/rpc/server/server_test.go | 18 ++-- pkg/rpc/server/testdata/testblocks.acc | Bin 14439 -> 14481 bytes .../server/testdata/verification_contract.go | 4 +- pkg/services/notary/testdata/notary1.json | 97 +++++++++--------- pkg/services/notary/testdata/notary2.json | 44 ++++---- pkg/services/oracle/testdata/oracle1.json | 38 +++---- pkg/services/oracle/testdata/oracle2.json | 44 ++++---- pkg/vm/contract_checks.go | 2 +- pkg/wallet/testdata/wallet1.json | 8 +- pkg/wallet/testdata/wallet2.json | 14 +-- pkg/wallet/wallet_test.go | 10 +- 44 files changed, 283 insertions(+), 289 deletions(-) diff --git a/.docker/wallets/wallet1.json b/.docker/wallets/wallet1.json index 1ade05d76..3955b2758 100644 --- a/.docker/wallets/wallet1.json +++ b/.docker/wallets/wallet1.json @@ -2,11 +2,11 @@ "version": "3.0", "accounts": [ { - "address": "NTh9TnZTstvAePEYWDGLLxidBikJE24uTo", - "key": "6PYL8Gnjsz4RBKX18jx5ZAQTDH7PKkZwEVjPKEkjNzCDNFE6TKZwaFLibL", + "address": "Nhfg3TbpwogLvDGVvAvqyThbsHgoSUKwtn", + "key": "6PYM8VdX2BSm7BSXKzV4Fz6S3R9cDLLWNrD9nMjxW352jEv3fsC8N3wNLY", "label": "", "contract": { - "script": "DCECs2Ir9AF73+MXxYrtX0x1PyBrfbiWBG+n13S7xL9/jcJBdHR2qg==", + "script": "DCECs2Ir9AF73+MXxYrtX0x1PyBrfbiWBG+n13S7xL9/jcJBVuezJw==", "parameters": [ { "name": "parameter0", @@ -20,7 +20,7 @@ }, { "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", - "key": "6PYL8Gnjsz4RBKX18jx5ZAQTDH7PKkZwEVjPKEkjNzCDNFE6TKZwaFLibL", + "key": "6PYM8VdX2BSm7BSXKzV4Fz6S3R9cDLLWNrD9nMjxW352jEv3fsC8N3wNLY", "label": "", "contract": { "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", diff --git a/.docker/wallets/wallet1_solo.json b/.docker/wallets/wallet1_solo.json index 2fcf9fd44..a5cd74d6d 100644 --- a/.docker/wallets/wallet1_solo.json +++ b/.docker/wallets/wallet1_solo.json @@ -2,11 +2,11 @@ "version": "3.0", "accounts": [ { - "address": "NTh9TnZTstvAePEYWDGLLxidBikJE24uTo", - "key": "6PYL8Gnjsz4RBKX18jx5ZAQTDH7PKkZwEVjPKEkjNzCDNFE6TKZwaFLibL", + "address": "Nhfg3TbpwogLvDGVvAvqyThbsHgoSUKwtn", + "key": "6PYM8VdX2BSm7BSXKzV4Fz6S3R9cDLLWNrD9nMjxW352jEv3fsC8N3wNLY", "label": "", "contract": { - "script": "DCECs2Ir9AF73+MXxYrtX0x1PyBrfbiWBG+n13S7xL9/jcJBdHR2qg==", + "script": "DCECs2Ir9AF73+MXxYrtX0x1PyBrfbiWBG+n13S7xL9/jcJBVuezJw==", "parameters": [ { "name": "parameter0", @@ -20,7 +20,7 @@ }, { "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", - "key": "6PYL8Gnjsz4RBKX18jx5ZAQTDH7PKkZwEVjPKEkjNzCDNFE6TKZwaFLibL", + "key": "6PYM8VdX2BSm7BSXKzV4Fz6S3R9cDLLWNrD9nMjxW352jEv3fsC8N3wNLY", "label": "", "contract": { "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", @@ -45,7 +45,7 @@ }, { "address": "NNudMSGzEoktFzdYGYoNb3bzHzbmM1genF", - "key": "6PYL8Gnjsz4RBKX18jx5ZAQTDH7PKkZwEVjPKEkjNzCDNFE6TKZwaFLibL", + "key": "6PYM8VdX2BSm7BSXKzV4Fz6S3R9cDLLWNrD9nMjxW352jEv3fsC8N3wNLY", "label": "", "contract": { "script": "EQwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CEUF7zmyl", diff --git a/.docker/wallets/wallet2.json b/.docker/wallets/wallet2.json index d09780587..74335cc18 100644 --- a/.docker/wallets/wallet2.json +++ b/.docker/wallets/wallet2.json @@ -2,11 +2,11 @@ "version": "3.0", "accounts": [ { - "address": "NUREbqw2kfbPgDeEz8Dac2QxntGGqqFMm7", - "key": "6PYXADog3RQCwKRhqQsobwZEFopdcCJuMfPosM9pXPaDWSguKvznLdpADk", + "address": "NMUedC8TSV2rE17wGguSvPk9XcmHSaT275", + "key": "6PYSYoZaxqDu5vqvm7yUFT3sPJJFwyLyYDnp8zwj1YVPcBWxacz64bNX59", "label": "", "contract": { - "script": "DCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG5BdHR2qg==", + "script": "DCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG5BVuezJw==", "parameters": [ { "name": "parameter0", @@ -20,7 +20,7 @@ }, { "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", - "key": "6PYXADog3RQCwKRhqQsobwZEFopdcCJuMfPosM9pXPaDWSguKvznLdpADk", + "key": "6PYSYoZaxqDu5vqvm7yUFT3sPJJFwyLyYDnp8zwj1YVPcBWxacz64bNX59", "label": "", "contract": { "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", diff --git a/.docker/wallets/wallet3.json b/.docker/wallets/wallet3.json index 2b7691e7f..6ae440747 100644 --- a/.docker/wallets/wallet3.json +++ b/.docker/wallets/wallet3.json @@ -2,11 +2,11 @@ "version": "3.0", "accounts": [ { - "address": "NQP81vKVRmwZHveX8C9Rbf2qejSpT1W1Eu", - "key": "6PYScv3Vgvdi9EkhDNvHXdvQeuaXK9gRwXDmytCswZMNpTzMLvfgR3U5dK", + "address": "NdypBhqkz2CMMnwxBgvoC9X2XjKF5axgKo", + "key": "6PYVxMnzPMFTYY16xRvXm2SJcvaChabLzaARAb1Mmej9U7rYLYWMSPtfam", "label": "", "contract": { - "script": "DCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5plBdHR2qg==", + "script": "DCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5plBVuezJw==", "parameters": [ { "name": "parameter0", @@ -20,7 +20,7 @@ }, { "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", - "key": "6PYScv3Vgvdi9EkhDNvHXdvQeuaXK9gRwXDmytCswZMNpTzMLvfgR3U5dK", + "key": "6PYVxMnzPMFTYY16xRvXm2SJcvaChabLzaARAb1Mmej9U7rYLYWMSPtfam", "label": "", "contract": { "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", diff --git a/.docker/wallets/wallet4.json b/.docker/wallets/wallet4.json index 92909322b..4381d1cc1 100644 --- a/.docker/wallets/wallet4.json +++ b/.docker/wallets/wallet4.json @@ -2,11 +2,11 @@ "version": "3.0", "accounts": [ { - "address": "NLA34vf8eXGGUhRjVaYe5f8YsyYHTehbDZ", - "key": "6PYVwp1Sdg9DfTzvg42PZxgzMDf5a5FYBgT6ynKKzwmSHuhGkipoNjyW3a", + "address": "NPrB7BmTMYxf9UVroJp4RQExM9tqKmsHTz", + "key": "6PYX8eELiDduPW3RGiZxZNmG6KtWtXkyRFi47f8w6quEBpRkpBPxH5u5AP", "label": "", "contract": { - "script": "DCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWJBdHR2qg==", + "script": "DCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWJBVuezJw==", "parameters": [ { "name": "parameter0", @@ -20,7 +20,7 @@ }, { "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", - "key": "6PYVwp1Sdg9DfTzvg42PZxgzMDf5a5FYBgT6ynKKzwmSHuhGkipoNjyW3a", + "key": "6PYX8eELiDduPW3RGiZxZNmG6KtWtXkyRFi47f8w6quEBpRkpBPxH5u5AP", "label": "", "contract": { "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", diff --git a/cli/nep11_test.go b/cli/nep11_test.go index e40d5bc05..3565b14b7 100644 --- a/cli/nep11_test.go +++ b/cli/nep11_test.go @@ -22,7 +22,7 @@ import ( const ( // nftOwnerAddr is the owner of NFT-ND HASHY token (../examples/nft-nd/nft.go) - nftOwnerAddr = "NX1yL5wDx3inK2qUVLRVaqCLUxYnAbv85S" + nftOwnerAddr = "NbrUYaZgyhSkNoRo9ugRyEMdUZxrhkNaWB" nftOwnerWallet = "../examples/my_wallet.json" nftOwnerPass = "qwerty" ) diff --git a/cli/nep17_test.go b/cli/nep17_test.go index 4a2a3f058..87451169c 100644 --- a/cli/nep17_test.go +++ b/cli/nep17_test.go @@ -52,7 +52,7 @@ func TestNEP17Balance(t *testing.T) { }) t.Run("all accounts", func(t *testing.T) { e.Run(t, cmdbase...) - addr1, err := address.StringToUint160("NTh9TnZTstvAePEYWDGLLxidBikJE24uTo") + addr1, err := address.StringToUint160("Nhfg3TbpwogLvDGVvAvqyThbsHgoSUKwtn") require.NoError(t, err) e.checkNextLine(t, "^Account "+address.Uint160ToString(addr1)) e.checkNextLine(t, "^\\s*GAS:\\s+GasToken \\("+e.Chain.UtilityTokenHash().StringLE()+"\\)") @@ -134,7 +134,7 @@ func TestNEP17Transfer(t *testing.T) { require.Equal(t, big.NewInt(1), b) hVerify := deployVerifyContract(t, e) - const validatorDefault = "NTh9TnZTstvAePEYWDGLLxidBikJE24uTo" + const validatorDefault = "Nhfg3TbpwogLvDGVvAvqyThbsHgoSUKwtn" t.Run("default address", func(t *testing.T) { e.In.WriteString("one\r") diff --git a/cli/testdata/chain50x2.acc b/cli/testdata/chain50x2.acc index 8278f8411905156abb77a9cefbf639a3c991721e..ab3d375fe834d73381ba8ea02e738a088ede4863 100644 GIT binary patch literal 45336 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%0DTi^d9>aAal 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Ð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𝔇AAT-g%1p-7*Bkai* zEIOXYK&xx+#B(#Orr-h($K9AjGuKST?ORbYbLoAwQ20dllW?D*N@IlCTfUkc&p5h% zA$QkeX?*$?cP)leEFAl;MF>+bYZc7){d9E4CpSw(LEy#Gn$iO!2lcdI*av2W$4El8 z2(t{?TFt4p9<48528&~N>{_6C_gzET+1DhD+nNx-e=H%X5BCl8({p~(M5vyx5pA|P zJ7gwI5Gu-aD(ODH-$XkS+i(s(JQS^9CSzo!U{odxKfI@rAzKql5aJk42mwG-95EP9 zw0NQ_KcnU86{KUd76@eEeRAZJc_2Jl&vCC1)Zxp!q^8}TdSoMzNY>~6++wxH)tXs2wYe6X zy}bRLsexP0i-7ziPJ!ek9+C05$o~=MC4a_I@&)q%Ebo)KeP;!W7B1os6*wD8Y1NP9 zb<$W7r@r$E=-k|2w%uqV^zta5zw#pJo`O>KV^Fx3*F4r9N;5~Rd-q2>c(>XK+tjWv zHlu775KaH^YEtelp`Xuu22Z_#P%2WoAcdqn{`FFf#=5T|xH}dQUrELmR{E z-)XuGRoV@=2zpe%qX4H|O>05@oIl)r_DF3t`bKgVY~sE{nSG?qmY>6Y=p7v4XPaAf zrZWP4f&S+-Q|FgARI&rs=~?TZ0ei zfGd7`tg$;!h2%X6?a5MWwPlwrtUVL*x5fDKC{RwI)l1T5+Su{0DtvZ0CP~4(gLccU&bQ z7kZoE-tgKzEgywv&|3;OTV_ Date: Tue, 11 May 2021 17:13:33 +0300 Subject: [PATCH 09/11] core: rename Neo.Crypto.CheckMultisig interop --- .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 45336 -> 45336 bytes cli/testdata/wallet1_solo.json | 120 +++++++++++----------- cli/testdata/wallets/testwallet_NEO3.json | 4 +- cli/wallet_test.go | 8 +- pkg/compiler/syscall_test.go | 2 +- 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/interop/crypto/interop.go | 2 +- pkg/core/interop/interopnames/names.go | 4 +- pkg/core/interops.go | 2 +- pkg/core/util_test.go | 6 +- pkg/interop/crypto/crypto.go | 4 +- pkg/rpc/server/server_test.go | 4 +- pkg/rpc/server/testdata/testblocks.acc | Bin 14481 -> 14481 bytes pkg/smartcontract/contract.go | 2 +- pkg/smartcontract/contract_test.go | 2 +- pkg/vm/contract_checks.go | 2 +- pkg/wallet/account_test.go | 4 +- pkg/wallet/testdata/wallet1.json | 4 +- pkg/wallet/testdata/wallet2.json | 4 +- 29 files changed, 112 insertions(+), 112 deletions(-) diff --git a/.docker/wallets/wallet1.json b/.docker/wallets/wallet1.json index 3955b2758..d8d226625 100644 --- a/.docker/wallets/wallet1.json +++ b/.docker/wallets/wallet1.json @@ -19,11 +19,11 @@ "isdefault": false }, { - "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", + "address": "NVTiAjNgagDkTr5HTzDmQP9kPwPHN5BgVq", "key": "6PYM8VdX2BSm7BSXKzV4Fz6S3R9cDLLWNrD9nMjxW352jEv3fsC8N3wNLY", "label": "", "contract": { - "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", + "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEGe0Nw6", "parameters": [ { "name": "parameter0", diff --git a/.docker/wallets/wallet1_solo.json b/.docker/wallets/wallet1_solo.json index a5cd74d6d..181bfaf0e 100644 --- a/.docker/wallets/wallet1_solo.json +++ b/.docker/wallets/wallet1_solo.json @@ -19,11 +19,11 @@ "isdefault": false }, { - "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", + "address": "NVTiAjNgagDkTr5HTzDmQP9kPwPHN5BgVq", "key": "6PYM8VdX2BSm7BSXKzV4Fz6S3R9cDLLWNrD9nMjxW352jEv3fsC8N3wNLY", "label": "", "contract": { - "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", + "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEGe0Nw6", "parameters": [ { "name": "parameter0", @@ -44,11 +44,11 @@ "isdefault": false }, { - "address": "NNudMSGzEoktFzdYGYoNb3bzHzbmM1genF", + "address": "NfgHwwTi3wHAS8aFAN243C5vGbkYDpqLHP", "key": "6PYM8VdX2BSm7BSXKzV4Fz6S3R9cDLLWNrD9nMjxW352jEv3fsC8N3wNLY", "label": "", "contract": { - "script": "EQwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CEUF7zmyl", + "script": "EQwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CEUGe0Nw6", "parameters": [ { "name": "parameter0", diff --git a/.docker/wallets/wallet2.json b/.docker/wallets/wallet2.json index 74335cc18..cd5514848 100644 --- a/.docker/wallets/wallet2.json +++ b/.docker/wallets/wallet2.json @@ -19,11 +19,11 @@ "isdefault": false }, { - "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", + "address": "NVTiAjNgagDkTr5HTzDmQP9kPwPHN5BgVq", "key": "6PYSYoZaxqDu5vqvm7yUFT3sPJJFwyLyYDnp8zwj1YVPcBWxacz64bNX59", "label": "", "contract": { - "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", + "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEGe0Nw6", "parameters": [ { "name": "parameter0", diff --git a/.docker/wallets/wallet3.json b/.docker/wallets/wallet3.json index 6ae440747..855805c25 100644 --- a/.docker/wallets/wallet3.json +++ b/.docker/wallets/wallet3.json @@ -19,11 +19,11 @@ "isdefault": false }, { - "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", + "address": "NVTiAjNgagDkTr5HTzDmQP9kPwPHN5BgVq", "key": "6PYVxMnzPMFTYY16xRvXm2SJcvaChabLzaARAb1Mmej9U7rYLYWMSPtfam", "label": "", "contract": { - "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", + "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEGe0Nw6", "parameters": [ { "name": "parameter0", diff --git a/.docker/wallets/wallet4.json b/.docker/wallets/wallet4.json index 4381d1cc1..050c1ec69 100644 --- a/.docker/wallets/wallet4.json +++ b/.docker/wallets/wallet4.json @@ -19,11 +19,11 @@ "isdefault": false }, { - "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", + "address": "NVTiAjNgagDkTr5HTzDmQP9kPwPHN5BgVq", "key": "6PYX8eELiDduPW3RGiZxZNmG6KtWtXkyRFi47f8w6quEBpRkpBPxH5u5AP", "label": "", "contract": { - "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", + "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEGe0Nw6", "parameters": [ { "name": "parameter0", diff --git a/cli/executor_test.go b/cli/executor_test.go index 64b488145..e178e11c2 100644 --- a/cli/executor_test.go +++ b/cli/executor_test.go @@ -31,8 +31,8 @@ import ( const ( validatorWIF = "KxyjQ8eUa4FHt3Gvioyt1Wz29cTUrE4eTqX3yFSk1YFCsPL8uNsY" - validatorAddr = "NNudMSGzEoktFzdYGYoNb3bzHzbmM1genF" - multisigAddr = "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6" + validatorAddr = "NfgHwwTi3wHAS8aFAN243C5vGbkYDpqLHP" + multisigAddr = "NVTiAjNgagDkTr5HTzDmQP9kPwPHN5BgVq" validatorWallet = "testdata/wallet1_solo.json" ) diff --git a/cli/nep17_test.go b/cli/nep17_test.go index 87451169c..cc85497ee 100644 --- a/cli/nep17_test.go +++ b/cli/nep17_test.go @@ -61,12 +61,12 @@ func TestNEP17Balance(t *testing.T) { e.checkNextLine(t, "^\\s*Updated:") e.checkNextLine(t, "^\\s*$") - addr2, err := address.StringToUint160("NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6") + addr2, err := address.StringToUint160("NVTiAjNgagDkTr5HTzDmQP9kPwPHN5BgVq") require.NoError(t, err) e.checkNextLine(t, "^Account "+address.Uint160ToString(addr2)) e.checkNextLine(t, "^\\s*$") - addr3, err := address.StringToUint160("NNudMSGzEoktFzdYGYoNb3bzHzbmM1genF") + addr3, err := address.StringToUint160("NfgHwwTi3wHAS8aFAN243C5vGbkYDpqLHP") require.NoError(t, err) e.checkNextLine(t, "^Account "+address.Uint160ToString(addr3)) // The order of assets is undefined. @@ -86,7 +86,7 @@ func TestNEP17Balance(t *testing.T) { } e.checkNextLine(t, "^\\s*$") - addr4, err := address.StringToUint160("NaZjSxmRZ4ErG2QEXCQMjjJfvAxMPiutmi") // deployed verify.go contract + addr4, err := address.StringToUint160("NQKpygA5oG8KRivZeYjXVU2T1ZPmUmaqQF") // 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 ab3d375fe834d73381ba8ea02e738a088ede4863..4c4e26232288aa1ba477582f950a491beae60d83 100644 GIT binary patch literal 45336 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 GVgCbW^0AKq literal 45336 zcmd4)byO5@{Qr$F4a?HqjdZufQqnEm-Q6J4-6bI)ASn$}(nyLlNJvN{B_$vdH@rXk zx$pb?lk;28@ArqCqkDGGFtd+&Js;Q1T-P-NCjbDjx%>D3kDrJgf^X_jzt*&L;N2B@ z0!XiZXT#ErERdvC)PD;FfWiR0fcu{%K#1xU!CxbEmc|%8Q@6UoWcxFb@ck|yF0~x( zLyl?81r`4^}gHMe;fSc*7`u; z>K8F%^RDHJFR{&Pih5@Vy@?xZsWl5*=-K8t#fuUEpAy(#9Ywr0O5Ff4UnNBAuCj6vRTH2e(;W*G~Q4+_x=e$a?7X=7MR297QD(9n z#-X2Dzf2w?2^-k|e(Jp}s*_489`3-gT5uFmaI)yrO4+C2TILJC9hXwi*}OLL0LGD9M(S}L3i{mED$3TSizf4?zY z_0Y8Q7buT(}%G*0FfTt)-{KKeii00W$|eST@~E z81YPGK`&D&ACzdYGNSS|icyLWM%p6X%)l1)9kDBf{;!6ev&H|tg1p85d%gb@>W`%W z=psV{R=&f5uss>JcWT7PbozHJah}@i`obbc2!gQx^h?;CWFSO07h?xk3v(9`_IJ}A za4VgV0xDcj+-tbH<6KwpH&GKmT~&UlyF$ZD_L`xySnL)C?<9y%$mZZAJ=em#_(Gi& z%ij`uKy2&sTv#hp2HZfn0;-od3IEuBmCkqN;1-?ocJjSSw$w2Q{7&41RJABNQ5u80 zLREancyq+)Dh1u^Q9W-5=V2j$9jva8W#Q1Su04revNwM2a=wVb(}>y5$!O%e|Av`_aMvFBba$Rp;`E|F3m6M1}zXVr8xg5di-`)OyroHF^x5NmeRu zP2Cs@i{NCmVB-I-bv1bMb2({5d#lfWVwk4`RXY~`qKsR7EF16Ok>?Lrp%X0}JjuW; zx0P34-QFqg@*FW|&^_U5wI6mxnc_OLZvuhY>GCesORDhoj4z%ApqoYN)nW)CmXhO5 z#AHF;m}K>qE9wnN@*eDus@sP5_!lFl&#^Ht1>Yo6Fxs5@WE7Tzz#~EDU=B@O|1df! zCO$V;XUBmd7XXiYFvCV}wx(1=N3EPZfq?!6^v51Ej?H~Ur>&|K3)Ty`T+GR1H32R5 z`hT(35wQPN8^Ami5!WtnPHesr$?K0$SHRcSaMBuekQhc{AaEQ&ZB7SEhSya86QxPP z2V6+B62>lq5L26%EHI%9B!0p>U^M=#W&W>`_>yWxsIgslb%t2qB}F+QiT> zu2W+v95R)`5JPqvb?gj)tGrHJR zxcLd7)(}sqyXGxo%|eN8iMa0JwPD6eZv9ZG(&{lW@Sb`nm^=T8*^8*B9BcOJ*J#1} zUT9^z6>XZ#An+jDyH*2!p3LjTA#w&0_$tqrt=N{(&Ks)3^@Iwb@>p9V&=Nuxd%%Zz zmMBiRz%xPBCXUoIJ{%sHqCwANi{XEBG{lA+2*E0X9=>-6; zX`xY4p?oPFjP1=S1t=xl?VZFO9q!s)Q#VQ`N@EjiN&#O=dviA{M>AJS0p0&y(9qh! z+RfV7&f3TPZaGH_3s-YDN&z+|N+)BNyH&ZFyWB6X&qV2B?&j{|;O6agzj_TvYqPt> zU5zd7-dPyixtjYi{qHKB-0wH}dsXcJ=equPIa_n@yXAhZQOw)TT-3$I*qieIu_g~= zJNNsq_5ZmH1YhWG5pxf72e<#ezaJB&g}Lz^f%)BA-@A8~E{^U_ztEh_UF@x0U9BA* z?mzIQH2uBf1SlEqw*J3+?e3l5-CAAUotzw9+|12f-HaW~j9vcQp?9CVxwyOj&(`j? z>~**6DFqzd?d<$O7K)NjI33I#nJpce*;x45SlF1|%w667N7KLhA72AX^yQi52!#VDS{tD0e+r;@dESiNDFUf?quia4Z^;DeJTEAM~#6dz9((5;>BH{vEDG_pcV8=^ zm*Rq}U$Wom*x>!dLB<5L^eF!5%Fjvp7uzD}|4z=qg+l*ROQipKy)OmSpV}fQz+(__ zw&UbwpHwpsy(tI?6CbXy{3(?#K0Up)@6O`U_a@t!*$w-*^TnAZ+w}&OHiH)jM_N|JWQ1w3RkDH_iu`yy zh7zKItM<~l0kjj2Pa%#c;J!iqJFpj|k*qX(TP+{AK)`oDq zBi{0tYWVIDgZ=hyf{LRqYs<LQ_c*C-1S}pZw+Bf2R}=c_++9bEas1PTv>18WqlosmBA( zdA1e!mJL+fA++Go*)sQ}TBe(Pg#59I{!_VPv7j4C>0XMaZ&J2{v0ujVJV!y`_+dhG zvU$P)CYk0cvW>a5!q*ebpT1_tEq#phM?EP?aIJC<74Sz*O!4UQlE_C2SqJ=NtTAl5 z6?kJPJu6RkcOqxIApapAr=B2;`#bOW-qB- zXk409ojExl{J*%fQP!9l7FD**RN8$0H@&-e?Ej4CeJLLHu1}(>p^qE?cF!CH^c^B% zwCM|T3Gjz7o`{NZ_#a^+Ms@12G*jK*@-|ki&OB1~YJH*tcdgi&GM6#=n5va0N!!O) zuH{43!q&+%<{I`8{WG*jDodDwt56Wf6L1glcVJd%1BF_ZQP0EZK|rRojil5N+ew%A z5Q6zTz=^?HyQAd2Th1|C%idJXp*idD1?lRFq|y=xY>Op13yelPFACt3u*&#OC#|== z2)*qPW*m^J#c5vZ=sbWJ?6-F``*Vtc86j6rYHSTpA}LC9n95be4>X&!_b+SC<9d6PU)a^%@s*ip+ zlF2z{T*Ied3rw*rGk<)l!~SFzPePJfSYgwJ;%bo;_W}A8A;w@PsO8H*xGT<=b;5P| z>`f3D{TZmv)n(kaFWmf1mWyX-`LSkmlGfnLSJ_!6$4|vc8jMjpubcf4{5#Zvq>`~G z>LQM8gOZ!FRAYhHeEnK}&8 zmM%GF~MZMT!5V~FDkfd6YSzB(<+>w@<74L%Ui?8 z_GYSD`cuBJ+}9YEc0Z-dQBbFb2*hB&y{l!Ie1q3zw@#!XF(WbfUefm?o?)d*Q6uQ> z3h=A8#RifN_B!cJ`#KqMKHuxRjzSAD7quvUdOR-8a`DNNmnGA`yu05|fQP&bCdY~E zyOP)$4{&fZOxAeEVdgMy|ITuU+P>jMPSzI|ErF1&aUrpS{dzxGfYNgIllSZ7c5W@v z=#3Uy#Wf%2LExQ%(LiBD&o}O60J=T?IlLl%lhtc?<@8gRA$?2&L@;kDmY-&VDhq9L z=ej$b^Yv6Q$kAX?UEopHmy_j;)Brf`SmNH*+6oT+B)2Em|h>wG8}2W%yJ48+Sfs@X&jW%Vh(m$1Wl+A_SsX zm`4JJWH_;f-bB{DL&HVk>amKlW&=PU5>Zf1c-3Q=7?;=*A zN4ZMN+dm&;aQH!m;(e1omSatN5FLZ%VOnyp&v!93BHSlkGhxCVd-k0KG@7NMj zJJB%VfO`cX;1#bVEO&0pwn_?w@l>PhuWE*64&RpBsKYt7@iFl@;E?8XNqvNbdrkgL z$GT9jiFPg@i1CqIQd)r}=pDCULb`;-0+>-&WI>Uz2^Hda0)T%F=C5P5PeaY=${9(zsKHKo)t*chnAo_rB6c=zQRb;&Rv-ceGxI6?1vcaw|4@qc4yDX;b-5hCMU2U%omgL6^5{Q z3c-Wl3**k=?aC)lw(F+*4N(sI!?w3ON4=A2nNpi`+%7`pmi;m5G`2SL%e(vb=|S%@ zr$bV^7Yr+Ff?l0d1|s?7Otd{&aY2t;582%O!6mHMYhW`~?L_%#;Sytf_J#FHnYnmk zsb5^=4!!hkWzu;J2&{pRdfqp<8T^%bA6rDYD;AN6yXGTXiAgO72+bt~D1g#ql=m!0 zyo0~`TjzKOON_8=}c`+X4jc|46miyJqB@BxDmX@EwfMM~JKuEC{G zEtLqBp^*yBH@y2rqI1E{6$1XbGaP{Q>*p=x{^9$G1&_LkPX>Su|E71ye~9OODIWH2 z+nFGL-@x~}qZkCdxK*2MEbaYlBMxCak&2)0n|~b^AU#@dA0C{~hCZ&+dm$}-=`_!{ z%=p4~0-3>y%SCJ{9-Ta21j*{-*c~bEkz73iz91B8-We z10exoIH4b*6Q5vZ4Js89qh9MqKl9k;67x`d1Tole?_kGtHPKHEA8$6j{V6#WRv&L> zFxq^;6~j9VN=|sEm%8I)#WXPrk6FU_jg_WORu@_Y^m_NlM0vr6a^$7Birwrl@9rDk z2fdSVwF-!CKV(<=y1h(9CZ6zRDq@+Du=*{~YYo+~SEyFn9es6uuf*-^Pqo454=>|C zYS<;KIJmDxIqT^11c8J=;L7rNo^KSa4vDNSnhfF+6dnY@CQR0O*a^Zy84(#4&MTf- zIrzNvhHsNe5r(kj2wG_fQ1|=EfoK@C5&Co6N+57o=0Yk!1OY9la(Od^M!XieAOzct%sJQ0Cr7C@4RJe@x8oD&N8(u)0Cic6_&FlMf2iNE z4le&z(R2)xdb=?YiIeBa7ANtRrX`+_Ro6a?Hi!UXu;1Q+4djiuXz73InSE&1C>tB8 zE#*#!Ez9Jy%-zaER^6)tDzS(4$ZCGW5MZ&@jnxV+rg?9WG+-Pj2|u`(e6-54={#e1gOjWspz%I!- zX{`mm%ClUuHsk9I81)yW;vjIARG9bD_yR04Vn>-?3K7q>c(}5$%eXeP=<_Y>R2Xr= zge7Lwc_n)4Pay&p6#6~>+Hb1UAIG8kj#3R51fqdJU=jjYeIZ+DG!_&;hOxD44U$SS zFK^xVL6Iz(uNVW}d=_J!H)_OGNOzm$`BwPOzoCa1DUFR+z9rK%0Oto=qg`G`$NB$wI~JL5B1(wdn`XC%9-l z-hZvUIZ-p3;v`V!X++qkZiCld{D>`$ zMadb1Sd$I}EJ0CqMI(Lv2@Hl1Y+^zJnQ?1^(V=zMOpNYl*dP{NW}9k0vu3BL+&g?{oP$oiCQ0*+P*EdUmAz_SyqAGEIKC`0Vcsz8(^`#k26vV~KdUnQkdoez7-`7O{ak18^k ztK6+N6?RJ?2dm~y(+U12-G*&22#h39q=qmxjjY9yQvU+I-K9YSHs_*fRr4imScNFY zu4Z)>C6N=iItKB`A@f1+_77iON*_K<;ggblo3fWz%o8B+qA?);R^X+ep^ep<23jKq z|2MnRWF!i78f90?pvVXWr>p+zO)cB61La}m1bXyLrZiV-ZYy9x+<5zeY=w=N|E6~s ze~9OODIWH2+MaE!3stf!q8u`& z;oclUE3n|_zLLu)tpcS>KQa}>42@}%<(!V3*2oKaa+{jpB5PedJ0_g@4skpIn12lh zPv?EvhKWT-r~(2STAFc4I5s!8;y?%ngmcHKk}&ZTbb?k0=;1$sw{fbf#VriLdm-6c zuH#t(PE+PwM22P0e+paOPTYRuwPW}NM~@*hm-EAAvu89n#9+U@Q`Y=^vafj)X7I{~ zuK<@P#y?MFmNT}35w~`rn=_WUs2eRgCeu_<488g%JIp8S$d}DT_V^@4eXTPLC`8V< zF`s{VcYi+qpm!Nj@it+IvRu~X7!p0Wmp!Juz=iF0&L9>p9xdmro+k#w;#?y^fYGcD zJcp|-r$8cNz5Sqr;V;-MBBno~a1ue_fam;3Z=b&7Q7X1MQ?D2j;k9Ut2Z1)(hwkS1wh>fjaN0HI=!RR|L#PI}R z|1}t86Y30>M9LJ_I0%TPT{)fgnZ@`Z3qmlwp|MLJdsow!9wQ(W0rpv**X|v7p}L+Q znA+V5mA)AfCcYw$Ml=rjiE7F$t!^zlO{R>myYcu^q0Pn6F0=p_VzA%dm7fi`)X(gD z+A2w7QJ;$>txlG!jlESxtEMe%Bo!3=^u)I3DukC@#y+8GMVJ&eySJMfmEqDMy(&+I z`pqPV&B8D5?k_YR^sWlqmG6X7fW|&houspe>?ajxsydTm?ghI2vWnmc#*io%872N! zIh&eppQ~|2%(+f(Pq8^mD#$VdPkm>G90vqu)wQrt(I#NEEwBk6KWF+3Lv#9>cv$5v zVB?}sIiO3*)CoqPHH_Vj(R}xG)9~4rBAQL;mcma&o-JZjO8mU8yP4I;RNuQb_a4W) zd2M-|`@!6-eJg`4S`PU}%D}lm=pb+ct_sv}lPbY!`W{c9WL!GK6~38DGb;}0l$PCp4EEc*5kyQX z39Nk=v2U*Jz9*h8Z9JTZU)VjeIKyy#c;(!Ph)_EYCT6^XXiMlFXOb@zw4lF}Cvh#% zZGXn34NY?DTm0qS{dMqz-Z`jCz1|ADW)=9*{HYiuSAf@_ce4#D^|kl>QfmOG%gmkF zl6vvUrWVl&|ZD0^FqzyRQSnMSg`-i8Fuhrg3Cy}Q1Xd4sij zR4RVBrH3Pf&1fySEjqn&z4yTd7un=XKtQfqkw_R)y?2zK6CV7J&hoMZSh^og(Ta2N z?N`i%y;Fq$rgwOMi06GN9`-IMUK|{ex9vH5cNrv3y}%yM{Q32X6@>9@mrR7)q$6E8 zFL8ZrNy~6x?S$sL#Ai5%m1Rhu*eD)x`xefY2L--fq&|Y526d=q3^wtFe?S&78xz<2 zs$Ln$hnE5Pe+|Yj8DH}uhYyKB0t6iKMO_K$OtUzZgb?gwfoY_2uoXDabT>$G$!ebi zYX8a5jHbVpKMPF!e13g5+pY^q;W}KqM<=5AYxazZ#D++%^U@z*oRsXZuLOku+PfTI zOF?K?{R_(davm>TG&$Vtogt%O-RfpnmbXJ-SQ?w?7z0vDcsu7orOr&Q?>S_r-mMdW z`~~@ABdZimQir8q-rZl|Kj@uUEH{_d-{JALW^M7=&?yBq*7&P)qsxY#`Arhn;vE7e`BkdPzxK}E zFLjNV)6fT9pJ?0S#647r^7I%p0QTC1z^#R#tyi<6LPCQ1b3zDRu}^Q)dce2DQ`=O5 zr?c?!w{)3YosO5wzr4Hee|pfnmlT5O=h6p#_=w^vD)X_Y;%bjI;qWHx`TQx#9bukJ zoFE_-=CRes#uEQy!*P_Rybb}#O4 zsr(r@|GrwnTm)%48WCfH+`51G4jzF`40_y2;(VZNO+h~ z=xpvjZW@Hy6x4*uf#d50Et6?UQhkaJI3EeqEkf1o>9Q447$L}^ zzdm*y)s2KWo&e&%24lS_y3PonBm!}RfFkS~-I6$sWp*bJg55~uE`BL>h{Vu%jE@5z z<3NXv);bE&oP^yLm9B>}Q!d$xm3zxEb@tPBjk)Q2Xwap$7<0XJouargA4HKSle@fTQYKoa>Cy6-|D`Pm zyrmWPxsIqPm&M`*E7!gr2}S)`c75ayUc-_M?7S`jVQdH1+l~x>hXVYfqQBs$)o|4h zP3BBC>Bx~6t!pFXI!u=8iyiH%7$C_OTSu=z%p4e1I zh}X(R*67cuG3hw%(v;Ey>&Qlk=7#x=cvBIPTWV~4g*b{`nwa9kU^TD$KkYE)V>WMg zxL}m^zU1_H)dX=o0i=HocDRKP-KsGXCe{i94mR|&%b`6#qV0qb>=~XD*%p_ItC3Y* z=DQ$7(kyw64>-?|ZjZ?DsGgQ#=Z2pczMeRiLv zLq0(A+dBhvKhuyBveGReO(HDQYu+#8hJo=RT)T)kJ=LIuYS!k)i)T9m9p2`E*G@p3 znyzVvRn(WU#Yw2?%`c}2PJ35=d3WFM`=ECv@f*t&?*`!QvQ0S6`p60LkDuaDYlkWZ zsf>x9-+n*Q%k9N<`KFG6&5())%d+!RYAIEJInGc=soce*Mn}>g1QuFYWsEAteL{3r zsPA$fu3gf=ncL?`tjAv@A>opWqhj|wJx6yv0EIlym6grV(!Iq!kKQCt9`8`W{KsP) z$JZe6vLkkvvNAk=y{FCo+9%hSj~>B2rLEJj*M>r;*x3QWG31&cmvg9YiofQ7b@Rv~ zcRv~C(>J(!%}eR0{X><{t0FU7;&&3Ua*l6VT|3cdvaZIz*p368th)G8s2 zXUi9SLk;J{+eG@uPl$t(w*^tik}E%cqS-y{TjZkbdWLxG!mNKPJF`8TKGwXWo4yUj zG2la>-ixr6cK%K;{3Ybxk^eQAQCy(R`f3N>?GgysOJDdVXM!cXa0WuK*+(Rn%-EXR zrH`mOZru1g1UZQ5V_cE-l;2$t=amaIMFOfr8-~=-30F)TiL2xZtZDKe(O6Nxan}nt zjs;=NLk#xYJFPQKN%i+3b7Y}TxwHwCqPCvXD<9pR+>=%lx}IyL>b|((4Eu6Y?i2?j z-%NM0gOZx_ssCi-@G5HVyL_}FBgN`3@9sOaAM`GYJSdyPm^+VEMi*Qg7V#<-T`p06 zBPDrL?#HJYo1Ge$gimyt;kB4?kEM9NyoEt&KAs5~lzZyvL_c)pYnS5;0#g$+<5Hyy zGRpW=Pu?cYlpH-rgMWMgnyZ_fpU*J}Cj0uSBB(t|&ei0QnXj>1eh?-*G_PO5^vq!* z^~u6uc>UcC-7tB#lVm8%C>w`r{N$5R-5mx4YSU4pea^8ytxL`xy$RgZEM@eZ(xMzh zvTLlPD}lXVrw62T0()$)y5%y!q<(i7uEV8x1t})TI7twK?SFrD z;`>8b-P(9ngJ+gK;Yl2OWgpDv_%wd5ajfyEqao9ag}plW^2`GNF2T09*fvKiD{sca zS&NW-mv!iK-ariY+q*`haB2olINmze@Hb`QbIWq|8eilvY?sS+x#1ab1kc;<_JZ~NqGy@arNEu7v^%}1) zIu6~V$x5L@!OT8am0i*>BWsq_U24vlkIxpV1Z=$-c_$jX0Y;p=* zUGF(8o91V`_BepR?Z7TSXWU258r_4vReEn^TYG;!sUIHf+k(Rm$6JUrWGj zW`p6KbcRcXb0YEVX9^h|Mf6vuV}dxI0P4R6b2PwI?53Z6N!bnpetQ~R4m`@NQEGz_ z3?X<>v@enej{ybueculh8q&+O79Lu*-5k_#PV{N|_qUnSecbaiy=6aX8Kk(SN5ejt zxEGps0(HvR-)O$_T!a|xw|B;{Q77humc1{NvM(0tTig?cc~RXAP2PPZX%*RGZ78cn zv!`SO2Z@Bxa@_j=oKDz7{h%L4k^Qrd67A5@B%Wjamv{FANe_BQk7w&jzk^>l#J}Yy zqtFsJQ>utVT`Dad0^DGmw$WuRcRJ^F%cKa zc&c95^Fnw_BGtW{7u^<&t>L4p@6N?-3|<@#WvXOrCuEAH!#}(X|EfRSQ0Nsk zyZQe7-BBomf!zzKJQEVR;&jYy2R44~*T}*YuK%WYG=GTaeJLLHPJKMaf-~6z#X=hd zL_n7eI{w};fQJZSJjX&rceZ)p*t)p6V|dHi4?+wt0Z105bk0C6FikG|q-)JSxq?RA zbAEj&&&S!OEyhi=y`|~NX$%%TugMPmf+3D4fcCG!1lvF2U^y(+8wY}bWjLEK)S1YJ zG?0#)?>+vxD(02w%eaoYXlgO|?LsEif;zgxb)H|0+06FDDDOweagI7{{#HuL;#UVr zS-C;oE&;pN5sXUNRvn51Pl&;Odq>LBIA>ZhF}6EM_HEm_pW|ZGpOa~L8T`^l-K*wN zphuxMvChe%#pXMvLvS}kbov^OU)n*_@zY4bOT|v081BX|@9xJrAN1~)(q?8tZ;0!Y zLuOGP^PE+MpL7&nxr>>yX7YHOekdz$A^#5iJJa zyoJI+;8iVQx_QH4E8e$cs6uM_gfE5!gZhMr#HRyLL_QqLDj~r&1Z1Ntju#`!C-FBf z%AC(NnT=n>D8W3+3RbYDdjbOE#D$y+CJM7yP}GV@%X+7`QU@^Hz_js*=*+G&t_^dZiA-X~64;#@1O&Za9v2(EAN-}LU$AL4mmiif>JZq4zp&l91}r)kQtpX4zFI z^-3zMKsqfMkz5!3yDqIe-`@R^sg2-7ub4-Wa zWbrBUPLt0~R74EPRO?2}D3C1!r`TjO6HkTRO?Pg_uRw-Ye4D?#yC1-P(7XMQEeuwZ zHZ|XQ)B-Nug8LcfMMJ#%k8`VNoRPhjk?|hqf)R`1L9%LTED5%JT}{@~;G^1gvD78J z-IhXQ+S$8t^X-}7bv*BjkXuatae5*EZHgXdz)p_I=`029lzFiHG$_<2#B1sFs;l`b z3?8|cr~&qw|8$5s#XxP~fZ}Hi5IFzXnhDc}vQ_`!CL(1kb%IDg0zZHYgNIJ;i8G>b z*RFVYr%@A?;F_pBAG5Wng&e!-@Z(ADpN2IkQfDSd2)F;Hcl3XV=Y1(2_Rd`vbCoqQ zZgK|)1QaEfM7!ESYa<+lFrKTGe#IgJ(?kWsH))R88s8%e3!_GV9#yw1?dYJTjIJ># zc+U6s%h=EB$Pme;VH68)@bC<2&uOjCR5=w$A3;9M1z`AVutAwQ?cN&{XK*zL2xe%# z_CNh{`NIK1FzGMEqowbU6<^`uzfZfx=w*O0ayRf}%AmtpqYa3;sh)@3bu6_Z?#Wz_ zwWEKJ=~whf?^)krPY!}Zjq!wHIQn0E$Co|EeWgTP)s%s=7eH~~^gIuRuxDm&tY&=v zC@)b;GUi)K7W@fztco^Dj1yIs;$DbHTqu1%j{zfAtniPZn5|#l-On$0&^w3S=RL%s zNAi}8iY6ab;ptq0GADizN4isooL0**B1tR3TFDBKja0C%Dpx!s6q5}d$c^@lWSA#t z=iq94(U<}PUl&=Z5vwB2KWwNoQDLeeSbw`IH8Z$QAY z{6^y8O6!Ki<5J}BiRpS(f}j89?mnOs<66q6Q%ErBA!NqYD8(tf0$8usRH4SJmj^$Q zziziO^$64|v9S|qCzbB<(JWileyS841nLS@{VGjoWlP%nZ+gf0hj`wX;$iQ=a;=ul zf|$ge4j`aOpy{GKS7RwE288i+!+28>_n0?7cDj}4x%{G(yFt6JkJYs1(RTHzSdGEv zhu4^%&AfXF%-N^*Qo*uz27VT>j6S&}HQY@X3@m!l5XTe1^w(fJSLP(#v{#PDZ$Q90 z_`w&+(fHO?6%c~)s425(j4M;NqIs>68ya)d7UODAqjYcHOh#o5VSL$g4|$htg`FKf z<7H7~jG8D?eQ<*0S5iYR6B~K;)3V(HVzA%GyT`|D?a=7`Zw4vY$`yR#*TV%834&V$ zcOPM6;$T>)G!2RJnrK_k8x|^3Snz>i7M zl4c8w6Vj~cd~!c&OCG_RH)e{jC91Su#5XVor?_a}BvV`;QoqpuH@##2Lp<+G@vwJt z+dl+ol%L(!>w|#M;%^Cw%HB7yTtOI5?_m+Q(j@gZZUwnPuj#-8zw@n)S^QHee)(Xo z$DP_F{gz`a)uKFP9ZJ;5j|e?1>bSXQS}vM>`j8`EY5+=dAdV-1<*&h}x(vEPMsIX> zG(bR%fKitPKjSOSO$fpA2AR?><&^^mwkH=YOdTvbVqL5U>WuSTeBq@ z;sRM&k{Q5ir;qZ#DM{%jd2VIek~(jdltTI$VzA%doxZbk^_)kFa4#)rtg1)$O-_gR zJ-N8)luk}+*f#YnhStBPZ6~$%ZwOjgH7vTs2_--~rBWSV!otmw?$cvY|N6_j`*}SN zdbf6ln5my1dx6qQV+S9W%cfs~TI40(DG)gv_~u!b$`0s#flF#b|m{AM}J)<}9z-joyFLJJvtM^S%@h zdndIoKBezq#}IG?0_Ldy6#p`Vq<+x^VLXSGGLqM(q->4WOCG-&Q7R>P(e$oOFl)aj zJG8N`ZnH9amPkZRsoSSs{n$G0WnGSZROcvhlE~#S1>FHpc%l=;@dU8_HCVu02EWi1 zwYy^)2&l_QF^vX2s*djqAsFZ@g)LfnP9h%K(WLFpFYoRr zEIsI5gWhbBu(N?@x1-+M!kRTaB4)g2A|2Fgw^Wt!`7wkxv8aSs#)eCbxqU%78N1Uu zVYprBI}w;3b_BXSQ!f*}K;R!V!igesBNvj;K0g*cFd|WE%vYSEzhz4(`X-?ti9X-y zpAVe*ma9~t)6^>4iDc3AUIQZ{x0`8M)M$|eMIaUg*2|Diq{8ue6`G7e{Anj7HB>~iOd{AJjAyPi(C+Z+BSl$=$QD%C51MFAR7Woa zngbV?Dbk|bh+cLr1+}7JEh@=~6(5tFjFx6`KbQk=fr3X+p(gGK$wd&y6TtD;U?Iwh zg}A2gtZ?q;t2CqJm8$s;Pz7p22u9Al^pS%r#&&qW=Gl2xnSh7Asa48N&z9a;biAb` zPMa`HiXOSUId-Au?TOFk84vs0Z(&DB^&f)hT0m<+3hP8 zc?p^GrIJuqAYS*IXH9YiG&2M|<)@A}LDajohHX^CjddatN0{HKseblXZN+1JFK`&y z{pH>Le7Xm{3l|}jiNP1$3W?vOyetwom{2m=0Z739Sa|6W>vim7AQWNUEEjO~$oMPN z-SY^$h=`hZP+X=JqC#V5!=rVJmO*UmA|jD5qWe3t7%>nOFJ|^(pp) zhT4yyDX~DbP)|NOWH*3KO-AG|pMWTvS`nay>QxC2=5peY|WO?f6JRLduVUQs>|F zj`I)kyf4MW-s$WosJyaKpZIonyfbZ~RFS7jLi^4NVLaEY&Aw@-AU%0DTi^d9>aAal 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 Zg)xmEW2s}boz$_vf|M@UqPo)Je*pD%lN0~| diff --git a/pkg/smartcontract/contract.go b/pkg/smartcontract/contract.go index 598d9dbcb..bf19a2284 100644 --- a/pkg/smartcontract/contract.go +++ b/pkg/smartcontract/contract.go @@ -30,7 +30,7 @@ func CreateMultiSigRedeemScript(m int, publicKeys keys.PublicKeys) ([]byte, erro emit.Bytes(buf.BinWriter, pubKey.Bytes()) } emit.Int(buf.BinWriter, int64(len(publicKeys))) - emit.Syscall(buf.BinWriter, interopnames.NeoCryptoCheckMultisig) + emit.Syscall(buf.BinWriter, interopnames.SystemCryptoCheckMultisig) return buf.Bytes(), nil } diff --git a/pkg/smartcontract/contract_test.go b/pkg/smartcontract/contract_test.go index 6031c7f09..8ff51deb0 100644 --- a/pkg/smartcontract/contract_test.go +++ b/pkg/smartcontract/contract_test.go @@ -33,7 +33,7 @@ func TestCreateMultiSigRedeemScript(t *testing.T) { assert.Equal(t, opcode.PUSH3, opcode.Opcode(br.ReadB())) assert.Equal(t, opcode.SYSCALL, opcode.Opcode(br.ReadB())) - assert.Equal(t, interopnames.ToID([]byte(interopnames.NeoCryptoCheckMultisig)), br.ReadU32LE()) + assert.Equal(t, interopnames.ToID([]byte(interopnames.SystemCryptoCheckMultisig)), br.ReadU32LE()) } func TestCreateDefaultMultiSigRedeemScript(t *testing.T) { diff --git a/pkg/vm/contract_checks.go b/pkg/vm/contract_checks.go index fef039bdf..9841ffb5b 100644 --- a/pkg/vm/contract_checks.go +++ b/pkg/vm/contract_checks.go @@ -14,7 +14,7 @@ import ( var ( verifyInteropID = interopnames.ToID([]byte(interopnames.SystemCryptoCheckSig)) - multisigInteropID = interopnames.ToID([]byte(interopnames.NeoCryptoCheckMultisig)) + multisigInteropID = interopnames.ToID([]byte(interopnames.SystemCryptoCheckMultisig)) ) func getNumOfThingsFromInstr(instr opcode.Opcode, param []byte) (int, bool) { diff --git a/pkg/wallet/account_test.go b/pkg/wallet/account_test.go index cb26d34db..19c74e022 100644 --- a/pkg/wallet/account_test.go +++ b/pkg/wallet/account_test.go @@ -113,13 +113,13 @@ func TestAccount_ConvertMultisig(t *testing.T) { t.Run("1/1 multisig", func(t *testing.T) { pubs := convertPubs(t, hexs[:1]) require.NoError(t, a.ConvertMultisig(1, pubs)) - require.Equal(t, "NNudMSGzEoktFzdYGYoNb3bzHzbmM1genF", a.Address) + require.Equal(t, "NfgHwwTi3wHAS8aFAN243C5vGbkYDpqLHP", a.Address) }) t.Run("3/4 multisig", func(t *testing.T) { pubs := convertPubs(t, hexs) require.NoError(t, a.ConvertMultisig(3, pubs)) - require.Equal(t, "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", a.Address) + require.Equal(t, "NVTiAjNgagDkTr5HTzDmQP9kPwPHN5BgVq", a.Address) }) } diff --git a/pkg/wallet/testdata/wallet1.json b/pkg/wallet/testdata/wallet1.json index 3955b2758..d8d226625 100644 --- a/pkg/wallet/testdata/wallet1.json +++ b/pkg/wallet/testdata/wallet1.json @@ -19,11 +19,11 @@ "isdefault": false }, { - "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", + "address": "NVTiAjNgagDkTr5HTzDmQP9kPwPHN5BgVq", "key": "6PYM8VdX2BSm7BSXKzV4Fz6S3R9cDLLWNrD9nMjxW352jEv3fsC8N3wNLY", "label": "", "contract": { - "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", + "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEGe0Nw6", "parameters": [ { "name": "parameter0", diff --git a/pkg/wallet/testdata/wallet2.json b/pkg/wallet/testdata/wallet2.json index 395a09efd..8b3155b66 100644 --- a/pkg/wallet/testdata/wallet2.json +++ b/pkg/wallet/testdata/wallet2.json @@ -19,11 +19,11 @@ "isdefault": false }, { - "address": "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", + "address": "NVTiAjNgagDkTr5HTzDmQP9kPwPHN5BgVq", "key": "6PYM8VdX2BSm7BSXKzV4Fz6S3R9cDLLWNrD9nMjxW352jEv3fsC8N3wNLY", "label": "", "contract": { - "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", + "script": "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEGe0Nw6", "parameters": [ { "name": "parameter0", From 4b933f88a73971f74966e5f1a8eaa4aa7edaa0d3 Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Tue, 11 May 2021 17:40:03 +0300 Subject: [PATCH 10/11] core: simplify interop functions We now have the only interop table (system interops). --- pkg/compiler/syscall_test.go | 6 ++---- pkg/core/blockchain.go | 2 +- pkg/core/interop/context.go | 18 ++++++++--------- pkg/core/interop/crypto/ecdsa_test.go | 2 +- pkg/core/interop/crypto/interop.go | 10 +++------- pkg/core/interops.go | 24 +++++++---------------- pkg/smartcontract/context/context_test.go | 3 +-- 7 files changed, 23 insertions(+), 42 deletions(-) diff --git a/pkg/compiler/syscall_test.go b/pkg/compiler/syscall_test.go index 863c31917..86adb3306 100644 --- a/pkg/compiler/syscall_test.go +++ b/pkg/compiler/syscall_test.go @@ -94,10 +94,8 @@ func TestSyscallExecution(t *testing.T) { ic := &interop.Context{} core.SpawnVM(ic) // set Functions field for _, fs := range ic.Functions { - for i := range fs { - // It will be set in test and we want to fail if calling invalid syscall. - fs[i].Func = nil - } + // It will be set in test and we want to fail if calling invalid syscall. + fs.Func = nil } for goName, tc := range interops { t.Run(goName, func(t *testing.T) { diff --git a/pkg/core/blockchain.go b/pkg/core/blockchain.go index fe9be92e5..26556f68a 100644 --- a/pkg/core/blockchain.go +++ b/pkg/core/blockchain.go @@ -1860,7 +1860,7 @@ func hashAndIndexToBytes(h util.Uint256, index uint32) []byte { func (bc *Blockchain) newInteropContext(trigger trigger.Type, d dao.DAO, block *block.Block, tx *transaction.Transaction) *interop.Context { ic := interop.NewContext(trigger, bc, d, bc.contracts.Management.GetContract, bc.contracts.Contracts, block, tx, bc.log) - ic.Functions = [][]interop.Function{systemInterops, neoInterops} + ic.Functions = systemInterops switch { case tx != nil: ic.Container = tx diff --git a/pkg/core/interop/context.go b/pkg/core/interop/context.go index e973a68a2..4379a0fb2 100644 --- a/pkg/core/interop/context.go +++ b/pkg/core/interop/context.go @@ -44,7 +44,7 @@ type Context struct { Notifications []state.NotificationEvent Log *zap.Logger VM *vm.VM - Functions [][]Function + Functions []Function getContract func(dao.DAO, util.Uint160) (*state.Contract, error) } @@ -64,8 +64,8 @@ func NewContext(trigger trigger.Type, bc blockchainer.Blockchainer, d dao.DAO, DAO: dao, Notifications: nes, Log: log, - // Functions is a slice of slices of interops sorted by ID. - Functions: [][]Function{}, + // Functions is a slice of interops sorted by ID. + Functions: []Function{}, getContract: getContract, } } @@ -229,13 +229,11 @@ func (ic *Context) GetContract(hash util.Uint160) (*state.Contract, error) { // GetFunction returns metadata for interop with the specified id. func (ic *Context) GetFunction(id uint32) *Function { - for _, slice := range ic.Functions { - n := sort.Search(len(slice), func(i int) bool { - return slice[i].ID >= id - }) - if n < len(slice) && slice[n].ID == id { - return &slice[n] - } + n := sort.Search(len(ic.Functions), func(i int) bool { + return ic.Functions[i].ID >= id + }) + if n < len(ic.Functions) && ic.Functions[n].ID == id { + return &ic.Functions[n] } return nil } diff --git a/pkg/core/interop/crypto/ecdsa_test.go b/pkg/core/interop/crypto/ecdsa_test.go index a8d0bf610..c5ca3ab32 100644 --- a/pkg/core/interop/crypto/ecdsa_test.go +++ b/pkg/core/interop/crypto/ecdsa_test.go @@ -71,8 +71,8 @@ func initCheckMultisigVMNoArgs(container *transaction.Transaction) *vm.VM { Network: uint32(netmode.UnitTestNet), Trigger: trigger.Verification, Container: container, + Functions: Interops, } - Register(ic) v := ic.SpawnVM() v.LoadScript(buf) return v diff --git a/pkg/core/interop/crypto/interop.go b/pkg/core/interop/crypto/interop.go index 0c969c481..93ee72e47 100644 --- a/pkg/core/interop/crypto/interop.go +++ b/pkg/core/interop/crypto/interop.go @@ -10,16 +10,12 @@ var ( neoCryptoCheckSigID = interopnames.ToID([]byte(interopnames.SystemCryptoCheckSig)) ) -var cryptoInterops = []interop.Function{ +// Interops represents sorted crypto-related interop functions. +var Interops = []interop.Function{ {ID: neoCryptoCheckMultisigID, Func: ECDSASecp256r1CheckMultisig}, {ID: neoCryptoCheckSigID, Func: ECDSASecp256r1CheckSig}, } func init() { - interop.Sort(cryptoInterops) -} - -// Register adds crypto interops to ic. -func Register(ic *interop.Context) { - ic.Functions = append(ic.Functions, cryptoInterops) + interop.Sort(Interops) } diff --git a/pkg/core/interops.go b/pkg/core/interops.go index b2dedc516..209b49f77 100644 --- a/pkg/core/interops.go +++ b/pkg/core/interops.go @@ -24,7 +24,7 @@ import ( // up for current blockchain. func SpawnVM(ic *interop.Context) *vm.VM { vm := ic.SpawnVM() - ic.Functions = [][]interop.Function{systemInterops, neoInterops} + ic.Functions = systemInterops return vm } @@ -38,6 +38,8 @@ var systemInterops = []interop.Function{ {Name: interopnames.SystemContractGetCallFlags, Func: contractGetCallFlags, Price: 1 << 10}, {Name: interopnames.SystemContractNativeOnPersist, Func: native.OnPersist, Price: 0, RequiredFlags: callflag.States}, {Name: interopnames.SystemContractNativePostPersist, Func: native.PostPersist, Price: 0, RequiredFlags: callflag.States}, + {Name: interopnames.SystemCryptoCheckMultisig, Func: crypto.ECDSASecp256r1CheckMultisig, Price: 0, ParamCount: 2}, + {Name: interopnames.SystemCryptoCheckSig, Func: crypto.ECDSASecp256r1CheckSig, Price: fee.ECDSAVerifyPrice, ParamCount: 2}, {Name: interopnames.SystemIteratorNext, Func: iterator.Next, Price: 1 << 15, ParamCount: 1}, {Name: interopnames.SystemIteratorValue, Func: iterator.Value, Price: 1 << 4, ParamCount: 1}, {Name: interopnames.SystemRuntimeBurnGas, Func: runtime.BurnGas, Price: 1 << 4, ParamCount: 1}, @@ -73,22 +75,10 @@ var systemInterops = []interop.Function{ RequiredFlags: callflag.ReadStates, ParamCount: 1}, } -var neoInterops = []interop.Function{ - {Name: interopnames.SystemCryptoCheckMultisig, Func: crypto.ECDSASecp256r1CheckMultisig, Price: 0, ParamCount: 2}, - {Name: interopnames.SystemCryptoCheckSig, Func: crypto.ECDSASecp256r1CheckSig, Price: fee.ECDSAVerifyPrice, ParamCount: 2}, -} - -// initIDinInteropsSlice initializes IDs from names in one given -// Function slice and then sorts it. -func initIDinInteropsSlice(iops []interop.Function) { - for i := range iops { - iops[i].ID = interopnames.ToID([]byte(iops[i].Name)) - } - interop.Sort(iops) -} - // init initializes IDs in the global interop slices. func init() { - initIDinInteropsSlice(systemInterops) - initIDinInteropsSlice(neoInterops) + for i := range systemInterops { + systemInterops[i].ID = interopnames.ToID([]byte(systemInterops[i].Name)) + } + interop.Sort(systemInterops) } diff --git a/pkg/smartcontract/context/context_test.go b/pkg/smartcontract/context/context_test.go index a2db41f53..fe0603671 100644 --- a/pkg/smartcontract/context/context_test.go +++ b/pkg/smartcontract/context/context_test.go @@ -118,8 +118,7 @@ func TestParameterContext_AddSignatureMultisig(t *testing.T) { } func newTestVM(w *transaction.Witness, tx *transaction.Transaction) *vm.VM { - ic := &interop.Context{Network: uint32(netmode.UnitTestNet), Container: tx} - crypto.Register(ic) + ic := &interop.Context{Network: uint32(netmode.UnitTestNet), Container: tx, Functions: crypto.Interops} v := ic.SpawnVM() v.LoadScript(w.VerificationScript) v.LoadScript(w.InvocationScript) From f824789116b1ec3eb8b10e902f8ed07654d62b92 Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Tue, 11 May 2021 17:51:45 +0300 Subject: [PATCH 11/11] core: remove neointerops-related files And move their content to systeminterops-related files. --- pkg/core/interop_neo.go | 66 -------- pkg/core/interop_neo_test.go | 280 -------------------------------- pkg/core/interop_system.go | 57 +++++++ pkg/core/interop_system_test.go | 251 ++++++++++++++++++++++++++++ 4 files changed, 308 insertions(+), 346 deletions(-) delete mode 100644 pkg/core/interop_neo.go delete mode 100644 pkg/core/interop_neo_test.go diff --git a/pkg/core/interop_neo.go b/pkg/core/interop_neo.go deleted file mode 100644 index 2858a1c8b..000000000 --- a/pkg/core/interop_neo.go +++ /dev/null @@ -1,66 +0,0 @@ -package core - -import ( - "bytes" - "errors" - "fmt" - "sort" - - "github.com/nspcc-dev/neo-go/pkg/core/interop" - "github.com/nspcc-dev/neo-go/pkg/core/interop/storage" - "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" -) - -var ( - errGasLimitExceeded = errors.New("gas limit exceeded") - errFindInvalidOptions = errors.New("invalid Find options") -) - -// storageFind finds stored key-value pair. -func storageFind(ic *interop.Context) error { - stcInterface := ic.VM.Estack().Pop().Value() - stc, ok := stcInterface.(*StorageContext) - if !ok { - return fmt.Errorf("%T is not a StorageContext", stcInterface) - } - prefix := ic.VM.Estack().Pop().Bytes() - opts := ic.VM.Estack().Pop().BigInt().Int64() - if opts&^storage.FindAll != 0 { - return fmt.Errorf("%w: unknown flag", errFindInvalidOptions) - } - if opts&storage.FindKeysOnly != 0 && - opts&(storage.FindDeserialize|storage.FindPick0|storage.FindPick1) != 0 { - return fmt.Errorf("%w KeysOnly conflicts with other options", errFindInvalidOptions) - } - if opts&storage.FindValuesOnly != 0 && - opts&(storage.FindKeysOnly|storage.FindRemovePrefix) != 0 { - return fmt.Errorf("%w: KeysOnly conflicts with ValuesOnly", errFindInvalidOptions) - } - if opts&storage.FindPick0 != 0 && opts&storage.FindPick1 != 0 { - return fmt.Errorf("%w: Pick0 conflicts with Pick1", errFindInvalidOptions) - } - if opts&storage.FindDeserialize == 0 && (opts&storage.FindPick0 != 0 || opts&storage.FindPick1 != 0) { - return fmt.Errorf("%w: PickN is specified without Deserialize", errFindInvalidOptions) - } - siMap, err := ic.DAO.GetStorageItemsWithPrefix(stc.ID, prefix) - if err != nil { - return err - } - - filteredMap := stackitem.NewMap() - for k, v := range siMap { - key := append(prefix, []byte(k)...) - keycopy := make([]byte, len(key)) - copy(keycopy, key) - filteredMap.Add(stackitem.NewByteArray(keycopy), stackitem.NewByteArray(v)) - } - sort.Slice(filteredMap.Value().([]stackitem.MapElement), func(i, j int) bool { - return bytes.Compare(filteredMap.Value().([]stackitem.MapElement)[i].Key.Value().([]byte), - filteredMap.Value().([]stackitem.MapElement)[j].Key.Value().([]byte)) == -1 - }) - - item := storage.NewIterator(filteredMap, len(prefix), opts) - ic.VM.Estack().PushVal(stackitem.NewInterop(item)) - - return nil -} diff --git a/pkg/core/interop_neo_test.go b/pkg/core/interop_neo_test.go deleted file mode 100644 index 68c2bc95f..000000000 --- a/pkg/core/interop_neo_test.go +++ /dev/null @@ -1,280 +0,0 @@ -package core - -import ( - "math/big" - "testing" - - "github.com/nspcc-dev/neo-go/pkg/core/block" - "github.com/nspcc-dev/neo-go/pkg/core/dao" - "github.com/nspcc-dev/neo-go/pkg/core/interop" - "github.com/nspcc-dev/neo-go/pkg/core/interop/iterator" - istorage "github.com/nspcc-dev/neo-go/pkg/core/interop/storage" - "github.com/nspcc-dev/neo-go/pkg/core/state" - "github.com/nspcc-dev/neo-go/pkg/core/storage" - "github.com/nspcc-dev/neo-go/pkg/core/transaction" - "github.com/nspcc-dev/neo-go/pkg/crypto/hash" - "github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest" - "github.com/nspcc-dev/neo-go/pkg/smartcontract/nef" - "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" - "github.com/stretchr/testify/require" -) - -/* Missing tests: - * TestTxGetWitnesses - * TestAccountIsStandard - * TestCreateContractStateFromVM - * TestContractCreate - * TestContractMigrate - * TestRuntimeSerialize - * TestRuntimeDeserialize - */ - -func TestStorageFind(t *testing.T) { - v, contractState, context, chain := createVMAndContractState(t) - - arr := []stackitem.Item{ - stackitem.NewBigInteger(big.NewInt(42)), - stackitem.NewByteArray([]byte("second")), - stackitem.Null{}, - } - rawArr, err := stackitem.SerializeItem(stackitem.NewArray(arr)) - require.NoError(t, err) - rawArr0, err := stackitem.SerializeItem(stackitem.NewArray(arr[:0])) - require.NoError(t, err) - rawArr1, err := stackitem.SerializeItem(stackitem.NewArray(arr[:1])) - require.NoError(t, err) - - skeys := [][]byte{{0x01, 0x02}, {0x02, 0x01}, {0x01, 0x01}, - {0x04, 0x00}, {0x05, 0x00}, {0x06}, {0x07}, {0x08}, - {0x09, 0x12, 0x34}, {0x09, 0x12, 0x56}, - } - items := []state.StorageItem{ - []byte{0x01, 0x02, 0x03, 0x04}, - []byte{0x04, 0x03, 0x02, 0x01}, - []byte{0x03, 0x04, 0x05, 0x06}, - []byte{byte(stackitem.ByteArrayT), 2, 0xCA, 0xFE}, - []byte{0xFF, 0xFF}, - rawArr, - rawArr0, - rawArr1, - []byte{111}, - []byte{222}, - } - - require.NoError(t, chain.contracts.Management.PutContractState(chain.dao, contractState)) - - id := contractState.ID - - for i := range skeys { - err := context.DAO.PutStorageItem(id, skeys[i], items[i]) - require.NoError(t, err) - } - - testFind := func(t *testing.T, prefix []byte, opts int64, expected []stackitem.Item) { - v.Estack().PushVal(opts) - v.Estack().PushVal(prefix) - v.Estack().PushVal(stackitem.NewInterop(&StorageContext{ID: id})) - - err := storageFind(context) - require.NoError(t, err) - - var iter *stackitem.Interop - require.NotPanics(t, func() { iter = v.Estack().Pop().Interop() }) - - for i := range expected { // sorted indices with mathing prefix - v.Estack().PushVal(iter) - require.NoError(t, iterator.Next(context)) - require.True(t, v.Estack().Pop().Bool()) - - v.Estack().PushVal(iter) - if expected[i] == nil { - require.Panics(t, func() { _ = iterator.Value(context) }) - return - } - require.NoError(t, iterator.Value(context)) - require.Equal(t, expected[i], v.Estack().Pop().Item()) - } - - v.Estack().PushVal(iter) - require.NoError(t, iterator.Next(context)) - require.False(t, v.Estack().Pop().Bool()) - } - - t.Run("normal invocation", func(t *testing.T) { - testFind(t, []byte{0x01}, istorage.FindDefault, []stackitem.Item{ - stackitem.NewStruct([]stackitem.Item{ - stackitem.NewByteArray(skeys[2]), - stackitem.NewByteArray(items[2]), - }), - stackitem.NewStruct([]stackitem.Item{ - stackitem.NewByteArray(skeys[0]), - stackitem.NewByteArray(items[0]), - }), - }) - }) - - t.Run("keys only", func(t *testing.T) { - testFind(t, []byte{0x01}, istorage.FindKeysOnly, []stackitem.Item{ - stackitem.NewByteArray(skeys[2]), - stackitem.NewByteArray(skeys[0]), - }) - }) - t.Run("remove prefix", func(t *testing.T) { - testFind(t, []byte{0x01}, istorage.FindKeysOnly|istorage.FindRemovePrefix, []stackitem.Item{ - stackitem.NewByteArray(skeys[2][1:]), - stackitem.NewByteArray(skeys[0][1:]), - }) - testFind(t, []byte{0x09, 0x12}, istorage.FindKeysOnly|istorage.FindRemovePrefix, []stackitem.Item{ - stackitem.NewByteArray(skeys[8][2:]), - stackitem.NewByteArray(skeys[9][2:]), - }) - }) - t.Run("values only", func(t *testing.T) { - testFind(t, []byte{0x01}, istorage.FindValuesOnly, []stackitem.Item{ - stackitem.NewByteArray(items[2]), - stackitem.NewByteArray(items[0]), - }) - }) - t.Run("deserialize values", func(t *testing.T) { - testFind(t, []byte{0x04}, istorage.FindValuesOnly|istorage.FindDeserialize, []stackitem.Item{ - stackitem.NewByteArray(items[3][2:]), - }) - t.Run("invalid", func(t *testing.T) { - v.Estack().PushVal(istorage.FindDeserialize) - v.Estack().PushVal([]byte{0x05}) - v.Estack().PushVal(stackitem.NewInterop(&StorageContext{ID: id})) - err := storageFind(context) - require.NoError(t, err) - - var iter *stackitem.Interop - require.NotPanics(t, func() { iter = v.Estack().Pop().Interop() }) - - v.Estack().PushVal(iter) - require.NoError(t, iterator.Next(context)) - - v.Estack().PushVal(iter) - require.Panics(t, func() { _ = iterator.Value(context) }) - }) - }) - t.Run("PickN", func(t *testing.T) { - testFind(t, []byte{0x06}, istorage.FindPick0|istorage.FindValuesOnly|istorage.FindDeserialize, arr[:1]) - testFind(t, []byte{0x06}, istorage.FindPick1|istorage.FindValuesOnly|istorage.FindDeserialize, arr[1:2]) - // Array with 0 elements. - testFind(t, []byte{0x07}, istorage.FindPick0|istorage.FindValuesOnly|istorage.FindDeserialize, - []stackitem.Item{nil}) - // Array with 1 element. - testFind(t, []byte{0x08}, istorage.FindPick1|istorage.FindValuesOnly|istorage.FindDeserialize, - []stackitem.Item{nil}) - // Not an array, but serialized ByteArray. - testFind(t, []byte{0x04}, istorage.FindPick1|istorage.FindValuesOnly|istorage.FindDeserialize, - []stackitem.Item{nil}) - }) - - t.Run("normal invocation, empty result", func(t *testing.T) { - testFind(t, []byte{0x03}, istorage.FindDefault, nil) - }) - - t.Run("invalid options", func(t *testing.T) { - invalid := []int64{ - istorage.FindKeysOnly | istorage.FindValuesOnly, - ^istorage.FindAll, - istorage.FindKeysOnly | istorage.FindDeserialize, - istorage.FindPick0, - istorage.FindPick0 | istorage.FindPick1 | istorage.FindDeserialize, - istorage.FindPick0 | istorage.FindPick1, - } - for _, opts := range invalid { - v.Estack().PushVal(opts) - v.Estack().PushVal([]byte{0x01}) - v.Estack().PushVal(stackitem.NewInterop(&StorageContext{ID: id})) - require.Error(t, storageFind(context)) - } - }) - t.Run("invalid type for StorageContext", func(t *testing.T) { - v.Estack().PushVal(istorage.FindDefault) - v.Estack().PushVal([]byte{0x01}) - v.Estack().PushVal(stackitem.NewInterop(nil)) - - require.Error(t, storageFind(context)) - }) - - t.Run("invalid id", func(t *testing.T) { - invalidID := id + 1 - - v.Estack().PushVal(istorage.FindDefault) - v.Estack().PushVal([]byte{0x01}) - v.Estack().PushVal(stackitem.NewInterop(&StorageContext{ID: invalidID})) - - require.NoError(t, storageFind(context)) - require.NoError(t, iterator.Next(context)) - require.False(t, v.Estack().Pop().Bool()) - }) -} - -// Helper functions to create VM, InteropContext, TX, Account, Contract. - -func createVM(t *testing.T) (*vm.VM, *interop.Context, *Blockchain) { - chain := newTestChain(t) - context := chain.newInteropContext(trigger.Application, - dao.NewSimple(storage.NewMemoryStore(), chain.config.StateRootInHeader), nil, nil) - v := context.SpawnVM() - return v, context, chain -} - -func createVMAndPushBlock(t *testing.T) (*vm.VM, *block.Block, *interop.Context, *Blockchain) { - v, block, context, chain := createVMAndBlock(t) - v.Estack().PushVal(stackitem.NewInterop(block)) - return v, block, context, chain -} - -func createVMAndBlock(t *testing.T) (*vm.VM, *block.Block, *interop.Context, *Blockchain) { - block := newDumbBlock() - chain := newTestChain(t) - d := dao.NewSimple(storage.NewMemoryStore(), chain.GetConfig().StateRootInHeader) - context := chain.newInteropContext(trigger.Application, d, block, nil) - v := context.SpawnVM() - return v, block, context, chain -} - -func createVMAndPushTX(t *testing.T) (*vm.VM, *transaction.Transaction, *interop.Context, *Blockchain) { - v, tx, context, chain := createVMAndTX(t) - v.Estack().PushVal(stackitem.NewInterop(tx)) - return v, tx, context, chain -} - -func createVMAndContractState(t *testing.T) (*vm.VM, *state.Contract, *interop.Context, *Blockchain) { - script := []byte("testscript") - m := manifest.NewManifest("Test") - ne, err := nef.NewFile(script) - require.NoError(t, err) - contractState := &state.Contract{ - ContractBase: state.ContractBase{ - NEF: *ne, - Hash: hash.Hash160(script), - Manifest: *m, - ID: 123, - }, - } - - chain := newTestChain(t) - d := dao.NewSimple(storage.NewMemoryStore(), chain.config.StateRootInHeader) - context := chain.newInteropContext(trigger.Application, d, nil, nil) - v := context.SpawnVM() - return v, contractState, context, chain -} - -func createVMAndTX(t *testing.T) (*vm.VM, *transaction.Transaction, *interop.Context, *Blockchain) { - script := []byte{byte(opcode.PUSH1), byte(opcode.RET)} - tx := transaction.New(script, 0) - tx.Signers = []transaction.Signer{{Account: util.Uint160{1, 2, 3, 4}}} - tx.Scripts = []transaction.Witness{{InvocationScript: []byte{}, VerificationScript: []byte{}}} - chain := newTestChain(t) - d := dao.NewSimple(storage.NewMemoryStore(), chain.config.StateRootInHeader) - context := chain.newInteropContext(trigger.Application, d, nil, tx) - v := context.SpawnVM() - return v, tx, context, chain -} diff --git a/pkg/core/interop_system.go b/pkg/core/interop_system.go index eb17b7ee7..e009fa778 100644 --- a/pkg/core/interop_system.go +++ b/pkg/core/interop_system.go @@ -1,13 +1,16 @@ package core import ( + "bytes" "crypto/elliptic" "errors" "fmt" "math" + "sort" "github.com/nspcc-dev/neo-go/pkg/core/block" "github.com/nspcc-dev/neo-go/pkg/core/interop" + istorage "github.com/nspcc-dev/neo-go/pkg/core/interop/storage" "github.com/nspcc-dev/neo-go/pkg/core/native" "github.com/nspcc-dev/neo-go/pkg/core/storage" "github.com/nspcc-dev/neo-go/pkg/core/transaction" @@ -17,6 +20,11 @@ import ( "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" ) +var ( + errGasLimitExceeded = errors.New("gas limit exceeded") + errFindInvalidOptions = errors.New("invalid Find options") +) + // StorageContext contains storing id and read/write flag, it's used as // a context for storage manipulation functions. type StorageContext struct { @@ -153,6 +161,55 @@ func storageContextAsReadOnly(ic *interop.Context) error { return nil } +// storageFind finds stored key-value pair. +func storageFind(ic *interop.Context) error { + stcInterface := ic.VM.Estack().Pop().Value() + stc, ok := stcInterface.(*StorageContext) + if !ok { + return fmt.Errorf("%T is not a StorageContext", stcInterface) + } + prefix := ic.VM.Estack().Pop().Bytes() + opts := ic.VM.Estack().Pop().BigInt().Int64() + if opts&^istorage.FindAll != 0 { + return fmt.Errorf("%w: unknown flag", errFindInvalidOptions) + } + if opts&istorage.FindKeysOnly != 0 && + opts&(istorage.FindDeserialize|istorage.FindPick0|istorage.FindPick1) != 0 { + return fmt.Errorf("%w KeysOnly conflicts with other options", errFindInvalidOptions) + } + if opts&istorage.FindValuesOnly != 0 && + opts&(istorage.FindKeysOnly|istorage.FindRemovePrefix) != 0 { + return fmt.Errorf("%w: KeysOnly conflicts with ValuesOnly", errFindInvalidOptions) + } + if opts&istorage.FindPick0 != 0 && opts&istorage.FindPick1 != 0 { + return fmt.Errorf("%w: Pick0 conflicts with Pick1", errFindInvalidOptions) + } + if opts&istorage.FindDeserialize == 0 && (opts&istorage.FindPick0 != 0 || opts&istorage.FindPick1 != 0) { + return fmt.Errorf("%w: PickN is specified without Deserialize", errFindInvalidOptions) + } + siMap, err := ic.DAO.GetStorageItemsWithPrefix(stc.ID, prefix) + if err != nil { + return err + } + + filteredMap := stackitem.NewMap() + for k, v := range siMap { + key := append(prefix, []byte(k)...) + keycopy := make([]byte, len(key)) + copy(keycopy, key) + filteredMap.Add(stackitem.NewByteArray(keycopy), stackitem.NewByteArray(v)) + } + sort.Slice(filteredMap.Value().([]stackitem.MapElement), func(i, j int) bool { + return bytes.Compare(filteredMap.Value().([]stackitem.MapElement)[i].Key.Value().([]byte), + filteredMap.Value().([]stackitem.MapElement)[j].Key.Value().([]byte)) == -1 + }) + + item := istorage.NewIterator(filteredMap, len(prefix), opts) + ic.VM.Estack().PushVal(stackitem.NewInterop(item)) + + return nil +} + // contractCreateMultisigAccount calculates multisig contract scripthash for a // given m and a set of public keys. func contractCreateMultisigAccount(ic *interop.Context) error { diff --git a/pkg/core/interop_system_test.go b/pkg/core/interop_system_test.go index f98ecde0f..7c6f714ef 100644 --- a/pkg/core/interop_system_test.go +++ b/pkg/core/interop_system_test.go @@ -7,10 +7,14 @@ import ( "testing" "github.com/nspcc-dev/neo-go/internal/random" + "github.com/nspcc-dev/neo-go/pkg/core/block" + "github.com/nspcc-dev/neo-go/pkg/core/dao" "github.com/nspcc-dev/neo-go/pkg/core/interop" "github.com/nspcc-dev/neo-go/pkg/core/interop/contract" "github.com/nspcc-dev/neo-go/pkg/core/interop/interopnames" + "github.com/nspcc-dev/neo-go/pkg/core/interop/iterator" "github.com/nspcc-dev/neo-go/pkg/core/interop/runtime" + istorage "github.com/nspcc-dev/neo-go/pkg/core/interop/storage" "github.com/nspcc-dev/neo-go/pkg/core/native" "github.com/nspcc-dev/neo-go/pkg/core/state" "github.com/nspcc-dev/neo-go/pkg/core/storage" @@ -22,6 +26,7 @@ import ( "github.com/nspcc-dev/neo-go/pkg/smartcontract/callflag" "github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest" "github.com/nspcc-dev/neo-go/pkg/smartcontract/nef" + "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/emit" @@ -254,6 +259,252 @@ func TestStorageDelete(t *testing.T) { }) } +func TestStorageFind(t *testing.T) { + v, contractState, context, chain := createVMAndContractState(t) + + arr := []stackitem.Item{ + stackitem.NewBigInteger(big.NewInt(42)), + stackitem.NewByteArray([]byte("second")), + stackitem.Null{}, + } + rawArr, err := stackitem.SerializeItem(stackitem.NewArray(arr)) + require.NoError(t, err) + rawArr0, err := stackitem.SerializeItem(stackitem.NewArray(arr[:0])) + require.NoError(t, err) + rawArr1, err := stackitem.SerializeItem(stackitem.NewArray(arr[:1])) + require.NoError(t, err) + + skeys := [][]byte{{0x01, 0x02}, {0x02, 0x01}, {0x01, 0x01}, + {0x04, 0x00}, {0x05, 0x00}, {0x06}, {0x07}, {0x08}, + {0x09, 0x12, 0x34}, {0x09, 0x12, 0x56}, + } + items := []state.StorageItem{ + []byte{0x01, 0x02, 0x03, 0x04}, + []byte{0x04, 0x03, 0x02, 0x01}, + []byte{0x03, 0x04, 0x05, 0x06}, + []byte{byte(stackitem.ByteArrayT), 2, 0xCA, 0xFE}, + []byte{0xFF, 0xFF}, + rawArr, + rawArr0, + rawArr1, + []byte{111}, + []byte{222}, + } + + require.NoError(t, chain.contracts.Management.PutContractState(chain.dao, contractState)) + + id := contractState.ID + + for i := range skeys { + err := context.DAO.PutStorageItem(id, skeys[i], items[i]) + require.NoError(t, err) + } + + testFind := func(t *testing.T, prefix []byte, opts int64, expected []stackitem.Item) { + v.Estack().PushVal(opts) + v.Estack().PushVal(prefix) + v.Estack().PushVal(stackitem.NewInterop(&StorageContext{ID: id})) + + err := storageFind(context) + require.NoError(t, err) + + var iter *stackitem.Interop + require.NotPanics(t, func() { iter = v.Estack().Pop().Interop() }) + + for i := range expected { // sorted indices with mathing prefix + v.Estack().PushVal(iter) + require.NoError(t, iterator.Next(context)) + require.True(t, v.Estack().Pop().Bool()) + + v.Estack().PushVal(iter) + if expected[i] == nil { + require.Panics(t, func() { _ = iterator.Value(context) }) + return + } + require.NoError(t, iterator.Value(context)) + require.Equal(t, expected[i], v.Estack().Pop().Item()) + } + + v.Estack().PushVal(iter) + require.NoError(t, iterator.Next(context)) + require.False(t, v.Estack().Pop().Bool()) + } + + t.Run("normal invocation", func(t *testing.T) { + testFind(t, []byte{0x01}, istorage.FindDefault, []stackitem.Item{ + stackitem.NewStruct([]stackitem.Item{ + stackitem.NewByteArray(skeys[2]), + stackitem.NewByteArray(items[2]), + }), + stackitem.NewStruct([]stackitem.Item{ + stackitem.NewByteArray(skeys[0]), + stackitem.NewByteArray(items[0]), + }), + }) + }) + + t.Run("keys only", func(t *testing.T) { + testFind(t, []byte{0x01}, istorage.FindKeysOnly, []stackitem.Item{ + stackitem.NewByteArray(skeys[2]), + stackitem.NewByteArray(skeys[0]), + }) + }) + t.Run("remove prefix", func(t *testing.T) { + testFind(t, []byte{0x01}, istorage.FindKeysOnly|istorage.FindRemovePrefix, []stackitem.Item{ + stackitem.NewByteArray(skeys[2][1:]), + stackitem.NewByteArray(skeys[0][1:]), + }) + testFind(t, []byte{0x09, 0x12}, istorage.FindKeysOnly|istorage.FindRemovePrefix, []stackitem.Item{ + stackitem.NewByteArray(skeys[8][2:]), + stackitem.NewByteArray(skeys[9][2:]), + }) + }) + t.Run("values only", func(t *testing.T) { + testFind(t, []byte{0x01}, istorage.FindValuesOnly, []stackitem.Item{ + stackitem.NewByteArray(items[2]), + stackitem.NewByteArray(items[0]), + }) + }) + t.Run("deserialize values", func(t *testing.T) { + testFind(t, []byte{0x04}, istorage.FindValuesOnly|istorage.FindDeserialize, []stackitem.Item{ + stackitem.NewByteArray(items[3][2:]), + }) + t.Run("invalid", func(t *testing.T) { + v.Estack().PushVal(istorage.FindDeserialize) + v.Estack().PushVal([]byte{0x05}) + v.Estack().PushVal(stackitem.NewInterop(&StorageContext{ID: id})) + err := storageFind(context) + require.NoError(t, err) + + var iter *stackitem.Interop + require.NotPanics(t, func() { iter = v.Estack().Pop().Interop() }) + + v.Estack().PushVal(iter) + require.NoError(t, iterator.Next(context)) + + v.Estack().PushVal(iter) + require.Panics(t, func() { _ = iterator.Value(context) }) + }) + }) + t.Run("PickN", func(t *testing.T) { + testFind(t, []byte{0x06}, istorage.FindPick0|istorage.FindValuesOnly|istorage.FindDeserialize, arr[:1]) + testFind(t, []byte{0x06}, istorage.FindPick1|istorage.FindValuesOnly|istorage.FindDeserialize, arr[1:2]) + // Array with 0 elements. + testFind(t, []byte{0x07}, istorage.FindPick0|istorage.FindValuesOnly|istorage.FindDeserialize, + []stackitem.Item{nil}) + // Array with 1 element. + testFind(t, []byte{0x08}, istorage.FindPick1|istorage.FindValuesOnly|istorage.FindDeserialize, + []stackitem.Item{nil}) + // Not an array, but serialized ByteArray. + testFind(t, []byte{0x04}, istorage.FindPick1|istorage.FindValuesOnly|istorage.FindDeserialize, + []stackitem.Item{nil}) + }) + + t.Run("normal invocation, empty result", func(t *testing.T) { + testFind(t, []byte{0x03}, istorage.FindDefault, nil) + }) + + t.Run("invalid options", func(t *testing.T) { + invalid := []int64{ + istorage.FindKeysOnly | istorage.FindValuesOnly, + ^istorage.FindAll, + istorage.FindKeysOnly | istorage.FindDeserialize, + istorage.FindPick0, + istorage.FindPick0 | istorage.FindPick1 | istorage.FindDeserialize, + istorage.FindPick0 | istorage.FindPick1, + } + for _, opts := range invalid { + v.Estack().PushVal(opts) + v.Estack().PushVal([]byte{0x01}) + v.Estack().PushVal(stackitem.NewInterop(&StorageContext{ID: id})) + require.Error(t, storageFind(context)) + } + }) + t.Run("invalid type for StorageContext", func(t *testing.T) { + v.Estack().PushVal(istorage.FindDefault) + v.Estack().PushVal([]byte{0x01}) + v.Estack().PushVal(stackitem.NewInterop(nil)) + + require.Error(t, storageFind(context)) + }) + + t.Run("invalid id", func(t *testing.T) { + invalidID := id + 1 + + v.Estack().PushVal(istorage.FindDefault) + v.Estack().PushVal([]byte{0x01}) + v.Estack().PushVal(stackitem.NewInterop(&StorageContext{ID: invalidID})) + + require.NoError(t, storageFind(context)) + require.NoError(t, iterator.Next(context)) + require.False(t, v.Estack().Pop().Bool()) + }) +} + +// Helper functions to create VM, InteropContext, TX, Account, Contract. + +func createVM(t *testing.T) (*vm.VM, *interop.Context, *Blockchain) { + chain := newTestChain(t) + context := chain.newInteropContext(trigger.Application, + dao.NewSimple(storage.NewMemoryStore(), chain.config.StateRootInHeader), nil, nil) + v := context.SpawnVM() + return v, context, chain +} + +func createVMAndPushBlock(t *testing.T) (*vm.VM, *block.Block, *interop.Context, *Blockchain) { + v, block, context, chain := createVMAndBlock(t) + v.Estack().PushVal(stackitem.NewInterop(block)) + return v, block, context, chain +} + +func createVMAndBlock(t *testing.T) (*vm.VM, *block.Block, *interop.Context, *Blockchain) { + block := newDumbBlock() + chain := newTestChain(t) + d := dao.NewSimple(storage.NewMemoryStore(), chain.GetConfig().StateRootInHeader) + context := chain.newInteropContext(trigger.Application, d, block, nil) + v := context.SpawnVM() + return v, block, context, chain +} + +func createVMAndPushTX(t *testing.T) (*vm.VM, *transaction.Transaction, *interop.Context, *Blockchain) { + v, tx, context, chain := createVMAndTX(t) + v.Estack().PushVal(stackitem.NewInterop(tx)) + return v, tx, context, chain +} + +func createVMAndContractState(t *testing.T) (*vm.VM, *state.Contract, *interop.Context, *Blockchain) { + script := []byte("testscript") + m := manifest.NewManifest("Test") + ne, err := nef.NewFile(script) + require.NoError(t, err) + contractState := &state.Contract{ + ContractBase: state.ContractBase{ + NEF: *ne, + Hash: hash.Hash160(script), + Manifest: *m, + ID: 123, + }, + } + + chain := newTestChain(t) + d := dao.NewSimple(storage.NewMemoryStore(), chain.config.StateRootInHeader) + context := chain.newInteropContext(trigger.Application, d, nil, nil) + v := context.SpawnVM() + return v, contractState, context, chain +} + +func createVMAndTX(t *testing.T) (*vm.VM, *transaction.Transaction, *interop.Context, *Blockchain) { + script := []byte{byte(opcode.PUSH1), byte(opcode.RET)} + tx := transaction.New(script, 0) + tx.Signers = []transaction.Signer{{Account: util.Uint160{1, 2, 3, 4}}} + tx.Scripts = []transaction.Witness{{InvocationScript: []byte{}, VerificationScript: []byte{}}} + chain := newTestChain(t) + d := dao.NewSimple(storage.NewMemoryStore(), chain.config.StateRootInHeader) + context := chain.newInteropContext(trigger.Application, d, nil, tx) + v := context.SpawnVM() + return v, tx, context, chain +} + // getTestContractState returns 2 contracts second of which is allowed to call the first. func getTestContractState(bc *Blockchain) (*state.Contract, *state.Contract) { mgmtHash := bc.ManagementContractHash()