8 log "github.com/sirupsen/logrus"
10 "github.com/bytom/blockchain/account"
11 "github.com/bytom/blockchain/query"
14 // POST /list-accounts
15 func (bcr *BlockchainReactor) listAccounts(ctx context.Context, filter struct {
18 accounts, err := bcr.accounts.ListAccounts(filter.ID)
20 log.Errorf("listAccounts: %v", err)
21 return NewErrorResponse(err)
24 return NewSuccessResponse(accounts)
28 func (bcr *BlockchainReactor) listAssets(ctx context.Context, filter struct {
31 assets, err := bcr.assets.ListAssets(filter.ID)
33 log.Errorf("listAssets: %v", err)
34 return NewErrorResponse(err)
37 return NewSuccessResponse(assets)
41 func (bcr *BlockchainReactor) listBalances(ctx context.Context) Response {
42 accountUTXOs, err := bcr.wallet.GetAccountUTXOs("")
44 log.Errorf("GetAccountUTXOs: %v", err)
45 return NewErrorResponse(err)
48 return NewSuccessResponse(bcr.indexBalances(accountUTXOs))
51 type accountBalance struct {
52 AccountID string `json:"account_id"`
53 Alias string `json:"account_alias"`
54 AssetAlias string `json:"asset_alias"`
55 AssetID string `json:"asset_id"`
56 Amount uint64 `json:"amount"`
59 func (bcr *BlockchainReactor) indexBalances(accountUTXOs []account.UTXO) []accountBalance {
60 accBalance := make(map[string]map[string]uint64)
61 balances := make([]accountBalance, 0)
62 tmpBalance := accountBalance{}
64 for _, accountUTXO := range accountUTXOs {
66 assetID := accountUTXO.AssetID.String()
67 if _, ok := accBalance[accountUTXO.AccountID]; ok {
68 if _, ok := accBalance[accountUTXO.AccountID][assetID]; ok {
69 accBalance[accountUTXO.AccountID][assetID] += accountUTXO.Amount
71 accBalance[accountUTXO.AccountID][assetID] = accountUTXO.Amount
74 accBalance[accountUTXO.AccountID] = map[string]uint64{assetID: accountUTXO.Amount}
78 sortedAccount := []string{}
79 for k := range accBalance {
80 sortedAccount = append(sortedAccount, k)
82 sort.Strings(sortedAccount)
84 for _, id := range sortedAccount {
85 sortedAsset := []string{}
86 for k := range accBalance[id] {
87 sortedAsset = append(sortedAsset, k)
89 sort.Strings(sortedAsset)
91 for _, assetID := range sortedAsset {
93 alias := bcr.accounts.GetAliasByID(id)
94 assetAlias := bcr.assets.GetAliasByID(assetID)
95 tmpBalance.Alias = alias
96 tmpBalance.AccountID = id
97 tmpBalance.AssetID = assetID
98 tmpBalance.AssetAlias = assetAlias
99 tmpBalance.Amount = accBalance[id][assetID]
100 balances = append(balances, tmpBalance)
107 // POST /list-transactions
108 func (bcr *BlockchainReactor) listTransactions(ctx context.Context, filter struct {
109 ID string `json:"id"`
110 AccountID string `json:"account_id"`
111 Detail bool `json:"detail"`
113 var transactions []*query.AnnotatedTx
116 if filter.AccountID != "" {
117 transactions, err = bcr.wallet.GetTransactionsByAccountID(filter.AccountID)
119 transactions, err = bcr.wallet.GetTransactionsByTxID(filter.ID)
123 log.Errorf("listTransactions: %v", err)
124 return NewErrorResponse(err)
127 if filter.Detail == false {
128 txSummary := bcr.wallet.GetTransactionsSummary(transactions)
129 return NewSuccessResponse(txSummary)
131 return NewSuccessResponse(transactions)
134 type annotatedUTXO struct {
135 Alias string `json:"account_alias"`
136 OutputID string `json:"id"`
137 AssetID string `json:"asset_id"`
138 AssetAlias string `json:"asset_alias"`
139 Amount uint64 `json:"amount"`
140 AccountID string `json:"account_id"`
141 Address string `json:"address"`
142 ControlProgramIndex uint64 `json:"control_program_index"`
143 Program string `json:"program"`
144 SourceID string `json:"source_id"`
145 SourcePos uint64 `json:"source_pos"`
146 RefDataHash string `json:"ref_data"`
147 ValidHeight uint64 `json:"valid_height"`
150 // POST /list-unspent-outputs
151 func (bcr *BlockchainReactor) listUnspentOutputs(ctx context.Context, filter struct {
152 ID string `json:"id"`
154 tmpUTXO := annotatedUTXO{}
155 UTXOs := make([]annotatedUTXO, 0)
157 accountUTXOs, err := bcr.wallet.GetAccountUTXOs(filter.ID)
159 log.Errorf("list Unspent Outputs: %v", err)
160 return NewErrorResponse(err)
163 for _, utxo := range accountUTXOs {
164 tmpUTXO.AccountID = utxo.AccountID
165 tmpUTXO.OutputID = utxo.OutputID.String()
166 tmpUTXO.SourceID = utxo.SourceID.String()
167 tmpUTXO.AssetID = utxo.AssetID.String()
168 tmpUTXO.Amount = utxo.Amount
169 tmpUTXO.SourcePos = utxo.SourcePos
170 tmpUTXO.Program = fmt.Sprintf("%x", utxo.ControlProgram)
171 tmpUTXO.RefDataHash = utxo.RefDataHash.String()
172 tmpUTXO.ControlProgramIndex = utxo.ControlProgramIndex
173 tmpUTXO.Address = utxo.Address
174 tmpUTXO.ValidHeight = utxo.ValidHeight
176 tmpUTXO.Alias = bcr.accounts.GetAliasByID(utxo.AccountID)
177 tmpUTXO.AssetAlias = bcr.assets.GetAliasByID(tmpUTXO.AssetID)
179 UTXOs = append(UTXOs, tmpUTXO)
182 return NewSuccessResponse(UTXOs)