Skip to content

Commit c2f9b67

Browse files
ququzonedustinxie
authored andcommitted
[ioctl] ioID setName (#4293)
* add set project name cmd * refactor code * refactor code
1 parent e58c7d9 commit c2f9b67

File tree

4 files changed

+124
-58
lines changed

4 files changed

+124
-58
lines changed

ioctl/cmd/ioid/ioid.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ func init() {
4343
IoIDCmd.AddCommand(_applyCmd)
4444
IoIDCmd.AddCommand(_projectCmd)
4545
IoIDCmd.AddCommand(_deviceCmd)
46+
IoIDCmd.AddCommand(_nameCmd)
4647
IoIDCmd.PersistentFlags().StringVar(&config.ReadConfig.Endpoint, "endpoint",
4748
config.ReadConfig.Endpoint, config.TranslateInLang(_flagInsEndPointUsages,
4849
config.UILanguage))

ioctl/cmd/ioid/name.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package ioid
2+
3+
import (
4+
"fmt"
5+
"math/big"
6+
7+
"github.com/iotexproject/iotex-address/address"
8+
"github.com/spf13/cobra"
9+
10+
"github.com/iotexproject/iotex-core/ioctl/cmd/ws"
11+
"github.com/iotexproject/iotex-core/ioctl/config"
12+
"github.com/iotexproject/iotex-core/ioctl/output"
13+
)
14+
15+
// Multi-language support
16+
var (
17+
_nameUsages = map[config.Language]string{
18+
config.English: "name [PROJECT_NAME]",
19+
config.Chinese: "name [项目名称]",
20+
}
21+
_nameShorts = map[config.Language]string{
22+
config.English: "Set project name",
23+
config.Chinese: "设置项目名称",
24+
}
25+
)
26+
27+
// _nameCmd represents the ioID project name command
28+
var _nameCmd = &cobra.Command{
29+
Use: config.TranslateInLang(_nameUsages, config.UILanguage),
30+
Short: config.TranslateInLang(_nameShorts, config.UILanguage),
31+
Args: cobra.MinimumNArgs(1),
32+
RunE: func(cmd *cobra.Command, args []string) error {
33+
err := setName(args)
34+
return output.PrintError(err)
35+
},
36+
}
37+
38+
func init() {
39+
_nameCmd.Flags().StringVarP(
40+
&ioIDStore, "ioIDStore", "i",
41+
"0xA0C9f9A884cdAE649a42F16b057735Bc4fE786CD",
42+
config.TranslateInLang(_ioIDStoreUsages, config.UILanguage),
43+
)
44+
_nameCmd.Flags().Uint64VarP(
45+
&projectId, "projectId", "p", 0,
46+
config.TranslateInLang(_projectIdUsages, config.UILanguage),
47+
)
48+
}
49+
50+
func setName(args []string) error {
51+
name := args[0]
52+
53+
ioioIDStore, err := address.FromHex(ioIDStore)
54+
if err != nil {
55+
return output.NewError(output.AddressError, "failed to convert ioIDStore address", err)
56+
}
57+
58+
projectAddr, err := readContract(ioioIDStore, ioIDStoreABI, "project", "0")
59+
if err != nil {
60+
return output.NewError(output.ConvertError, "failed to read project", err)
61+
}
62+
63+
caller, err := ws.NewContractCaller(projectABI, projectAddr[0].(address.Address).String())
64+
if err != nil {
65+
return output.NewError(output.SerializationError, "failed to create contract caller", err)
66+
}
67+
68+
tx, err := caller.CallAndRetrieveResult("setName", []any{
69+
new(big.Int).SetUint64(projectId),
70+
name,
71+
})
72+
if err != nil {
73+
return output.NewError(output.SerializationError, "failed to call contract", err)
74+
}
75+
76+
fmt.Printf("Set project name txHash: %s\n", tx)
77+
78+
return nil
79+
}

ioctl/cmd/ioid/project.go

Lines changed: 15 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,13 @@ package ioid
33
import (
44
"bytes"
55
_ "embed" // used to embed contract abi
6-
"encoding/hex"
76
"fmt"
87
"math/big"
98

109
"github.com/ethereum/go-ethereum/accounts/abi"
1110
"github.com/iotexproject/iotex-address/address"
1211
"github.com/spf13/cobra"
1312

14-
"github.com/iotexproject/iotex-core/ioctl/cmd/action"
1513
"github.com/iotexproject/iotex-core/ioctl/config"
1614
"github.com/iotexproject/iotex-core/ioctl/output"
1715
)
@@ -67,81 +65,39 @@ func project() error {
6765
return output.NewError(output.AddressError, "failed to convert ioIDStore address", err)
6866
}
6967

70-
data, err := ioIDStoreABI.Pack("project")
68+
projectAddr, err := readContract(ioioIDStore, ioIDStoreABI, "project", "0")
7169
if err != nil {
72-
return output.NewError(output.ConvertError, "failed to pack project arguments", err)
73-
}
74-
res, err := action.Read(ioioIDStore, "0", data)
75-
if err != nil {
76-
return output.NewError(output.APIError, "failed to read contract", err)
77-
}
78-
data, _ = hex.DecodeString(res)
79-
projectAddr, err := ioIDStoreABI.Unpack("project", data)
80-
if err != nil {
81-
return output.NewError(output.ConvertError, "failed to unpack project response", err)
70+
return output.NewError(output.ConvertError, "failed to read project", err)
8271
}
8372

8473
ioProjectAddr, _ := address.FromHex(projectAddr[0].(address.Address).String())
85-
data, err = projectABI.Pack("name", new(big.Int).SetUint64(projectId))
86-
if err != nil {
87-
return output.NewError(output.ConvertError, "failed to pack project name arguments", err)
88-
}
89-
res, err = action.Read(ioProjectAddr, "0", data)
90-
if err != nil {
91-
return output.NewError(output.APIError, "failed to read contract", err)
92-
}
93-
data, _ = hex.DecodeString(res)
94-
name, err := projectABI.Unpack("name", data)
95-
if err != nil {
96-
return output.NewError(output.ConvertError, "failed to unpack project name response", err)
97-
}
98-
99-
data, err = ioIDStoreABI.Pack("projectDeviceContract", new(big.Int).SetUint64(projectId))
100-
if err != nil {
101-
return output.NewError(output.ConvertError, "failed to pack project device contract arguments", err)
102-
}
103-
res, err = action.Read(ioioIDStore, "0", data)
104-
if err != nil {
105-
return output.NewError(output.APIError, "failed to read contract", err)
106-
}
107-
data, _ = hex.DecodeString(res)
108-
deviceContractAddr, err := ioIDStoreABI.Unpack("projectDeviceContract", data)
109-
if err != nil {
110-
return output.NewError(output.ConvertError, "failed to unpack project device contract response", err)
111-
}
112-
113-
data, err = ioIDStoreABI.Pack("projectAppliedAmount", new(big.Int).SetUint64(projectId))
114-
if err != nil {
115-
return output.NewError(output.ConvertError, "failed to pack project applied amount arguments", err)
116-
}
117-
res, err = action.Read(ioioIDStore, "0", data)
74+
name, err := readContract(ioProjectAddr, projectABI, "name", "0", new(big.Int).SetUint64(projectId))
11875
if err != nil {
119-
return output.NewError(output.APIError, "failed to read contract", err)
76+
return output.NewError(output.ConvertError, "failed to read project name", err)
12077
}
121-
data, _ = hex.DecodeString(res)
122-
projectAppliedAmount, err := ioIDStoreABI.Unpack("projectAppliedAmount", data)
78+
owner, err := readContract(ioProjectAddr, projectABI, "ownerOf", "0", new(big.Int).SetUint64(projectId))
12379
if err != nil {
124-
return output.NewError(output.ConvertError, "failed to unpack project applied amount response", err)
80+
return output.NewError(output.ConvertError, "failed to read project owner", err)
12581
}
12682

127-
data, err = ioIDStoreABI.Pack("projectActivedAmount", new(big.Int).SetUint64(projectId))
83+
deviceContractAddr, err := readContract(ioioIDStore, ioIDStoreABI, "projectDeviceContract", "0", new(big.Int).SetUint64(projectId))
12884
if err != nil {
129-
return output.NewError(output.ConvertError, "failed to pack project actived amount arguments", err)
85+
return output.NewError(output.ConvertError, "failed to read project device contract", err)
13086
}
131-
res, err = action.Read(ioioIDStore, "0", data)
87+
projectAppliedAmount, err := readContract(ioioIDStore, ioIDStoreABI, "projectAppliedAmount", "0", new(big.Int).SetUint64(projectId))
13288
if err != nil {
133-
return output.NewError(output.APIError, "failed to read contract", err)
89+
return output.NewError(output.ConvertError, "failed to read project device applied amount", err)
13490
}
135-
data, _ = hex.DecodeString(res)
136-
projectActivedAmount, err := ioIDStoreABI.Unpack("projectActivedAmount", data)
91+
projectActivedAmount, err := readContract(ioioIDStore, ioIDStoreABI, "projectActivedAmount", "0", new(big.Int).SetUint64(projectId))
13792
if err != nil {
138-
return output.NewError(output.ConvertError, "failed to unpack project actived amount response", err)
93+
return output.NewError(output.ConvertError, "failed to read project actived amount", err)
13994
}
14095

14196
fmt.Printf(`Project #%d detail:
14297
{
143-
"projectContractAddress": "%s",
98+
"projectContract": "%s",
14499
"name": "%s",
100+
"owner": "%s",
145101
"deviceNFT": "%s",
146102
"appliedIoIDs": "%s",
147103
"activedIoIDs": "%s",
@@ -150,6 +106,7 @@ func project() error {
150106
projectId,
151107
projectAddr[0].(address.Address).String(),
152108
name[0].(string),
109+
owner[0].(address.Address).String(),
153110
deviceContractAddr[0].(address.Address).String(),
154111
projectAppliedAmount[0].(*big.Int).String(),
155112
projectActivedAmount[0].(*big.Int).String(),

ioctl/cmd/ioid/utils.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package ioid
2+
3+
import (
4+
"encoding/hex"
5+
6+
"github.com/ethereum/go-ethereum/accounts/abi"
7+
"github.com/iotexproject/iotex-address/address"
8+
9+
"github.com/iotexproject/iotex-core/ioctl/cmd/action"
10+
)
11+
12+
func readContract(
13+
contract address.Address,
14+
contractABI abi.ABI,
15+
method string,
16+
value string,
17+
args ...interface{},
18+
) ([]interface{}, error) {
19+
data, err := contractABI.Pack(method, args...)
20+
if err != nil {
21+
return nil, err
22+
}
23+
res, err := action.Read(contract, value, data)
24+
if err != nil {
25+
return nil, err
26+
}
27+
data, _ = hex.DecodeString(res)
28+
return contractABI.Unpack(method, data)
29+
}

0 commit comments

Comments
 (0)