frostfs-node/pkg/morph/client/nns.go

63 lines
1.9 KiB
Go

package client
import (
"fmt"
"strconv"
nns "github.com/nspcc-dev/neo-go/examples/nft-nd-nns"
"github.com/nspcc-dev/neo-go/pkg/util"
)
const (
nnsContractID = 1 // NNS contract must be deployed first in side chain
// NNSAuditContractName is a name of the audit contract in NNS.
NNSAuditContractName = "audit.neofs"
// NNSBalanceContractName is a name of the balance contract in NNS.
NNSBalanceContractName = "balance.neofs"
// NNSContainerContractName is a name of the container contract in NNS.
NNSContainerContractName = "container.neofs"
// NNSNeoFSIDContractName is a name of the neofsid contract in NNS.
NNSNeoFSIDContractName = "neofsid.neofs"
// NNSNetmapContractName is a name of the netmap contract in NNS.
NNSNetmapContractName = "netmap.neofs"
// NNSProxyContractName is a name of the proxy contract in NNS.
NNSProxyContractName = "proxy.neofs"
// NNSReputationContractName is a name of the reputation contract in NNS.
NNSReputationContractName = "reputation.neofs"
)
// NNSAlphabetContractName returns contract name of the alphabet contract in NNS
// based on alphabet index.
func NNSAlphabetContractName(index int) string {
return "alphabet" + strconv.Itoa(index) + ".neofs"
}
// NNSContractAddress returns contract address script hash based on its name
// in NNS contract.
func (c *Client) NNSContractAddress(name string) (sh util.Uint160, err error) {
if c.multiClient != nil {
return sh, c.multiClient.iterateClients(func(c *Client) error {
sh, err = c.NNSContractAddress(name)
return err
})
}
cs, err := c.client.GetContractStateByID(nnsContractID) // cache it?
if err != nil {
return sh, fmt.Errorf("NNS contract state: %w", err)
}
s, err := c.client.NNSResolve(cs.Hash, name, nns.TXT)
if err != nil {
return sh, fmt.Errorf("NNS.resolve: %w", err)
}
sh, err = util.Uint160DecodeStringLE(s)
if err != nil {
return sh, fmt.Errorf("NNS u160 decode: %w", err)
}
return sh, nil
}