From c2f9b676a06f87e7a3bfc2d9bddf0fdecc94347c Mon Sep 17 00:00:00 2001 From: Xueping Yang Date: Thu, 6 Jun 2024 23:58:45 +0800 Subject: [PATCH] [ioctl] ioID setName (#4293) * add set project name cmd * refactor code * refactor code --- ioctl/cmd/ioid/ioid.go | 1 + ioctl/cmd/ioid/name.go | 79 +++++++++++++++++++++++++++++++++++++++ ioctl/cmd/ioid/project.go | 73 ++++++++---------------------------- ioctl/cmd/ioid/utils.go | 29 ++++++++++++++ 4 files changed, 124 insertions(+), 58 deletions(-) create mode 100644 ioctl/cmd/ioid/name.go create mode 100644 ioctl/cmd/ioid/utils.go diff --git a/ioctl/cmd/ioid/ioid.go b/ioctl/cmd/ioid/ioid.go index 97c922e9d6..0746414af3 100644 --- a/ioctl/cmd/ioid/ioid.go +++ b/ioctl/cmd/ioid/ioid.go @@ -43,6 +43,7 @@ func init() { IoIDCmd.AddCommand(_applyCmd) IoIDCmd.AddCommand(_projectCmd) IoIDCmd.AddCommand(_deviceCmd) + IoIDCmd.AddCommand(_nameCmd) IoIDCmd.PersistentFlags().StringVar(&config.ReadConfig.Endpoint, "endpoint", config.ReadConfig.Endpoint, config.TranslateInLang(_flagInsEndPointUsages, config.UILanguage)) diff --git a/ioctl/cmd/ioid/name.go b/ioctl/cmd/ioid/name.go new file mode 100644 index 0000000000..5e5938baa3 --- /dev/null +++ b/ioctl/cmd/ioid/name.go @@ -0,0 +1,79 @@ +package ioid + +import ( + "fmt" + "math/big" + + "github.com/iotexproject/iotex-address/address" + "github.com/spf13/cobra" + + "github.com/iotexproject/iotex-core/ioctl/cmd/ws" + "github.com/iotexproject/iotex-core/ioctl/config" + "github.com/iotexproject/iotex-core/ioctl/output" +) + +// Multi-language support +var ( + _nameUsages = map[config.Language]string{ + config.English: "name [PROJECT_NAME]", + config.Chinese: "name [项目名称]", + } + _nameShorts = map[config.Language]string{ + config.English: "Set project name", + config.Chinese: "设置项目名称", + } +) + +// _nameCmd represents the ioID project name command +var _nameCmd = &cobra.Command{ + Use: config.TranslateInLang(_nameUsages, config.UILanguage), + Short: config.TranslateInLang(_nameShorts, config.UILanguage), + Args: cobra.MinimumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + err := setName(args) + return output.PrintError(err) + }, +} + +func init() { + _nameCmd.Flags().StringVarP( + &ioIDStore, "ioIDStore", "i", + "0xA0C9f9A884cdAE649a42F16b057735Bc4fE786CD", + config.TranslateInLang(_ioIDStoreUsages, config.UILanguage), + ) + _nameCmd.Flags().Uint64VarP( + &projectId, "projectId", "p", 0, + config.TranslateInLang(_projectIdUsages, config.UILanguage), + ) +} + +func setName(args []string) error { + name := args[0] + + ioioIDStore, err := address.FromHex(ioIDStore) + if err != nil { + return output.NewError(output.AddressError, "failed to convert ioIDStore address", err) + } + + projectAddr, err := readContract(ioioIDStore, ioIDStoreABI, "project", "0") + if err != nil { + return output.NewError(output.ConvertError, "failed to read project", err) + } + + caller, err := ws.NewContractCaller(projectABI, projectAddr[0].(address.Address).String()) + if err != nil { + return output.NewError(output.SerializationError, "failed to create contract caller", err) + } + + tx, err := caller.CallAndRetrieveResult("setName", []any{ + new(big.Int).SetUint64(projectId), + name, + }) + if err != nil { + return output.NewError(output.SerializationError, "failed to call contract", err) + } + + fmt.Printf("Set project name txHash: %s\n", tx) + + return nil +} diff --git a/ioctl/cmd/ioid/project.go b/ioctl/cmd/ioid/project.go index bf5d87259b..094eda7774 100644 --- a/ioctl/cmd/ioid/project.go +++ b/ioctl/cmd/ioid/project.go @@ -3,7 +3,6 @@ package ioid import ( "bytes" _ "embed" // used to embed contract abi - "encoding/hex" "fmt" "math/big" @@ -11,7 +10,6 @@ import ( "github.com/iotexproject/iotex-address/address" "github.com/spf13/cobra" - "github.com/iotexproject/iotex-core/ioctl/cmd/action" "github.com/iotexproject/iotex-core/ioctl/config" "github.com/iotexproject/iotex-core/ioctl/output" ) @@ -67,81 +65,39 @@ func project() error { return output.NewError(output.AddressError, "failed to convert ioIDStore address", err) } - data, err := ioIDStoreABI.Pack("project") + projectAddr, err := readContract(ioioIDStore, ioIDStoreABI, "project", "0") if err != nil { - return output.NewError(output.ConvertError, "failed to pack project arguments", err) - } - res, err := action.Read(ioioIDStore, "0", data) - if err != nil { - return output.NewError(output.APIError, "failed to read contract", err) - } - data, _ = hex.DecodeString(res) - projectAddr, err := ioIDStoreABI.Unpack("project", data) - if err != nil { - return output.NewError(output.ConvertError, "failed to unpack project response", err) + return output.NewError(output.ConvertError, "failed to read project", err) } ioProjectAddr, _ := address.FromHex(projectAddr[0].(address.Address).String()) - data, err = projectABI.Pack("name", new(big.Int).SetUint64(projectId)) - if err != nil { - return output.NewError(output.ConvertError, "failed to pack project name arguments", err) - } - res, err = action.Read(ioProjectAddr, "0", data) - if err != nil { - return output.NewError(output.APIError, "failed to read contract", err) - } - data, _ = hex.DecodeString(res) - name, err := projectABI.Unpack("name", data) - if err != nil { - return output.NewError(output.ConvertError, "failed to unpack project name response", err) - } - - data, err = ioIDStoreABI.Pack("projectDeviceContract", new(big.Int).SetUint64(projectId)) - if err != nil { - return output.NewError(output.ConvertError, "failed to pack project device contract arguments", err) - } - res, err = action.Read(ioioIDStore, "0", data) - if err != nil { - return output.NewError(output.APIError, "failed to read contract", err) - } - data, _ = hex.DecodeString(res) - deviceContractAddr, err := ioIDStoreABI.Unpack("projectDeviceContract", data) - if err != nil { - return output.NewError(output.ConvertError, "failed to unpack project device contract response", err) - } - - data, err = ioIDStoreABI.Pack("projectAppliedAmount", new(big.Int).SetUint64(projectId)) - if err != nil { - return output.NewError(output.ConvertError, "failed to pack project applied amount arguments", err) - } - res, err = action.Read(ioioIDStore, "0", data) + name, err := readContract(ioProjectAddr, projectABI, "name", "0", new(big.Int).SetUint64(projectId)) if err != nil { - return output.NewError(output.APIError, "failed to read contract", err) + return output.NewError(output.ConvertError, "failed to read project name", err) } - data, _ = hex.DecodeString(res) - projectAppliedAmount, err := ioIDStoreABI.Unpack("projectAppliedAmount", data) + owner, err := readContract(ioProjectAddr, projectABI, "ownerOf", "0", new(big.Int).SetUint64(projectId)) if err != nil { - return output.NewError(output.ConvertError, "failed to unpack project applied amount response", err) + return output.NewError(output.ConvertError, "failed to read project owner", err) } - data, err = ioIDStoreABI.Pack("projectActivedAmount", new(big.Int).SetUint64(projectId)) + deviceContractAddr, err := readContract(ioioIDStore, ioIDStoreABI, "projectDeviceContract", "0", new(big.Int).SetUint64(projectId)) if err != nil { - return output.NewError(output.ConvertError, "failed to pack project actived amount arguments", err) + return output.NewError(output.ConvertError, "failed to read project device contract", err) } - res, err = action.Read(ioioIDStore, "0", data) + projectAppliedAmount, err := readContract(ioioIDStore, ioIDStoreABI, "projectAppliedAmount", "0", new(big.Int).SetUint64(projectId)) if err != nil { - return output.NewError(output.APIError, "failed to read contract", err) + return output.NewError(output.ConvertError, "failed to read project device applied amount", err) } - data, _ = hex.DecodeString(res) - projectActivedAmount, err := ioIDStoreABI.Unpack("projectActivedAmount", data) + projectActivedAmount, err := readContract(ioioIDStore, ioIDStoreABI, "projectActivedAmount", "0", new(big.Int).SetUint64(projectId)) if err != nil { - return output.NewError(output.ConvertError, "failed to unpack project actived amount response", err) + return output.NewError(output.ConvertError, "failed to read project actived amount", err) } fmt.Printf(`Project #%d detail: { - "projectContractAddress": "%s", + "projectContract": "%s", "name": "%s", + "owner": "%s", "deviceNFT": "%s", "appliedIoIDs": "%s", "activedIoIDs": "%s", @@ -150,6 +106,7 @@ func project() error { projectId, projectAddr[0].(address.Address).String(), name[0].(string), + owner[0].(address.Address).String(), deviceContractAddr[0].(address.Address).String(), projectAppliedAmount[0].(*big.Int).String(), projectActivedAmount[0].(*big.Int).String(), diff --git a/ioctl/cmd/ioid/utils.go b/ioctl/cmd/ioid/utils.go new file mode 100644 index 0000000000..9286d1db09 --- /dev/null +++ b/ioctl/cmd/ioid/utils.go @@ -0,0 +1,29 @@ +package ioid + +import ( + "encoding/hex" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/iotexproject/iotex-address/address" + + "github.com/iotexproject/iotex-core/ioctl/cmd/action" +) + +func readContract( + contract address.Address, + contractABI abi.ABI, + method string, + value string, + args ...interface{}, +) ([]interface{}, error) { + data, err := contractABI.Pack(method, args...) + if err != nil { + return nil, err + } + res, err := action.Read(contract, value, data) + if err != nil { + return nil, err + } + data, _ = hex.DecodeString(res) + return contractABI.Unpack(method, data) +}