2020-07-24 13:54:03 +00:00
|
|
|
package client
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
|
2020-12-11 08:33:27 +00:00
|
|
|
"github.com/nspcc-dev/neo-go/pkg/encoding/fixedn"
|
2020-07-24 13:54:03 +00:00
|
|
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
2020-08-27 11:57:13 +00:00
|
|
|
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
|
2020-07-24 13:54:03 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// StaticClient is a wrapper over Neo:Morph client
|
|
|
|
// that invokes single smart contract methods with fixed fee.
|
|
|
|
//
|
|
|
|
// Working static client must be created via constructor NewStatic.
|
|
|
|
// Using the StaticClient that has been created with new(StaticClient)
|
|
|
|
// expression (or just declaring a StaticClient variable) is unsafe
|
|
|
|
// and can lead to panic.
|
|
|
|
type StaticClient struct {
|
2021-05-25 12:07:57 +00:00
|
|
|
tryNotary bool
|
|
|
|
|
2020-07-24 13:54:03 +00:00
|
|
|
client *Client // neo-go client instance
|
|
|
|
|
|
|
|
scScriptHash util.Uint160 // contract script-hash
|
|
|
|
|
2020-12-11 08:33:27 +00:00
|
|
|
fee fixedn.Fixed8 // invocation fee
|
2020-07-24 13:54:03 +00:00
|
|
|
}
|
|
|
|
|
2021-05-25 12:07:57 +00:00
|
|
|
type staticOpts struct {
|
|
|
|
tryNotary bool
|
|
|
|
}
|
|
|
|
|
|
|
|
// StaticClientOption allows to set an optional
|
|
|
|
// parameter of StaticClient.
|
|
|
|
type StaticClientOption func(*staticOpts)
|
|
|
|
|
|
|
|
func defaultStaticOpts() *staticOpts {
|
|
|
|
return new(staticOpts)
|
|
|
|
}
|
|
|
|
|
|
|
|
// TryNotaryInvoke returns option to enable
|
|
|
|
// notary invocation tries.
|
|
|
|
func TryNotary() StaticClientOption {
|
|
|
|
return func(o *staticOpts) {
|
|
|
|
o.tryNotary = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-24 13:54:03 +00:00
|
|
|
// ErrNilStaticClient is returned by functions that expect
|
|
|
|
// a non-nil StaticClient pointer, but received nil.
|
|
|
|
var ErrNilStaticClient = errors.New("static client is nil")
|
|
|
|
|
|
|
|
// NewStatic creates, initializes and returns the StaticClient instance.
|
|
|
|
//
|
|
|
|
// If provided Client instance is nil, ErrNilClient is returned.
|
2021-05-25 12:07:57 +00:00
|
|
|
func NewStatic(client *Client, scriptHash util.Uint160, fee fixedn.Fixed8, opts ...StaticClientOption) (*StaticClient, error) {
|
2020-07-24 13:54:03 +00:00
|
|
|
if client == nil {
|
|
|
|
return nil, ErrNilClient
|
|
|
|
}
|
|
|
|
|
2021-05-25 12:07:57 +00:00
|
|
|
o := defaultStaticOpts()
|
|
|
|
|
|
|
|
for i := range opts {
|
|
|
|
opts[i](o)
|
|
|
|
}
|
|
|
|
|
2020-07-24 13:54:03 +00:00
|
|
|
return &StaticClient{
|
2021-05-25 12:07:57 +00:00
|
|
|
tryNotary: o.tryNotary,
|
2020-07-24 13:54:03 +00:00
|
|
|
client: client,
|
|
|
|
scScriptHash: scriptHash,
|
|
|
|
fee: fee,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Invoke calls Invoke method of Client with static internal script hash and fee.
|
|
|
|
// Supported args types are the same as in Client.
|
2021-05-25 12:07:57 +00:00
|
|
|
//
|
|
|
|
// If TryNotary is provided, calls NotaryInvoke on Client.
|
2020-07-24 13:54:03 +00:00
|
|
|
func (s StaticClient) Invoke(method string, args ...interface{}) error {
|
2021-05-25 12:07:57 +00:00
|
|
|
if s.tryNotary {
|
|
|
|
return s.client.NotaryInvoke(s.scScriptHash, s.fee, method, args...)
|
|
|
|
}
|
|
|
|
|
2020-07-24 13:54:03 +00:00
|
|
|
return s.client.Invoke(
|
|
|
|
s.scScriptHash,
|
|
|
|
s.fee,
|
|
|
|
method,
|
|
|
|
args...,
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
// TestInvoke calls TestInvoke method of Client with static internal script hash.
|
2020-08-27 11:57:13 +00:00
|
|
|
func (s StaticClient) TestInvoke(method string, args ...interface{}) ([]stackitem.Item, error) {
|
2020-07-24 13:54:03 +00:00
|
|
|
return s.client.TestInvoke(
|
|
|
|
s.scScriptHash,
|
|
|
|
method,
|
|
|
|
args...,
|
|
|
|
)
|
|
|
|
}
|
2021-02-25 16:49:05 +00:00
|
|
|
|
|
|
|
// NotaryInvoke calls NotaryInvoke method of Client with static internal
|
2021-05-21 07:39:21 +00:00
|
|
|
// script hash. Panics if notary support was not enabled in underlying
|
2021-06-02 16:24:30 +00:00
|
|
|
// morph client.
|
2021-05-25 12:07:57 +00:00
|
|
|
//
|
|
|
|
// Deprecated: provide TryNotary() option to NewStatic and use Invoke.
|
2021-02-25 16:49:05 +00:00
|
|
|
func (s StaticClient) NotaryInvoke(method string, args ...interface{}) error {
|
2021-05-21 07:39:21 +00:00
|
|
|
if s.client.notary == nil {
|
|
|
|
panic(notaryNotEnabledPanicMsg)
|
|
|
|
}
|
|
|
|
return s.client.notaryInvoke(
|
|
|
|
false,
|
2021-02-25 16:49:05 +00:00
|
|
|
s.scScriptHash,
|
|
|
|
method,
|
|
|
|
args...,
|
|
|
|
)
|
|
|
|
}
|