package util import ( "errors" "fmt" "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client/netmap" "github.com/nspcc-dev/neo-go/pkg/io" "github.com/nspcc-dev/neo-go/pkg/rpcclient/unwrap" "github.com/nspcc-dev/neo-go/pkg/smartcontract/callflag" "github.com/nspcc-dev/neo-go/pkg/util" "github.com/nspcc-dev/neo-go/pkg/vm/emit" "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" "github.com/spf13/viper" ) func GetDefaultNetmapContractConfigMap() map[string]any { m := make(map[string]any) m[netmap.EpochDurationConfig] = viper.GetInt64(EpochDurationInitFlag) m[netmap.MaxObjectSizeConfig] = viper.GetInt64(MaxObjectSizeInitFlag) m[netmap.ContainerFeeConfig] = viper.GetInt64(ContainerFeeInitFlag) m[netmap.ContainerAliasFeeConfig] = viper.GetInt64(ContainerAliasFeeInitFlag) m[netmap.IrCandidateFeeConfig] = viper.GetInt64(CandidateFeeInitFlag) m[netmap.WithdrawFeeConfig] = viper.GetInt64(WithdrawFeeInitFlag) m[netmap.HomomorphicHashingDisabledKey] = viper.GetBool(HomomorphicHashDisabledInitFlag) m[netmap.MaintenanceModeAllowedConfig] = viper.GetBool(MaintenanceModeAllowedInitFlag) return m } func ParseConfigFromNetmapContract(arr []stackitem.Item) (map[string][]byte, error) { m := make(map[string][]byte, len(arr)) for _, param := range arr { tuple, ok := param.Value().([]stackitem.Item) if !ok || len(tuple) != 2 { return nil, errors.New("invalid ListConfig response from netmap contract") } k, err := tuple[0].TryBytes() if err != nil { return nil, errors.New("invalid config key from netmap contract") } v, err := tuple[1].TryBytes() if err != nil { return nil, InvalidConfigValueErr(string(k)) } m[string(k)] = v } return m, nil } func InvalidConfigValueErr(key string) error { return fmt.Errorf("invalid %s config value from netmap contract", key) } func EmitNewEpochCall(bw *io.BufBinWriter, wCtx *InitializeContext, nmHash util.Uint160) error { curr, err := unwrap.Int64(wCtx.ReadOnlyInvoker.Call(nmHash, "epoch")) if err != nil { return errors.New("can't fetch current epoch from the netmap contract") } newEpoch := curr + 1 wCtx.Command.Printf("Current epoch: %d, increase to %d.\n", curr, newEpoch) // In NeoFS this is done via Notary contract. Here, however, we can form the // transaction locally. emit.AppCall(bw.BinWriter, nmHash, "newEpoch", callflag.All, newEpoch) return bw.Err }