github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/core/native/management_neotest_test.go (about) 1 package native_test 2 3 import ( 4 "encoding/json" 5 "testing" 6 7 "github.com/nspcc-dev/neo-go/internal/basicchain" 8 "github.com/nspcc-dev/neo-go/pkg/config" 9 "github.com/nspcc-dev/neo-go/pkg/core/native/nativenames" 10 "github.com/nspcc-dev/neo-go/pkg/core/state" 11 "github.com/nspcc-dev/neo-go/pkg/neotest" 12 "github.com/nspcc-dev/neo-go/pkg/neotest/chain" 13 "github.com/nspcc-dev/neo-go/pkg/smartcontract" 14 "github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest" 15 "github.com/nspcc-dev/neo-go/pkg/smartcontract/nef" 16 "github.com/nspcc-dev/neo-go/pkg/util" 17 "github.com/nspcc-dev/neo-go/pkg/vm/opcode" 18 "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" 19 "github.com/stretchr/testify/require" 20 ) 21 22 func TestManagement_GetNEP17Contracts(t *testing.T) { 23 t.Run("empty chain", func(t *testing.T) { 24 bc, validators, committee := chain.NewMulti(t) 25 e := neotest.NewExecutor(t, bc, validators, committee) 26 27 require.ElementsMatch(t, []util.Uint160{e.NativeHash(t, nativenames.Neo), 28 e.NativeHash(t, nativenames.Gas)}, bc.GetNEP17Contracts()) 29 }) 30 31 t.Run("basic chain", func(t *testing.T) { 32 bc, validators, committee := chain.NewMultiWithCustomConfig(t, func(c *config.Blockchain) { 33 c.P2PSigExtensions = true // `basicchain.Init` requires Notary enabled 34 }) 35 e := neotest.NewExecutor(t, bc, validators, committee) 36 basicchain.Init(t, "../../../", e) 37 38 require.ElementsMatch(t, []util.Uint160{e.NativeHash(t, nativenames.Neo), 39 e.NativeHash(t, nativenames.Gas), e.ContractHash(t, 1)}, bc.GetNEP17Contracts()) 40 }) 41 } 42 43 func TestManagement_DeployUpdate_HFBasilisk(t *testing.T) { 44 bc, acc := chain.NewSingleWithCustomConfig(t, func(c *config.Blockchain) { 45 c.Hardforks = map[string]uint32{ 46 config.HFBasilisk.String(): 2, 47 } 48 }) 49 e := neotest.NewExecutor(t, bc, acc, acc) 50 51 ne, err := nef.NewFile([]byte{byte(opcode.JMP), 0x05}) 52 require.NoError(t, err) 53 54 m := &manifest.Manifest{ 55 Name: "ctr", 56 ABI: manifest.ABI{ 57 Methods: []manifest.Method{ 58 { 59 Name: "main", 60 Offset: 0, 61 }, 62 }, 63 }, 64 } 65 ctr := &neotest.Contract{ 66 67 Hash: state.CreateContractHash(e.Validator.ScriptHash(), ne.Checksum, m.Name), 68 NEF: ne, 69 Manifest: m, 70 } 71 72 // Block 1: no script check on deploy. 73 e.DeployContract(t, ctr, nil) 74 e.AddNewBlock(t) 75 76 // Block 3: script check on deploy. 77 ctr.Manifest.Name = "other name" 78 e.DeployContractCheckFAULT(t, ctr, nil, "invalid contract script: invalid offset 5 ip at 0") 79 } 80 81 func TestManagement_CallInTheSameBlock(t *testing.T) { 82 bc, acc := chain.NewSingle(t) 83 84 e := neotest.NewExecutor(t, bc, acc, acc) 85 86 ne, err := nef.NewFile([]byte{byte(opcode.PUSH1)}) 87 require.NoError(t, err) 88 89 m := &manifest.Manifest{ 90 Name: "ctr", 91 ABI: manifest.ABI{ 92 Methods: []manifest.Method{ 93 { 94 Name: "main", 95 Offset: 0, 96 }, 97 }, 98 }, 99 } 100 101 t.Run("same tx", func(t *testing.T) { 102 h := state.CreateContractHash(e.Validator.ScriptHash(), ne.Checksum, m.Name) 103 104 neb, err := ne.Bytes() 105 require.NoError(t, err) 106 107 rawManifest, err := json.Marshal(m) 108 require.NoError(t, err) 109 110 b := smartcontract.NewBuilder() 111 b.InvokeWithAssert(bc.ManagementContractHash(), "deploy", neb, rawManifest) // We need to drop the resulting contract and ASSERT does that. 112 b.InvokeWithAssert(bc.ManagementContractHash(), "hasMethod", h, "main", 0) 113 b.InvokeMethod(h, "main") 114 115 script, err := b.Script() 116 require.NoError(t, err) 117 txHash := e.InvokeScript(t, script, []neotest.Signer{e.Validator}) 118 e.CheckHalt(t, txHash, stackitem.Make(1)) 119 }) 120 t.Run("next tx", func(t *testing.T) { 121 m.Name = "another contract" 122 h := state.CreateContractHash(e.Validator.ScriptHash(), ne.Checksum, m.Name) 123 124 txDeploy := e.NewDeployTx(t, e.Chain, &neotest.Contract{Hash: h, NEF: ne, Manifest: m}, nil) 125 txHasMethod := e.NewTx(t, []neotest.Signer{e.Validator}, bc.ManagementContractHash(), "hasMethod", h, "main", 0) 126 127 txCall := e.NewUnsignedTx(t, h, "main") // Test invocation doesn't give true GAS cost before deployment. 128 txCall = e.SignTx(t, txCall, 1_0000_0000, e.Validator) 129 130 e.AddNewBlock(t, txDeploy, txHasMethod, txCall) 131 e.CheckHalt(t, txHasMethod.Hash(), stackitem.Make(true)) 132 e.CheckHalt(t, txCall.Hash(), stackitem.Make(1)) 133 }) 134 }