OSDN Git Service

move BlockHeaderJSON type
[bytom/bytom.git] / api / accounts.go
index e4fbb32..a1bf521 100644 (file)
@@ -2,7 +2,7 @@ package api
 
 import (
        "context"
-       "strings"
+       "sort"
 
        log "github.com/sirupsen/logrus"
 
@@ -15,52 +15,36 @@ import (
 
 // POST /create-account
 func (a *API) createAccount(ctx context.Context, ins struct {
-       RootXPubs []chainkd.XPub         `json:"root_xpubs"`
-       Quorum    int                    `json:"quorum"`
-       Alias     string                 `json:"alias"`
-       Tags      map[string]interface{} `json:"tags"`
+       RootXPubs []chainkd.XPub `json:"root_xpubs"`
+       Quorum    int            `json:"quorum"`
+       Alias     string         `json:"alias"`
 }) Response {
-       acc, err := a.wallet.AccountMgr.Create(ctx, ins.RootXPubs, ins.Quorum, ins.Alias, ins.Tags)
-       if err != nil {
-               return NewErrorResponse(err)
-       }
-
-       annotatedAccount, err := account.Annotated(acc)
+       acc, err := a.wallet.AccountMgr.Create(ctx, ins.RootXPubs, ins.Quorum, ins.Alias)
        if err != nil {
                return NewErrorResponse(err)
        }
 
+       annotatedAccount := account.Annotated(acc)
        log.WithField("account ID", annotatedAccount.ID).Info("Created account")
 
        return NewSuccessResponse(annotatedAccount)
 }
 
-// POST /update-account-tags
-func (a *API) updateAccountTags(ctx context.Context, updateTag struct {
-       AccountInfo string                 `json:"account_info"`
-       Tags        map[string]interface{} `json:"tags"`
-}) Response {
-       err := a.wallet.AccountMgr.UpdateTags(nil, updateTag.AccountInfo, updateTag.Tags)
-       if err != nil {
-               return NewErrorResponse(err)
-       }
-
-       return NewSuccessResponse(nil)
+// AccountInfo is request struct for deleteAccount
+type AccountInfo struct {
+       Info string `json:"account_info"`
 }
 
-//
 // POST /delete-account
-func (a *API) deleteAccount(ctx context.Context, in struct {
-       AccountInfo string `json:"account_info"`
-}) Response {
-       if err := a.wallet.AccountMgr.DeleteAccount(in); err != nil {
+func (a *API) deleteAccount(ctx context.Context, in AccountInfo) Response {
+       if err := a.wallet.AccountMgr.DeleteAccount(in.Info); err != nil {
                return NewErrorResponse(err)
        }
        return NewSuccessResponse(nil)
 }
 
 type validateAddressResp struct {
-       Vaild   bool `json:"vaild"`
+       Valid   bool `json:"valid"`
        IsLocal bool `json:"is_local"`
 }
 
@@ -69,10 +53,10 @@ func (a *API) validateAddress(ctx context.Context, ins struct {
        Address string `json:"address"`
 }) Response {
        resp := &validateAddressResp{
-               Vaild:   false,
+               Valid:   false,
                IsLocal: false,
        }
-       address, err := common.DecodeAddress(ins.Address, &consensus.MainNetParams)
+       address, err := common.DecodeAddress(ins.Address, &consensus.ActiveNetParams)
        if err != nil {
                return NewSuccessResponse(resp)
        }
@@ -91,7 +75,7 @@ func (a *API) validateAddress(ctx context.Context, ins struct {
                return NewSuccessResponse(resp)
        }
 
-       resp.Vaild = true
+       resp.Valid = true
        resp.IsLocal = a.wallet.AccountMgr.IsLocalControlProgram(program)
        return NewSuccessResponse(resp)
 }
@@ -100,20 +84,35 @@ type addressResp struct {
        AccountAlias string `json:"account_alias"`
        AccountID    string `json:"account_id"`
        Address      string `json:"address"`
+       Change       bool   `json:"change"`
+       KeyIndex     uint64 `json:"-"`
 }
 
+// SortByIndex implements sort.Interface for addressResp slices
+type SortByIndex []addressResp
+
+func (a SortByIndex) Len() int           { return len(a) }
+func (a SortByIndex) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
+func (a SortByIndex) Less(i, j int) bool { return a[i].KeyIndex < a[j].KeyIndex }
+
 func (a *API) listAddresses(ctx context.Context, ins struct {
        AccountID    string `json:"account_id"`
        AccountAlias string `json:"account_alias"`
 }) Response {
        accountID := ins.AccountID
+       var target *account.Account
        if ins.AccountAlias != "" {
                acc, err := a.wallet.AccountMgr.FindByAlias(ctx, ins.AccountAlias)
                if err != nil {
                        return NewErrorResponse(err)
                }
-
-               accountID = acc.ID
+               target = acc
+       } else {
+               acc, err := a.wallet.AccountMgr.FindByID(ctx, accountID)
+               if err != nil {
+                       return NewErrorResponse(err)
+               }
+               target = acc
        }
 
        cps, err := a.wallet.AccountMgr.ListControlProgram()
@@ -121,14 +120,21 @@ func (a *API) listAddresses(ctx context.Context, ins struct {
                return NewErrorResponse(err)
        }
 
-       var addresses []*addressResp
+       addresses := []addressResp{}
        for _, cp := range cps {
-               if cp.Address == "" || (len(accountID) != 0 && strings.Compare(accountID, cp.AccountID) != 0) {
+               if cp.Address == "" || cp.AccountID != target.ID {
                        continue
                }
-
-               accountAlias := a.wallet.AccountMgr.GetAliasByID(cp.AccountID)
-               addresses = append(addresses, &addressResp{AccountAlias: accountAlias, AccountID: cp.AccountID, Address: cp.Address})
+               addresses = append(addresses, addressResp{
+                       AccountAlias: target.Alias,
+                       AccountID:    cp.AccountID,
+                       Address:      cp.Address,
+                       Change:       cp.Change,
+                       KeyIndex:     cp.KeyIndex,
+               })
        }
+
+       // sort AddressResp by KeyIndex
+       sort.Sort(SortByIndex(addresses))
        return NewSuccessResponse(addresses)
 }