rpcclient: add gas package for the GAS contract
Test it with the RPC server.
This commit is contained in:
parent
ee84a4ab32
commit
ee72b2fa29
4 changed files with 79 additions and 12 deletions
|
@ -17,6 +17,7 @@ import (
|
||||||
"github.com/nspcc-dev/neo-go/pkg/encoding/fixedn"
|
"github.com/nspcc-dev/neo-go/pkg/encoding/fixedn"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/neorpc/result"
|
"github.com/nspcc-dev/neo-go/pkg/neorpc/result"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpcclient"
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/gas"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpcclient/invoker"
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/invoker"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpcclient/nep17"
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/nep17"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest"
|
||||||
|
@ -241,7 +242,8 @@ func getNEP17Balance(ctx *cli.Context) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Try to get native NEP17 with matching symbol.
|
// Try to get native NEP17 with matching symbol.
|
||||||
var gasSymbol, neoSymbol string
|
var gasSymbol, neoSymbol string
|
||||||
gasSymbol, h, err = getNativeNEP17Symbol(c, nativenames.Gas)
|
g := gas.NewReader(invoker.New(c, nil))
|
||||||
|
gasSymbol, err = g.Symbol()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -253,6 +255,8 @@ func getNEP17Balance(ctx *cli.Context) error {
|
||||||
if neoSymbol != name {
|
if neoSymbol != name {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
h = gas.Hash
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
26
pkg/rpcclient/gas/gas.go
Normal file
26
pkg/rpcclient/gas/gas.go
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
Package gas provides a convenience wrapper for GAS contract to use it via RPC.
|
||||||
|
|
||||||
|
GAS itself only has standard NEP-17 methods, so this package only contains its
|
||||||
|
hash and allows to create NEP-17 structures in an easier way.
|
||||||
|
*/
|
||||||
|
package gas
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/native/nativenames"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/state"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/nep17"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Hash stores the hash of the native GAS contract.
|
||||||
|
var Hash = state.CreateNativeContractHash(nativenames.Gas)
|
||||||
|
|
||||||
|
// NewReader creates a NEP-17 reader for the GAS contract.
|
||||||
|
func NewReader(invoker nep17.Invoker) *nep17.TokenReader {
|
||||||
|
return nep17.NewReader(invoker, Hash)
|
||||||
|
}
|
||||||
|
|
||||||
|
// New creates a NEP-17 contract instance for the native GAS contract.
|
||||||
|
func New(actor nep17.Actor) *nep17.Token {
|
||||||
|
return nep17.New(actor, Hash)
|
||||||
|
}
|
40
pkg/rpcclient/gas/gas_test.go
Normal file
40
pkg/rpcclient/gas/gas_test.go
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
package gas
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/neorpc/result"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
type testAct struct {
|
||||||
|
err error
|
||||||
|
res *result.Invoke
|
||||||
|
tx *transaction.Transaction
|
||||||
|
txh util.Uint256
|
||||||
|
vub uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *testAct) Call(contract util.Uint160, operation string, params ...interface{}) (*result.Invoke, error) {
|
||||||
|
return t.res, t.err
|
||||||
|
}
|
||||||
|
func (t *testAct) MakeRun(script []byte) (*transaction.Transaction, error) {
|
||||||
|
return t.tx, t.err
|
||||||
|
}
|
||||||
|
func (t *testAct) MakeUnsignedRun(script []byte, attrs []transaction.Attribute) (*transaction.Transaction, error) {
|
||||||
|
return t.tx, t.err
|
||||||
|
}
|
||||||
|
func (t *testAct) SendRun(script []byte) (util.Uint256, uint32, error) {
|
||||||
|
return t.txh, t.vub, t.err
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNew(t *testing.T) {
|
||||||
|
ta := &testAct{}
|
||||||
|
gr := NewReader(ta)
|
||||||
|
require.NotNil(t, gr)
|
||||||
|
|
||||||
|
g := New(ta)
|
||||||
|
require.NotNil(t, g)
|
||||||
|
}
|
|
@ -20,7 +20,6 @@ import (
|
||||||
"github.com/nspcc-dev/neo-go/pkg/config"
|
"github.com/nspcc-dev/neo-go/pkg/config"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core"
|
"github.com/nspcc-dev/neo-go/pkg/core"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/fee"
|
"github.com/nspcc-dev/neo-go/pkg/core/fee"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/native/nativenames"
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/native/noderoles"
|
"github.com/nspcc-dev/neo-go/pkg/core/native/noderoles"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
"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/crypto/hash"
|
||||||
|
@ -31,6 +30,7 @@ import (
|
||||||
"github.com/nspcc-dev/neo-go/pkg/network"
|
"github.com/nspcc-dev/neo-go/pkg/network"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpcclient"
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpcclient/actor"
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/actor"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/gas"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpcclient/invoker"
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/invoker"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpcclient/nep17"
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/nep17"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/rpcclient/nns"
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/nns"
|
||||||
|
@ -781,14 +781,11 @@ func TestCreateNEP17TransferTx(t *testing.T) {
|
||||||
acc := wallet.NewAccountFromPrivateKey(priv)
|
acc := wallet.NewAccountFromPrivateKey(priv)
|
||||||
addr := priv.PublicKey().GetScriptHash()
|
addr := priv.PublicKey().GetScriptHash()
|
||||||
|
|
||||||
gasContractHash, err := c.GetNativeContractHash(nativenames.Gas)
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
t.Run("default scope", func(t *testing.T) {
|
t.Run("default scope", func(t *testing.T) {
|
||||||
act, err := actor.NewSimple(c, acc)
|
act, err := actor.NewSimple(c, acc)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
gas := nep17.New(act, gasContractHash)
|
gasprom := gas.New(act)
|
||||||
tx, err := gas.TransferUnsigned(addr, util.Uint160{}, big.NewInt(1000), nil)
|
tx, err := gasprom.TransferUnsigned(addr, util.Uint160{}, big.NewInt(1000), nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, acc.SignTx(testchain.Network(), tx))
|
require.NoError(t, acc.SignTx(testchain.Network(), tx))
|
||||||
require.NoError(t, chain.VerifyTx(tx))
|
require.NoError(t, chain.VerifyTx(tx))
|
||||||
|
@ -805,8 +802,8 @@ func TestCreateNEP17TransferTx(t *testing.T) {
|
||||||
Account: acc,
|
Account: acc,
|
||||||
}})
|
}})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
gas := nep17.New(act, gasContractHash)
|
gasprom := gas.New(act)
|
||||||
_, err = gas.TransferUnsigned(addr, util.Uint160{}, big.NewInt(1000), nil)
|
_, err = gasprom.TransferUnsigned(addr, util.Uint160{}, big.NewInt(1000), nil)
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
})
|
})
|
||||||
t.Run("customcontracts scope", func(t *testing.T) {
|
t.Run("customcontracts scope", func(t *testing.T) {
|
||||||
|
@ -814,13 +811,13 @@ func TestCreateNEP17TransferTx(t *testing.T) {
|
||||||
Signer: transaction.Signer{
|
Signer: transaction.Signer{
|
||||||
Account: priv.PublicKey().GetScriptHash(),
|
Account: priv.PublicKey().GetScriptHash(),
|
||||||
Scopes: transaction.CustomContracts,
|
Scopes: transaction.CustomContracts,
|
||||||
AllowedContracts: []util.Uint160{gasContractHash},
|
AllowedContracts: []util.Uint160{gas.Hash},
|
||||||
},
|
},
|
||||||
Account: acc,
|
Account: acc,
|
||||||
}})
|
}})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
gas := nep17.New(act, gasContractHash)
|
gasprom := gas.New(act)
|
||||||
tx, err := gas.TransferUnsigned(addr, util.Uint160{}, big.NewInt(1000), nil)
|
tx, err := gasprom.TransferUnsigned(addr, util.Uint160{}, big.NewInt(1000), nil)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, acc.SignTx(testchain.Network(), tx))
|
require.NoError(t, acc.SignTx(testchain.Network(), tx))
|
||||||
require.NoError(t, chain.VerifyTx(tx))
|
require.NoError(t, chain.VerifyTx(tx))
|
||||||
|
|
Loading…
Reference in a new issue