diff --git a/cli/smartcontract/smart_contract.go b/cli/smartcontract/smart_contract.go index d91abc333..5c9011770 100644 --- a/cli/smartcontract/smart_contract.go +++ b/cli/smartcontract/smart_contract.go @@ -578,7 +578,7 @@ func contractDeploy(ctx *cli.Context) error { return cli.NewExitError(err, 1) } - txScript, err := rpc.CreateDeploymentScript(avm, &conf.Contract) + txScript, err := request.CreateDeploymentScript(avm, &conf.Contract) if err != nil { return cli.NewExitError(fmt.Errorf("failed to create deployment script: %v", err), 1) } diff --git a/integration/performance_test.go b/integration/performance_test.go index 42c5e2011..f3b63be2f 100644 --- a/integration/performance_test.go +++ b/integration/performance_test.go @@ -11,7 +11,7 @@ import ( "github.com/CityOfZion/neo-go/pkg/crypto/keys" "github.com/CityOfZion/neo-go/pkg/encoding/address" "github.com/CityOfZion/neo-go/pkg/network" - "github.com/CityOfZion/neo-go/pkg/rpc" + "github.com/CityOfZion/neo-go/pkg/rpc/request" "github.com/stretchr/testify/require" "go.uber.org/zap/zaptest" ) @@ -55,7 +55,7 @@ func prepareData(t *testing.B) []*transaction.Transaction { for n := 0; n < t.N; n++ { tx := getTX(t, wif) - require.NoError(t, rpc.SignTx(tx, wif)) + require.NoError(t, request.SignTx(tx, wif)) data = append(data, tx) } return data diff --git a/pkg/rpc/client.go b/pkg/rpc/client.go index 167c7c8bf..715c81411 100644 --- a/pkg/rpc/client.go +++ b/pkg/rpc/client.go @@ -38,7 +38,7 @@ type Client struct { wifMu *sync.Mutex wif *keys.WIF balancerMu *sync.Mutex - balancer BalanceGetter + balancer request.BalanceGetter } // ClientOptions defines options for the RPC client. @@ -122,14 +122,14 @@ func (c *Client) SetWIF(wif string) error { } // Balancer is a getter for balance field. -func (c *Client) Balancer() BalanceGetter { +func (c *Client) Balancer() request.BalanceGetter { c.balancerMu.Lock() defer c.balancerMu.Unlock() return c.balancer } // SetBalancer is a setter for balance field. -func (c *Client) SetBalancer(b BalanceGetter) { +func (c *Client) SetBalancer(b request.BalanceGetter) { c.balancerMu.Lock() defer c.balancerMu.Unlock() diff --git a/pkg/rpc/txBuilder.go b/pkg/rpc/request/txBuilder.go similarity index 91% rename from pkg/rpc/txBuilder.go rename to pkg/rpc/request/txBuilder.go index f93e7a89a..df14e84c2 100644 --- a/pkg/rpc/txBuilder.go +++ b/pkg/rpc/request/txBuilder.go @@ -1,4 +1,4 @@ -package rpc +package request import ( "errors" @@ -9,7 +9,6 @@ import ( "github.com/CityOfZion/neo-go/pkg/crypto/keys" "github.com/CityOfZion/neo-go/pkg/encoding/address" "github.com/CityOfZion/neo-go/pkg/io" - "github.com/CityOfZion/neo-go/pkg/rpc/request" "github.com/CityOfZion/neo-go/pkg/smartcontract" "github.com/CityOfZion/neo-go/pkg/util" "github.com/CityOfZion/neo-go/pkg/vm/emit" @@ -26,7 +25,7 @@ func CreateRawContractTransaction(params ContractTxParams) (*transaction.Transac fromAddress string receiverOutput *transaction.Output - wif, assetID, toAddress, amount, balancer = params.wif, params.assetID, params.address, params.value, params.balancer + wif, assetID, toAddress, amount, balancer = params.WIF, params.AssetID, params.Address, params.Value, params.Balancer ) fromAddress = wif.PrivateKey.Address() @@ -110,7 +109,7 @@ func GetInvocationScript(tx *transaction.Transaction, wif *keys.WIF) ([]byte, er // CreateDeploymentScript returns a script that deploys given smart contract // with its metadata. -func CreateDeploymentScript(avm []byte, contract *request.ContractDetails) ([]byte, error) { +func CreateDeploymentScript(avm []byte, contract *ContractDetails) ([]byte, error) { var props smartcontract.PropertyState script := io.NewBufBinWriter() @@ -142,38 +141,38 @@ func CreateDeploymentScript(avm []byte, contract *request.ContractDetails) ([]by // expandArrayIntoScript pushes all FuncParam parameters from the given array // into the given buffer in reverse order. -func expandArrayIntoScript(script *io.BinWriter, slice []request.Param) error { +func expandArrayIntoScript(script *io.BinWriter, slice []Param) error { for j := len(slice) - 1; j >= 0; j-- { fp, err := slice[j].GetFuncParam() if err != nil { return err } switch fp.Type { - case request.ByteArray, request.Signature: + case ByteArray, Signature: str, err := fp.Value.GetBytesHex() if err != nil { return err } emit.Bytes(script, str) - case request.String: + case String: str, err := fp.Value.GetString() if err != nil { return err } emit.String(script, str) - case request.Hash160: + case Hash160: hash, err := fp.Value.GetUint160FromHex() if err != nil { return err } emit.Bytes(script, hash.BytesBE()) - case request.Hash256: + case Hash256: hash, err := fp.Value.GetUint256() if err != nil { return err } emit.Bytes(script, hash.BytesBE()) - case request.PublicKey: + case PublicKey: str, err := fp.Value.GetString() if err != nil { return err @@ -183,13 +182,13 @@ func expandArrayIntoScript(script *io.BinWriter, slice []request.Param) error { return err } emit.Bytes(script, key.Bytes()) - case request.Integer: + case Integer: val, err := fp.Value.GetInt() if err != nil { return err } emit.Int(script, int64(val)) - case request.Boolean: + case Boolean: str, err := fp.Value.GetString() if err != nil { return err @@ -211,19 +210,19 @@ func expandArrayIntoScript(script *io.BinWriter, slice []request.Param) error { // CreateFunctionInvocationScript creates a script to invoke given contract with // given parameters. -func CreateFunctionInvocationScript(contract util.Uint160, params request.Params) ([]byte, error) { +func CreateFunctionInvocationScript(contract util.Uint160, params Params) ([]byte, error) { script := io.NewBufBinWriter() for i := len(params) - 1; i >= 0; i-- { switch params[i].Type { - case request.StringT: + case StringT: emit.String(script.BinWriter, params[i].String()) - case request.NumberT: + case NumberT: num, err := params[i].GetInt() if err != nil { return nil, err } emit.String(script.BinWriter, strconv.Itoa(num)) - case request.ArrayT: + case ArrayT: slice, err := params[i].GetArray() if err != nil { return nil, err @@ -245,7 +244,7 @@ func CreateFunctionInvocationScript(contract util.Uint160, params request.Params // given parameters. It differs from CreateFunctionInvocationScript in that it // expects one array of FuncParams and expands it onto the stack as independent // elements. -func CreateInvocationScript(contract util.Uint160, funcParams []request.Param) ([]byte, error) { +func CreateInvocationScript(contract util.Uint160, funcParams []Param) ([]byte, error) { script := io.NewBufBinWriter() err := expandArrayIntoScript(script.BinWriter, funcParams) if err != nil { diff --git a/pkg/rpc/txTypes.go b/pkg/rpc/request/txTypes.go similarity index 88% rename from pkg/rpc/txTypes.go rename to pkg/rpc/request/txTypes.go index 29065d41a..b97809bf0 100644 --- a/pkg/rpc/txTypes.go +++ b/pkg/rpc/request/txTypes.go @@ -1,4 +1,4 @@ -package rpc +package request /* Definition of types, interfaces and variables @@ -16,14 +16,14 @@ type ( // includes parameters duplication `sendtoaddress` RPC call params // and also some utility data; ContractTxParams struct { - assetID util.Uint256 - address string - value util.Fixed8 - wif keys.WIF // a WIF to send the transaction + AssetID util.Uint256 + Address string + Value util.Fixed8 + WIF keys.WIF // a WIF to send the transaction // since there are many ways to provide unspents, // transaction composer stays agnostic to that how // unspents was got; - balancer BalanceGetter + Balancer BalanceGetter } // BalanceGetter is an interface supporting CalculateInputs() method. diff --git a/pkg/rpc/request/tx_builder_test.go b/pkg/rpc/request/tx_builder_test.go new file mode 100644 index 000000000..a4e29edd5 --- /dev/null +++ b/pkg/rpc/request/tx_builder_test.go @@ -0,0 +1,89 @@ +package request + +import ( + "encoding/hex" + "testing" + + "github.com/CityOfZion/neo-go/pkg/util" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestInvocationScriptCreationGood(t *testing.T) { + p := Param{Type: StringT, Value: "50befd26fdf6e4d957c11e078b24ebce6291456f"} + contract, err := p.GetUint160FromHex() + require.Nil(t, err) + + var paramScripts = []struct { + ps Params + script string + }{{ + script: "676f459162ceeb248b071ec157d9e4f6fd26fdbe50", + }, { + ps: Params{{Type: StringT, Value: "transfer"}}, + script: "087472616e73666572676f459162ceeb248b071ec157d9e4f6fd26fdbe50", + }, { + ps: Params{{Type: NumberT, Value: 42}}, + script: "023432676f459162ceeb248b071ec157d9e4f6fd26fdbe50", + }, { + ps: Params{{Type: StringT, Value: "a"}, {Type: ArrayT, Value: []Param{}}}, + script: "00c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", + }, { + ps: Params{{Type: StringT, Value: "a"}, {Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: ByteArray, Value: Param{Type: StringT, Value: "50befd26fdf6e4d957c11e078b24ebce6291456f"}}}}}}, + script: "1450befd26fdf6e4d957c11e078b24ebce6291456f51c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", + }, { + ps: Params{{Type: StringT, Value: "a"}, {Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: Signature, Value: Param{Type: StringT, Value: "4edf5005771de04619235d5a4c7a9a11bb78e008541f1da7725f654c33380a3c87e2959a025da706d7255cb3a3fa07ebe9c6559d0d9e6213c68049168eb1056f"}}}}}}, + script: "404edf5005771de04619235d5a4c7a9a11bb78e008541f1da7725f654c33380a3c87e2959a025da706d7255cb3a3fa07ebe9c6559d0d9e6213c68049168eb1056f51c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", + }, { + ps: Params{{Type: StringT, Value: "a"}, {Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: String, Value: Param{Type: StringT, Value: "50befd26fdf6e4d957c11e078b24ebce6291456f"}}}}}}, + script: "283530626566643236666466366534643935376331316530373862323465626365363239313435366651c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", + }, { + ps: Params{{Type: StringT, Value: "a"}, {Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: Hash160, Value: Param{Type: StringT, Value: "50befd26fdf6e4d957c11e078b24ebce6291456f"}}}}}}, + script: "146f459162ceeb248b071ec157d9e4f6fd26fdbe5051c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", + }, { + ps: Params{{Type: StringT, Value: "a"}, {Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: Hash256, Value: Param{Type: StringT, Value: "602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7"}}}}}}, + script: "20e72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c6051c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", + }, { + ps: Params{{Type: StringT, Value: "a"}, {Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: PublicKey, Value: Param{Type: StringT, Value: "03c089d7122b840a4935234e82e26ae5efd0c2acb627239dc9f207311337b6f2c1"}}}}}}, + script: "2103c089d7122b840a4935234e82e26ae5efd0c2acb627239dc9f207311337b6f2c151c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", + }, { + ps: Params{{Type: StringT, Value: "a"}, {Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: Integer, Value: Param{Type: NumberT, Value: 42}}}}}}, + script: "012a51c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", + }, { + ps: Params{{Type: StringT, Value: "a"}, {Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: Boolean, Value: Param{Type: StringT, Value: "true"}}}}}}, + script: "5151c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", + }, { + ps: Params{{Type: StringT, Value: "a"}, {Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: Boolean, Value: Param{Type: StringT, Value: "false"}}}}}}, + script: "0051c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", + }} + for _, ps := range paramScripts { + script, err := CreateFunctionInvocationScript(contract, ps.ps) + assert.Nil(t, err) + assert.Equal(t, ps.script, hex.EncodeToString(script)) + } +} + +func TestInvocationScriptCreationBad(t *testing.T) { + contract := util.Uint160{} + + var testParams = []Params{ + {{Type: NumberT, Value: "qwerty"}}, + {{Type: ArrayT, Value: 42}}, + {{Type: ArrayT, Value: []Param{{Type: NumberT, Value: 42}}}}, + {{Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: ByteArray, Value: Param{Type: StringT, Value: "qwerty"}}}}}}, + {{Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: Signature, Value: Param{Type: StringT, Value: "qwerty"}}}}}}, + {{Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: String, Value: Param{Type: NumberT, Value: 42}}}}}}, + {{Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: Hash160, Value: Param{Type: StringT, Value: "qwerty"}}}}}}, + {{Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: Hash256, Value: Param{Type: StringT, Value: "qwerty"}}}}}}, + {{Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: PublicKey, Value: Param{Type: NumberT, Value: 42}}}}}}, + {{Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: PublicKey, Value: Param{Type: StringT, Value: "qwerty"}}}}}}, + {{Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: Integer, Value: Param{Type: StringT, Value: "qwerty"}}}}}}, + {{Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: Boolean, Value: Param{Type: NumberT, Value: 42}}}}}}, + {{Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: Boolean, Value: Param{Type: StringT, Value: "qwerty"}}}}}}, + {{Type: ArrayT, Value: []Param{{Type: FuncParamT, Value: FuncParam{Type: Unknown, Value: Param{}}}}}}, + } + for _, ps := range testParams { + _, err := CreateFunctionInvocationScript(contract, ps) + assert.NotNil(t, err) + } +} diff --git a/pkg/rpc/rpc.go b/pkg/rpc/rpc.go index 29a9f1a15..d778d1a1b 100644 --- a/pkg/rpc/rpc.go +++ b/pkg/rpc/rpc.go @@ -130,18 +130,18 @@ func (c *Client) SendToAddress(asset util.Uint256, address string, amount util.F var ( err error rawTx *transaction.Transaction - txParams = ContractTxParams{ - assetID: asset, - address: address, - value: amount, - wif: c.WIF(), - balancer: c.Balancer(), + txParams = request.ContractTxParams{ + AssetID: asset, + Address: address, + Value: amount, + WIF: c.WIF(), + Balancer: c.Balancer(), } respRaw *response.Raw resp = &response.SendToAddress{} ) - if rawTx, err = CreateRawContractTransaction(txParams); err != nil { + if rawTx, err = request.CreateRawContractTransaction(txParams); err != nil { return nil, errors.Wrap(err, "failed to create raw transaction for `sendtoaddress`") } if respRaw, err = c.sendRawTransaction(rawTx); err != nil { @@ -168,12 +168,12 @@ func (c *Client) SignAndPushInvocationTx(script []byte, wif *keys.WIF, gas util. fromAddress := wif.PrivateKey.Address() if gas > 0 { - if err = AddInputsAndUnspentsToTx(tx, fromAddress, core.UtilityTokenID(), gas, c); err != nil { + if err = request.AddInputsAndUnspentsToTx(tx, fromAddress, core.UtilityTokenID(), gas, c); err != nil { return txHash, errors.Wrap(err, "failed to add inputs and unspents to transaction") } } - if err = SignTx(tx, wif); err != nil { + if err = request.SignTx(tx, wif); err != nil { return txHash, errors.Wrap(err, "failed to sign tx") } txHash = tx.Hash() diff --git a/pkg/rpc/server.go b/pkg/rpc/server.go index 8b3553366..e795b1ee5 100644 --- a/pkg/rpc/server.go +++ b/pkg/rpc/server.go @@ -448,7 +448,7 @@ func (s *Server) invoke(reqParams request.Params) (interface{}, error) { if err != nil { return nil, err } - script, err := CreateInvocationScript(scriptHash, slice) + script, err := request.CreateInvocationScript(scriptHash, slice) if err != nil { return nil, err } @@ -465,7 +465,7 @@ func (s *Server) invokeFunction(reqParams request.Params) (interface{}, error) { if err != nil { return nil, err } - script, err := CreateFunctionInvocationScript(scriptHash, reqParams[1:]) + script, err := request.CreateFunctionInvocationScript(scriptHash, reqParams[1:]) if err != nil { return nil, err } diff --git a/pkg/rpc/tx_builder_test.go b/pkg/rpc/tx_builder_test.go deleted file mode 100644 index 453a503b3..000000000 --- a/pkg/rpc/tx_builder_test.go +++ /dev/null @@ -1,90 +0,0 @@ -package rpc - -import ( - "encoding/hex" - "testing" - - "github.com/CityOfZion/neo-go/pkg/rpc/request" - "github.com/CityOfZion/neo-go/pkg/util" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestInvocationScriptCreationGood(t *testing.T) { - p := request.Param{Type: request.StringT, Value: "50befd26fdf6e4d957c11e078b24ebce6291456f"} - contract, err := p.GetUint160FromHex() - require.Nil(t, err) - - var paramScripts = []struct { - ps request.Params - script string - }{{ - script: "676f459162ceeb248b071ec157d9e4f6fd26fdbe50", - }, { - ps: request.Params{{Type: request.StringT, Value: "transfer"}}, - script: "087472616e73666572676f459162ceeb248b071ec157d9e4f6fd26fdbe50", - }, { - ps: request.Params{{Type: request.NumberT, Value: 42}}, - script: "023432676f459162ceeb248b071ec157d9e4f6fd26fdbe50", - }, { - ps: request.Params{{Type: request.StringT, Value: "a"}, {Type: request.ArrayT, Value: []request.Param{}}}, - script: "00c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", - }, { - ps: request.Params{{Type: request.StringT, Value: "a"}, {Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.ByteArray, Value: request.Param{Type: request.StringT, Value: "50befd26fdf6e4d957c11e078b24ebce6291456f"}}}}}}, - script: "1450befd26fdf6e4d957c11e078b24ebce6291456f51c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", - }, { - ps: request.Params{{Type: request.StringT, Value: "a"}, {Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.Signature, Value: request.Param{Type: request.StringT, Value: "4edf5005771de04619235d5a4c7a9a11bb78e008541f1da7725f654c33380a3c87e2959a025da706d7255cb3a3fa07ebe9c6559d0d9e6213c68049168eb1056f"}}}}}}, - script: "404edf5005771de04619235d5a4c7a9a11bb78e008541f1da7725f654c33380a3c87e2959a025da706d7255cb3a3fa07ebe9c6559d0d9e6213c68049168eb1056f51c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", - }, { - ps: request.Params{{Type: request.StringT, Value: "a"}, {Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.String, Value: request.Param{Type: request.StringT, Value: "50befd26fdf6e4d957c11e078b24ebce6291456f"}}}}}}, - script: "283530626566643236666466366534643935376331316530373862323465626365363239313435366651c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", - }, { - ps: request.Params{{Type: request.StringT, Value: "a"}, {Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.Hash160, Value: request.Param{Type: request.StringT, Value: "50befd26fdf6e4d957c11e078b24ebce6291456f"}}}}}}, - script: "146f459162ceeb248b071ec157d9e4f6fd26fdbe5051c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", - }, { - ps: request.Params{{Type: request.StringT, Value: "a"}, {Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.Hash256, Value: request.Param{Type: request.StringT, Value: "602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7"}}}}}}, - script: "20e72d286979ee6cb1b7e65dfddfb2e384100b8d148e7758de42e4168b71792c6051c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", - }, { - ps: request.Params{{Type: request.StringT, Value: "a"}, {Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.PublicKey, Value: request.Param{Type: request.StringT, Value: "03c089d7122b840a4935234e82e26ae5efd0c2acb627239dc9f207311337b6f2c1"}}}}}}, - script: "2103c089d7122b840a4935234e82e26ae5efd0c2acb627239dc9f207311337b6f2c151c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", - }, { - ps: request.Params{{Type: request.StringT, Value: "a"}, {Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.Integer, Value: request.Param{Type: request.NumberT, Value: 42}}}}}}, - script: "012a51c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", - }, { - ps: request.Params{{Type: request.StringT, Value: "a"}, {Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.Boolean, Value: request.Param{Type: request.StringT, Value: "true"}}}}}}, - script: "5151c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", - }, { - ps: request.Params{{Type: request.StringT, Value: "a"}, {Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.Boolean, Value: request.Param{Type: request.StringT, Value: "false"}}}}}}, - script: "0051c10161676f459162ceeb248b071ec157d9e4f6fd26fdbe50", - }} - for _, ps := range paramScripts { - script, err := CreateFunctionInvocationScript(contract, ps.ps) - assert.Nil(t, err) - assert.Equal(t, ps.script, hex.EncodeToString(script)) - } -} - -func TestInvocationScriptCreationBad(t *testing.T) { - contract := util.Uint160{} - - var testParams = []request.Params{ - {{Type: request.NumberT, Value: "qwerty"}}, - {{Type: request.ArrayT, Value: 42}}, - {{Type: request.ArrayT, Value: []request.Param{{Type: request.NumberT, Value: 42}}}}, - {{Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.ByteArray, Value: request.Param{Type: request.StringT, Value: "qwerty"}}}}}}, - {{Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.Signature, Value: request.Param{Type: request.StringT, Value: "qwerty"}}}}}}, - {{Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.String, Value: request.Param{Type: request.NumberT, Value: 42}}}}}}, - {{Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.Hash160, Value: request.Param{Type: request.StringT, Value: "qwerty"}}}}}}, - {{Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.Hash256, Value: request.Param{Type: request.StringT, Value: "qwerty"}}}}}}, - {{Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.PublicKey, Value: request.Param{Type: request.NumberT, Value: 42}}}}}}, - {{Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.PublicKey, Value: request.Param{Type: request.StringT, Value: "qwerty"}}}}}}, - {{Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.Integer, Value: request.Param{Type: request.StringT, Value: "qwerty"}}}}}}, - {{Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.Boolean, Value: request.Param{Type: request.NumberT, Value: 42}}}}}}, - {{Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.Boolean, Value: request.Param{Type: request.StringT, Value: "qwerty"}}}}}}, - {{Type: request.ArrayT, Value: []request.Param{{Type: request.FuncParamT, Value: request.FuncParam{Type: request.Unknown, Value: request.Param{}}}}}}, - } - for _, ps := range testParams { - _, err := CreateFunctionInvocationScript(contract, ps) - assert.NotNil(t, err) - } -}