forked from TrueCloudLab/frostfs-node
dadfd90dcd
Initial public review release v0.10.0
141 lines
3.9 KiB
Go
141 lines
3.9 KiB
Go
package implementations
|
|
|
|
import (
|
|
"github.com/nspcc-dev/neo-go/pkg/encoding/address"
|
|
"github.com/nspcc-dev/neofs-api-go/refs"
|
|
"github.com/nspcc-dev/neofs-node/lib/blockchain/goclient"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// MorphBalanceContract is a wrapper over NeoFS Balance contract client
|
|
// that provides an interface of manipulations with user funds.
|
|
type MorphBalanceContract struct {
|
|
// NeoFS Balance smart-contract
|
|
balanceContract StaticContractClient
|
|
|
|
// "balance of" method name of balance contract
|
|
balanceOfMethodName string
|
|
|
|
// decimals method name of balance contract
|
|
decimalsMethodName string
|
|
}
|
|
|
|
// BalanceOfParams is a structure that groups the parameters
|
|
// for NeoFS user balance receiving operation.
|
|
type BalanceOfParams struct {
|
|
owner refs.OwnerID
|
|
}
|
|
|
|
// BalanceOfResult is a structure that groups the values
|
|
// of the result of NeoFS user balance receiving operation.
|
|
type BalanceOfResult struct {
|
|
amount int64
|
|
}
|
|
|
|
// DecimalsParams is a structure that groups the parameters
|
|
// for NeoFS token decimals receiving operation.
|
|
type DecimalsParams struct {
|
|
}
|
|
|
|
// DecimalsResult is a structure that groups the values
|
|
// of the result of NeoFS token decimals receiving operation.
|
|
type DecimalsResult struct {
|
|
dec int64
|
|
}
|
|
|
|
// SetBalanceContractClient is a Balance contract client setter.
|
|
func (s *MorphBalanceContract) SetBalanceContractClient(v StaticContractClient) {
|
|
s.balanceContract = v
|
|
}
|
|
|
|
// SetBalanceOfMethodName is a Balance contract balanceOf method name setter.
|
|
func (s *MorphBalanceContract) SetBalanceOfMethodName(v string) {
|
|
s.balanceOfMethodName = v
|
|
}
|
|
|
|
// SetDecimalsMethodName is a Balance contract decimals method name setter.
|
|
func (s *MorphBalanceContract) SetDecimalsMethodName(v string) {
|
|
s.decimalsMethodName = v
|
|
}
|
|
|
|
// BalanceOf performs the test invocation call of balanceOf method of NeoFS Balance contract.
|
|
func (s MorphBalanceContract) BalanceOf(p BalanceOfParams) (*BalanceOfResult, error) {
|
|
owner := p.OwnerID()
|
|
|
|
u160, err := address.StringToUint160(owner.String())
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "could not convert wallet address to Uint160")
|
|
}
|
|
|
|
prms, err := s.balanceContract.TestInvoke(
|
|
s.balanceOfMethodName,
|
|
u160.BytesBE(),
|
|
)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "could not perform test invocation")
|
|
} else if ln := len(prms); ln != 1 {
|
|
return nil, errors.Errorf("unexpected stack item count (balanceOf): %d", ln)
|
|
}
|
|
|
|
amount, err := goclient.IntFromStackParameter(prms[0])
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "could not get integer stack item from stack item (amount)")
|
|
}
|
|
|
|
res := new(BalanceOfResult)
|
|
res.SetAmount(amount)
|
|
|
|
return res, nil
|
|
}
|
|
|
|
// Decimals performs the test invocation call of decimals method of NeoFS Balance contract.
|
|
func (s MorphBalanceContract) Decimals(DecimalsParams) (*DecimalsResult, error) {
|
|
prms, err := s.balanceContract.TestInvoke(
|
|
s.decimalsMethodName,
|
|
)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "could not perform test invocation")
|
|
} else if ln := len(prms); ln != 1 {
|
|
return nil, errors.Errorf("unexpected stack item count (decimals): %d", ln)
|
|
}
|
|
|
|
dec, err := goclient.IntFromStackParameter(prms[0])
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "could not get integer stack item from stack item (decimal)")
|
|
}
|
|
|
|
res := new(DecimalsResult)
|
|
res.SetDecimals(dec)
|
|
|
|
return res, nil
|
|
}
|
|
|
|
// SetOwnerID is an owner ID setter.
|
|
func (s *BalanceOfParams) SetOwnerID(v refs.OwnerID) {
|
|
s.owner = v
|
|
}
|
|
|
|
// OwnerID is an owner ID getter.
|
|
func (s BalanceOfParams) OwnerID() refs.OwnerID {
|
|
return s.owner
|
|
}
|
|
|
|
// SetAmount is an funds amount setter.
|
|
func (s *BalanceOfResult) SetAmount(v int64) {
|
|
s.amount = v
|
|
}
|
|
|
|
// Amount is an funds amount getter.
|
|
func (s BalanceOfResult) Amount() int64 {
|
|
return s.amount
|
|
}
|
|
|
|
// SetDecimals is a decimals setter.
|
|
func (s *DecimalsResult) SetDecimals(v int64) {
|
|
s.dec = v
|
|
}
|
|
|
|
// Decimals is a decimals getter.
|
|
func (s DecimalsResult) Decimals() int64 {
|
|
return s.dec
|
|
}
|