@@ -68,7 +68,7 @@ func Account(w http.ResponseWriter, r *http.Request) {
6868 }
6969}
7070
71- // BlocksData will return information about blocks
71+ // AccountBlocksData will return information about blocks mined by an account
7272func AccountBlocksData (w http.ResponseWriter , r * http.Request ) {
7373 w .Header ().Set ("Content-Type" , "application/json" )
7474
@@ -101,15 +101,12 @@ func AccountBlocksData(w http.ResponseWriter, r *http.Request) {
101101
102102 var blocksCount int64
103103
104- err = db .DB .Get (& blocksCount , "SELECT blocksproposed FROM accounts WHERE publickey = $1" , pk )
104+ err = db .DB .Get (& blocksCount , "SELECT least( blocksproposed, 10000) FROM accounts WHERE publickey = $1" , pk )
105105 if err != nil {
106106 logger .Errorf ("error retrieving blockproposed for account %v: %v" , pk , err )
107107 http .Error (w , "Internal server error" , 503 )
108108 return
109109 }
110- if blocksCount > 10000 {
111- blocksCount = 10000
112- }
113110
114111 var blocks []* types.Block
115112
@@ -154,3 +151,169 @@ func AccountBlocksData(w http.ResponseWriter, r *http.Request) {
154151 return
155152 }
156153}
154+
155+ // AccountBlocksData will return information about tx sent and received by an account
156+ func AccountTxData (w http.ResponseWriter , r * http.Request ) {
157+ w .Header ().Set ("Content-Type" , "application/json" )
158+
159+ q := r .URL .Query ()
160+
161+ draw , err := strconv .ParseInt (q .Get ("draw" ), 10 , 64 )
162+ if err != nil {
163+ logger .Errorf ("error converting datatables data parameter from string to int: %v" , err )
164+ http .Error (w , "Internal server error" , 503 )
165+ return
166+ }
167+ start , err := strconv .ParseInt (q .Get ("start" ), 10 , 64 )
168+ if err != nil {
169+ logger .Errorf ("error converting datatables start parameter from string to int: %v" , err )
170+ http .Error (w , "Internal server error" , 503 )
171+ return
172+ }
173+ length , err := strconv .ParseInt (q .Get ("length" ), 10 , 64 )
174+ if err != nil {
175+ logger .Errorf ("error converting datatables length parameter from string to int: %v" , err )
176+ http .Error (w , "Internal server error" , 503 )
177+ return
178+ }
179+ if length > 100 {
180+ length = 100
181+ }
182+
183+ vars := mux .Vars (r )
184+ pk := vars ["pk" ]
185+
186+ var txCount int64
187+
188+ err = db .DB .Get (& txCount , "SELECT least(count(*), 10000) FROM accounttransactions WHERE publickey = $1 AND canonical" , pk )
189+ if err != nil {
190+ logger .Errorf ("error retrieving tx count for account %v: %v" , pk , err )
191+ http .Error (w , "Internal server error" , 503 )
192+ return
193+ }
194+
195+ var txs []* types.TxPageData
196+
197+ err = db .DB .Select (& txs , `SELECT userjobs.*, blocks.height, blocks.slot, blocks.epoch, blocks.ts
198+ FROM accounttransactions
199+ LEFT JOIN userjobs ON accounttransactions.blockstatehash = userjobs.blockstatehash AND accounttransactions.id = userjobs.id
200+ LEFT JOIN blocks ON accounttransactions.blockstatehash = blocks.statehash
201+ WHERE accounttransactions.publickey = $1 AND accounttransactions.canonical
202+ ORDER BY ts DESC LIMIT $2 OFFSET $3` , pk , length , start )
203+
204+ if err != nil {
205+ logger .Errorf ("error retrieving tx data for account %v: %v" , pk , err )
206+ http .Error (w , "Internal server error" , 503 )
207+ return
208+ }
209+
210+ tableData := make ([][]interface {}, len (txs ))
211+ for i , tx := range txs {
212+ tableData [i ] = []interface {}{
213+ tx .ID ,
214+ tx .Ts .Unix (),
215+ tx .Height ,
216+ tx .Sender ,
217+ tx .Recipient ,
218+ tx .Amount ,
219+ tx .Fee ,
220+ tx .Delegation ,
221+ tx .BlockStateHash ,
222+ }
223+ }
224+
225+ data := & types.DataTableResponse {
226+ Draw : draw ,
227+ RecordsTotal : txCount ,
228+ RecordsFiltered : txCount ,
229+ Data : tableData ,
230+ }
231+
232+ err = json .NewEncoder (w ).Encode (data )
233+ if err != nil {
234+ logger .Errorf ("error enconding json response for %v route: %v" , r .URL .String (), err )
235+ http .Error (w , "Internal server error" , 503 )
236+ return
237+ }
238+ }
239+
240+ // AccountBlocksData will return information about blocks mined by an account
241+ func AccountSnarkJobsData (w http.ResponseWriter , r * http.Request ) {
242+ w .Header ().Set ("Content-Type" , "application/json" )
243+
244+ q := r .URL .Query ()
245+
246+ draw , err := strconv .ParseInt (q .Get ("draw" ), 10 , 64 )
247+ if err != nil {
248+ logger .Errorf ("error converting datatables data parameter from string to int: %v" , err )
249+ http .Error (w , "Internal server error" , 503 )
250+ return
251+ }
252+ start , err := strconv .ParseInt (q .Get ("start" ), 10 , 64 )
253+ if err != nil {
254+ logger .Errorf ("error converting datatables start parameter from string to int: %v" , err )
255+ http .Error (w , "Internal server error" , 503 )
256+ return
257+ }
258+ length , err := strconv .ParseInt (q .Get ("length" ), 10 , 64 )
259+ if err != nil {
260+ logger .Errorf ("error converting datatables length parameter from string to int: %v" , err )
261+ http .Error (w , "Internal server error" , 503 )
262+ return
263+ }
264+ if length > 100 {
265+ length = 100
266+ }
267+
268+ vars := mux .Vars (r )
269+ pk := vars ["pk" ]
270+
271+ var blocksCount int64
272+
273+ err = db .DB .Get (& blocksCount , "SELECT least(snarkjobs, 10000) FROM accounts WHERE publickey = $1" , pk )
274+ if err != nil {
275+ logger .Errorf ("error retrieving snarkjobs for account %v: %v" , pk , err )
276+ http .Error (w , "Internal server error" , 503 )
277+ return
278+ }
279+
280+ var snarkJobs []* types.SnarkJobPageData
281+
282+ err = db .DB .Select (& snarkJobs , `SELECT snarkjobs.*, blocks.height, blocks.slot, blocks.epoch, blocks.ts
283+ FROM snarkjobs
284+ LEFT JOIN blocks On snarkjobs.blockstatehash = blocks.statehash
285+ WHERE prover = $1 AND snarkjobs.canonical
286+ ORDER BY blocks.height DESC LIMIT $2 OFFSET $3` , pk , length , start )
287+
288+ if err != nil {
289+ logger .Errorf ("error retrieving snark job data for account %v: %v" , pk , err )
290+ http .Error (w , "Internal server error" , 503 )
291+ return
292+ }
293+
294+ tableData := make ([][]interface {}, len (snarkJobs ))
295+ for i , sj := range snarkJobs {
296+ tableData [i ] = []interface {}{
297+ sj .Jobids ,
298+ sj .Prover ,
299+ sj .Fee ,
300+ sj .Ts .Unix (),
301+ sj .Height ,
302+ sj .BlockStateHash ,
303+ }
304+ }
305+
306+ data := & types.DataTableResponse {
307+ Draw : draw ,
308+ RecordsTotal : blocksCount ,
309+ RecordsFiltered : blocksCount ,
310+ Data : tableData ,
311+ }
312+
313+ err = json .NewEncoder (w ).Encode (data )
314+ if err != nil {
315+ logger .Errorf ("error enconding json response for %v route: %v" , r .URL .String (), err )
316+ http .Error (w , "Internal server error" , 503 )
317+ return
318+ }
319+ }
0 commit comments