rpc: move functions for Tx building in request package/
This commit is contained in:
parent
98a1e2170a
commit
b6bc4e580a
9 changed files with 128 additions and 130 deletions
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
|
@ -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.
|
89
pkg/rpc/request/tx_builder_test.go
Normal file
89
pkg/rpc/request/tx_builder_test.go
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue