Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: update dependency and support new api #80

Merged
merged 19 commits into from
Aug 18, 2023
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 3 additions & 14 deletions cmd/cmd_account.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,20 +118,9 @@ func getAccountBalance(ctx *cli.Context) error {
c, cancelCreateBucket := context.WithCancel(globalContext)
defer cancelCreateBucket()

var addr string
flagAddr := ctx.String(addressFlag)
if flagAddr != "" {
_, err = sdk.AccAddressFromHexUnsafe(flagAddr)
if err != nil {
return toCmdErr(err)
}
addr = flagAddr
} else {
acct, err := client.GetDefaultAccount()
if err != nil {
return toCmdErr(err)
}
addr = acct.GetAddress().String()
addr, err := getUserAddress(ctx)
if err != nil {
return err
}

resp, err := client.GetAccountBalance(c, addr)
Expand Down
294 changes: 265 additions & 29 deletions cmd/cmd_group.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
sdktypes "github.com/bnb-chain/greenfield-go-sdk/types"
"github.com/bnb-chain/greenfield/sdk/types"
storageTypes "github.com/bnb-chain/greenfield/x/storage/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/urfave/cli/v2"
)

Expand Down Expand Up @@ -86,19 +87,94 @@ Examples:
$ gnfd-cmd group renew --groupOwner 0x.. --renewMembers 0x.. --expireTime 1691569957 group-name`,
Flags: []cli.Flag{
&cli.StringFlag{
Name: renewMemberFlag,
Value: "",
Usage: "indicate the init member addr string list, input like addr1,addr2,addr3",
Name: renewMemberFlag,
Value: "",
Usage: "indicate the init member addr string list, input like addr1,addr2,addr3",
Required: true,
},
&cli.StringFlag{
Name: groupOwnerFlag,
Value: "",
Usage: "need set the owner address if you are not the owner of the group",
Name: groupOwnerFlag,
Value: "",
Usage: "need set the owner address if you are not the owner of the group",
Required: false,
},
&cli.Int64Flag{
Name: groupMemberExpireFlag,
Value: 0,
Usage: "set the expire timestamp for the addMember, it will apply to all the add members",
Name: groupMemberExpireFlag,
Value: 0,
Usage: "set the expire timestamp for the addMember, it will apply to all the add members",
Required: false,
},
},
}
}

// cmdListGroupMember is the command to list members info of the particular group.
func cmdListGroupMember() *cli.Command {
return &cli.Command{
Name: "ls-member",
Action: listGroupMember,
Usage: "list the members which contained within the group",
ArgsUsage: "GROUP-NAME",
Description: `
List the members of the specific group
You need also set group owner using --groupOwner if you are not the owner of the group.

Examples:
$ gnfd-cmd group ls-member group-name`,
Flags: []cli.Flag{
&cli.StringFlag{
Name: groupOwnerFlag,
Value: "",
Usage: "need set the owner address if you are not the owner of the group",
Required: false,
},
},
}
}

// cmdListGroup is the command to list members info of the particular group.
func cmdListGroup() *cli.Command {
return &cli.Command{
Name: "ls",
Action: listGroup,
Usage: "list groups owned by the specified user",
ArgsUsage: "GROUP-NAME",
Description: `
Returns a list of groups owned by the specified user,
You need also set group owner using --groupOwner if you are not the owner of the group.

Examples:
$ gnfd-cmd group --groupOwner ls`,
Flags: []cli.Flag{
&cli.StringFlag{
Name: groupOwnerFlag,
Value: "",
Usage: "need set the owner address if you are not the owner of the group",
Required: false,
},
},
}
}

// cmdListGroupBelong returns a list of all groups that the user has joined
func cmdListGroupBelong() *cli.Command {
return &cli.Command{
Name: "ls-belong",
Action: listBelongGroup,
Usage: "list groups which the specified user has joined",
ArgsUsage: "GROUP-NAME",
Description: `
Returns list of all groups that the account has joined
You need also set the account address using --address if you are not the account

Examples:
$ gnfd-cmd group --address ls-belong`,
Flags: []cli.Flag{
&cli.StringFlag{
Name: addressFlag,
Value: "",
Usage: "set the address of the group member",
Required: false,
},
},
}
Expand Down Expand Up @@ -216,18 +292,6 @@ func updateGroupMember(ctx *cli.Context) error {
return toCmdErr(err)
}

expireTimestamp := ctx.Int64(expireTimeFlag)
// set default expire timestamp
if expireTimestamp == 0 {
expireTimestamp = storageTypes.MaxTimeStamp.Unix()
}

addMemberNum := len(addGroupMembers)
expireTimeList := make([]time.Time, addMemberNum)
for i := 0; i < addMemberNum; i++ {
expireTimeList[i] = time.Unix(expireTimestamp, 0)
}

c, cancelUpdateGroup := context.WithCancel(globalContext)
defer cancelUpdateGroup()

Expand All @@ -236,9 +300,27 @@ func updateGroupMember(ctx *cli.Context) error {
return toCmdErr(ErrGroupNotExist)
}

txOpts := &types.TxOption{Mode: &SyncBroadcastMode}
txnHash, err := client.UpdateGroupMember(c, groupName, groupOwner, addGroupMembers, removeGroupMembers, expireTimeList,
sdktypes.UpdateGroupMemberOption{TxOpts: txOpts})
expireTimestamp := ctx.Int64(expireTimeFlag)

if expireTimestamp != 0 && expireTimestamp < time.Now().Unix() {
return toCmdErr(errors.New("expire stamp should be more than" + strconv.Itoa(int(time.Now().Unix()))))
}

var txnHash string
if expireTimestamp > 0 && len(addGroupMembers) > 0 {
addMemberNum := len(addGroupMembers)
expireTimeList := make([]*time.Time, addMemberNum)
for i := 0; i < addMemberNum; i++ {
t := time.Unix(expireTimestamp, 0)
expireTimeList[i] = &t
}
txnHash, err = client.UpdateGroupMember(c, groupName, groupOwner, addGroupMembers, removeGroupMembers,
sdktypes.UpdateGroupMemberOption{ExpirationTime: expireTimeList})
} else if expireTimestamp == 0 {
txnHash, err = client.UpdateGroupMember(c, groupName, groupOwner, addGroupMembers, removeGroupMembers,
sdktypes.UpdateGroupMemberOption{})
}

if err != nil {
return toCmdErr(err)
}
Expand All @@ -264,7 +346,6 @@ func renewGroupMember(ctx *cli.Context) error {
}

renewMembersInfo := ctx.String(renewMemberFlag)

if renewMembersInfo == "" {
return toCmdErr(errors.New("fail to get members to renew"))
}
Expand All @@ -284,12 +365,16 @@ func renewGroupMember(ctx *cli.Context) error {
expireTimestamp := ctx.Int64(expireTimeFlag)
if expireTimestamp < time.Now().Unix() {
return toCmdErr(errors.New("expire stamp should be more than" + strconv.Itoa(int(time.Now().Unix()))))
} else if expireTimestamp == 0 {
// set default expire timestamp
expireTimestamp = storageTypes.MaxTimeStamp.Unix()
}

memberNum := len(renewGroupMembers)
expireTimeList := make([]time.Time, memberNum)
expireTimeList := make([]*time.Time, memberNum)
for i := 0; i < memberNum; i++ {
expireTimeList[i] = time.Unix(expireTimestamp, 0)
t := time.Unix(expireTimestamp, 0)
expireTimeList[i] = &t
}

c, cancelUpdateGroup := context.WithCancel(globalContext)
Expand All @@ -300,8 +385,8 @@ func renewGroupMember(ctx *cli.Context) error {
return toCmdErr(ErrGroupNotExist)
}

txnHash, err := client.RenewGroupMember(c, groupOwner, groupName, renewGroupMembers, expireTimeList,
sdktypes.RenewGroupMemberOption{})
txnHash, err := client.RenewGroupMember(c, groupOwner, groupName, renewGroupMembers,
sdktypes.RenewGroupMemberOption{ExpirationTime: expireTimeList})
if err != nil {
return toCmdErr(err)
}
Expand All @@ -315,6 +400,157 @@ func renewGroupMember(ctx *cli.Context) error {
return nil
}

// listGroupMember returns a list of members contained within the group specified by the group id
// The user's expiration time has already elapsed will not be listed
func listGroupMember(ctx *cli.Context) error {
groupName, err := getGroupNameByUrl(ctx)
if err != nil {
return toCmdErr(err)
}

client, err := NewClient(ctx, false)
if err != nil {
return toCmdErr(err)
}

groupOwner, err := getGroupOwner(ctx)
if err != nil {
return toCmdErr(err)
}

c, cancelListGroup := context.WithCancel(globalContext)
defer cancelListGroup()

groupInfo, err := client.HeadGroup(c, groupName, groupOwner)
if err != nil {
return toCmdErr(ErrGroupNotExist)
}

initStartKey := ""
for {
memberList, err := client.ListGroupMembers(c, int64(groupInfo.Id.Uint64()),
sdktypes.GroupMembersPaginationOptions{Limit: maxListMemberNum, StartAfter: initStartKey})
if err != nil {
return toCmdErr(err)
}

printListMemberResult(memberList)
memberNum := len(memberList.Groups)
if memberNum != maxListMemberNum {
break
}

initStartKey = memberList.Groups[memberNum-1].AccountID
}

return nil
}

// listGroup returns a list of groups owned by the specified user
func listGroup(ctx *cli.Context) error {
client, err := NewClient(ctx, false)
if err != nil {
return toCmdErr(err)
}

var groupAccount string
addrFlag := ctx.String(addressFlag)
if addrFlag != "" {
_, err = sdk.AccAddressFromHexUnsafe(addrFlag)
if err != nil {
return toCmdErr(err)
}
groupAccount = addrFlag
} else {
acct, err := client.GetDefaultAccount()
if err != nil {
return toCmdErr(err)
}
groupAccount = acct.GetAddress().String()
}

c, cancelListGroup := context.WithCancel(globalContext)
defer cancelListGroup()

initStartKey := ""
for {
groupList, err := client.ListGroupsByOwner(c,
sdktypes.GroupsOwnerPaginationOptions{Limit: maxListMemberNum, Owner: groupAccount, StartAfter: initStartKey})
if err != nil {
return toCmdErr(err)
}

printListGroupResult(groupList)
memberNum := len(groupList.Groups)
if memberNum != maxListMemberNum {
break
}

initStartKey = groupList.Groups[memberNum-1].Group.Id.String()
}

return nil
}

// listBelongGroup returns a list of all groups that the user has joined
func listBelongGroup(ctx *cli.Context) error {
client, err := NewClient(ctx, false)
if err != nil {
return toCmdErr(err)
}

groupMemberAddr, err := getUserAddress(ctx)
if err != nil {
return err
}

c, cancelListGroup := context.WithCancel(globalContext)
defer cancelListGroup()

initStartKey := ""
for {
groupList, err := client.ListGroupsByAccount(c,
sdktypes.GroupsPaginationOptions{Limit: maxListMemberNum, Account: groupMemberAddr, StartAfter: initStartKey})
if err != nil {
return toCmdErr(err)
}

printListGroupResult(groupList)
memberNum := len(groupList.Groups)
if memberNum != maxListMemberNum {
break
}

initStartKey = groupList.Groups[memberNum-1].Group.Id.String()
}

return nil
}

func printListMemberResult(listResult *sdktypes.GroupMembersResult) {
for _, member := range listResult.Groups {
if member.Removed {
continue
}
location, _ := time.LoadLocation("Asia/Shanghai")
t := time.Unix(member.CreateTime, 0).In(location)

fmt.Printf("%s %45s \n", t.Format(iso8601DateFormat), member.AccountID)
}
}

func printListGroupResult(listResult *sdktypes.GroupsResult) {
for _, group := range listResult.Groups {
if group.Removed {
continue
}
location, _ := time.LoadLocation("Asia/Shanghai")
t := time.Unix(group.CreateTime, 0).In(location)

fmt.Printf("%s %30s id:%d\n", t.Format(iso8601DateFormat), group.Group.GroupName, group.Group.Id.Uint64())
}
}

func getGroupOwner(ctx *cli.Context) (string, error) {
groupOwnerAddrStr := ctx.String(groupOwnerFlag)

Expand Down
3 changes: 3 additions & 0 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,9 @@ func main() {
cmdDelGroup(),
cmdMirrorGroup(),
cmdRenewGroup(),
cmdListGroup(),
cmdListGroupMember(),
cmdListGroupBelong(),
},
},

Expand Down
Loading