rpc: move functions for Tx building in request package/

This commit is contained in:
Evgenii Stratonikov 2020-02-17 14:54:53 +03:00 committed by Roman Khimov
parent 98a1e2170a
commit b6bc4e580a
9 changed files with 128 additions and 130 deletions

View file

@ -578,7 +578,7 @@ func contractDeploy(ctx *cli.Context) error {
return cli.NewExitError(err, 1) return cli.NewExitError(err, 1)
} }
txScript, err := rpc.CreateDeploymentScript(avm, &conf.Contract) txScript, err := request.CreateDeploymentScript(avm, &conf.Contract)
if err != nil { if err != nil {
return cli.NewExitError(fmt.Errorf("failed to create deployment script: %v", err), 1) return cli.NewExitError(fmt.Errorf("failed to create deployment script: %v", err), 1)
} }

View file

@ -11,7 +11,7 @@ import (
"github.com/CityOfZion/neo-go/pkg/crypto/keys" "github.com/CityOfZion/neo-go/pkg/crypto/keys"
"github.com/CityOfZion/neo-go/pkg/encoding/address" "github.com/CityOfZion/neo-go/pkg/encoding/address"
"github.com/CityOfZion/neo-go/pkg/network" "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" "github.com/stretchr/testify/require"
"go.uber.org/zap/zaptest" "go.uber.org/zap/zaptest"
) )
@ -55,7 +55,7 @@ func prepareData(t *testing.B) []*transaction.Transaction {
for n := 0; n < t.N; n++ { for n := 0; n < t.N; n++ {
tx := getTX(t, wif) tx := getTX(t, wif)
require.NoError(t, rpc.SignTx(tx, wif)) require.NoError(t, request.SignTx(tx, wif))
data = append(data, tx) data = append(data, tx)
} }
return data return data

View file

@ -38,7 +38,7 @@ type Client struct {
wifMu *sync.Mutex wifMu *sync.Mutex
wif *keys.WIF wif *keys.WIF
balancerMu *sync.Mutex balancerMu *sync.Mutex
balancer BalanceGetter balancer request.BalanceGetter
} }
// ClientOptions defines options for the RPC client. // 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. // Balancer is a getter for balance field.
func (c *Client) Balancer() BalanceGetter { func (c *Client) Balancer() request.BalanceGetter {
c.balancerMu.Lock() c.balancerMu.Lock()
defer c.balancerMu.Unlock() defer c.balancerMu.Unlock()
return c.balancer return c.balancer
} }
// SetBalancer is a setter for balance field. // SetBalancer is a setter for balance field.
func (c *Client) SetBalancer(b BalanceGetter) { func (c *Client) SetBalancer(b request.BalanceGetter) {
c.balancerMu.Lock() c.balancerMu.Lock()
defer c.balancerMu.Unlock() defer c.balancerMu.Unlock()

View file

@ -1,4 +1,4 @@
package rpc package request
import ( import (
"errors" "errors"
@ -9,7 +9,6 @@ import (
"github.com/CityOfZion/neo-go/pkg/crypto/keys" "github.com/CityOfZion/neo-go/pkg/crypto/keys"
"github.com/CityOfZion/neo-go/pkg/encoding/address" "github.com/CityOfZion/neo-go/pkg/encoding/address"
"github.com/CityOfZion/neo-go/pkg/io" "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/smartcontract"
"github.com/CityOfZion/neo-go/pkg/util" "github.com/CityOfZion/neo-go/pkg/util"
"github.com/CityOfZion/neo-go/pkg/vm/emit" "github.com/CityOfZion/neo-go/pkg/vm/emit"
@ -26,7 +25,7 @@ func CreateRawContractTransaction(params ContractTxParams) (*transaction.Transac
fromAddress string fromAddress string
receiverOutput *transaction.Output 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() 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 // CreateDeploymentScript returns a script that deploys given smart contract
// with its metadata. // with its metadata.
func CreateDeploymentScript(avm []byte, contract *request.ContractDetails) ([]byte, error) { func CreateDeploymentScript(avm []byte, contract *ContractDetails) ([]byte, error) {
var props smartcontract.PropertyState var props smartcontract.PropertyState
script := io.NewBufBinWriter() script := io.NewBufBinWriter()
@ -142,38 +141,38 @@ func CreateDeploymentScript(avm []byte, contract *request.ContractDetails) ([]by
// expandArrayIntoScript pushes all FuncParam parameters from the given array // expandArrayIntoScript pushes all FuncParam parameters from the given array
// into the given buffer in reverse order. // 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-- { for j := len(slice) - 1; j >= 0; j-- {
fp, err := slice[j].GetFuncParam() fp, err := slice[j].GetFuncParam()
if err != nil { if err != nil {
return err return err
} }
switch fp.Type { switch fp.Type {
case request.ByteArray, request.Signature: case ByteArray, Signature:
str, err := fp.Value.GetBytesHex() str, err := fp.Value.GetBytesHex()
if err != nil { if err != nil {
return err return err
} }
emit.Bytes(script, str) emit.Bytes(script, str)
case request.String: case String:
str, err := fp.Value.GetString() str, err := fp.Value.GetString()
if err != nil { if err != nil {
return err return err
} }
emit.String(script, str) emit.String(script, str)
case request.Hash160: case Hash160:
hash, err := fp.Value.GetUint160FromHex() hash, err := fp.Value.GetUint160FromHex()
if err != nil { if err != nil {
return err return err
} }
emit.Bytes(script, hash.BytesBE()) emit.Bytes(script, hash.BytesBE())
case request.Hash256: case Hash256:
hash, err := fp.Value.GetUint256() hash, err := fp.Value.GetUint256()
if err != nil { if err != nil {
return err return err
} }
emit.Bytes(script, hash.BytesBE()) emit.Bytes(script, hash.BytesBE())
case request.PublicKey: case PublicKey:
str, err := fp.Value.GetString() str, err := fp.Value.GetString()
if err != nil { if err != nil {
return err return err
@ -183,13 +182,13 @@ func expandArrayIntoScript(script *io.BinWriter, slice []request.Param) error {
return err return err
} }
emit.Bytes(script, key.Bytes()) emit.Bytes(script, key.Bytes())
case request.Integer: case Integer:
val, err := fp.Value.GetInt() val, err := fp.Value.GetInt()
if err != nil { if err != nil {
return err return err
} }
emit.Int(script, int64(val)) emit.Int(script, int64(val))
case request.Boolean: case Boolean:
str, err := fp.Value.GetString() str, err := fp.Value.GetString()
if err != nil { if err != nil {
return err return err
@ -211,19 +210,19 @@ func expandArrayIntoScript(script *io.BinWriter, slice []request.Param) error {
// CreateFunctionInvocationScript creates a script to invoke given contract with // CreateFunctionInvocationScript creates a script to invoke given contract with
// given parameters. // given parameters.
func CreateFunctionInvocationScript(contract util.Uint160, params request.Params) ([]byte, error) { func CreateFunctionInvocationScript(contract util.Uint160, params Params) ([]byte, error) {
script := io.NewBufBinWriter() script := io.NewBufBinWriter()
for i := len(params) - 1; i >= 0; i-- { for i := len(params) - 1; i >= 0; i-- {
switch params[i].Type { switch params[i].Type {
case request.StringT: case StringT:
emit.String(script.BinWriter, params[i].String()) emit.String(script.BinWriter, params[i].String())
case request.NumberT: case NumberT:
num, err := params[i].GetInt() num, err := params[i].GetInt()
if err != nil { if err != nil {
return nil, err return nil, err
} }
emit.String(script.BinWriter, strconv.Itoa(num)) emit.String(script.BinWriter, strconv.Itoa(num))
case request.ArrayT: case ArrayT:
slice, err := params[i].GetArray() slice, err := params[i].GetArray()
if err != nil { if err != nil {
return nil, err return nil, err
@ -245,7 +244,7 @@ func CreateFunctionInvocationScript(contract util.Uint160, params request.Params
// given parameters. It differs from CreateFunctionInvocationScript in that it // given parameters. It differs from CreateFunctionInvocationScript in that it
// expects one array of FuncParams and expands it onto the stack as independent // expects one array of FuncParams and expands it onto the stack as independent
// elements. // elements.
func CreateInvocationScript(contract util.Uint160, funcParams []request.Param) ([]byte, error) { func CreateInvocationScript(contract util.Uint160, funcParams []Param) ([]byte, error) {
script := io.NewBufBinWriter() script := io.NewBufBinWriter()
err := expandArrayIntoScript(script.BinWriter, funcParams) err := expandArrayIntoScript(script.BinWriter, funcParams)
if err != nil { if err != nil {

View file

@ -1,4 +1,4 @@
package rpc package request
/* /*
Definition of types, interfaces and variables Definition of types, interfaces and variables
@ -16,14 +16,14 @@ type (
// includes parameters duplication `sendtoaddress` RPC call params // includes parameters duplication `sendtoaddress` RPC call params
// and also some utility data; // and also some utility data;
ContractTxParams struct { ContractTxParams struct {
assetID util.Uint256 AssetID util.Uint256
address string Address string
value util.Fixed8 Value util.Fixed8
wif keys.WIF // a WIF to send the transaction WIF keys.WIF // a WIF to send the transaction
// since there are many ways to provide unspents, // since there are many ways to provide unspents,
// transaction composer stays agnostic to that how // transaction composer stays agnostic to that how
// unspents was got; // unspents was got;
balancer BalanceGetter Balancer BalanceGetter
} }
// BalanceGetter is an interface supporting CalculateInputs() method. // BalanceGetter is an interface supporting CalculateInputs() method.

View file

@ -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)
}
}

View file

@ -130,18 +130,18 @@ func (c *Client) SendToAddress(asset util.Uint256, address string, amount util.F
var ( var (
err error err error
rawTx *transaction.Transaction rawTx *transaction.Transaction
txParams = ContractTxParams{ txParams = request.ContractTxParams{
assetID: asset, AssetID: asset,
address: address, Address: address,
value: amount, Value: amount,
wif: c.WIF(), WIF: c.WIF(),
balancer: c.Balancer(), Balancer: c.Balancer(),
} }
respRaw *response.Raw respRaw *response.Raw
resp = &response.SendToAddress{} 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`") return nil, errors.Wrap(err, "failed to create raw transaction for `sendtoaddress`")
} }
if respRaw, err = c.sendRawTransaction(rawTx); err != nil { 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() fromAddress := wif.PrivateKey.Address()
if gas > 0 { 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") 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") return txHash, errors.Wrap(err, "failed to sign tx")
} }
txHash = tx.Hash() txHash = tx.Hash()

View file

@ -448,7 +448,7 @@ func (s *Server) invoke(reqParams request.Params) (interface{}, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
script, err := CreateInvocationScript(scriptHash, slice) script, err := request.CreateInvocationScript(scriptHash, slice)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -465,7 +465,7 @@ func (s *Server) invokeFunction(reqParams request.Params) (interface{}, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
script, err := CreateFunctionInvocationScript(scriptHash, reqParams[1:]) script, err := request.CreateFunctionInvocationScript(scriptHash, reqParams[1:])
if err != nil { if err != nil {
return nil, err return nil, err
} }

View file

@ -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)
}
}