@@ -17,10 +17,12 @@ import (
17
17
"github.com/ava-labs/avalanchego/network"
18
18
"github.com/ava-labs/avalanchego/network/peer"
19
19
"github.com/ava-labs/avalanchego/snow/networking/benchlist"
20
+ "github.com/ava-labs/avalanchego/snow/validators"
20
21
"github.com/ava-labs/avalanchego/utils/constants"
21
22
"github.com/ava-labs/avalanchego/utils/ips"
22
23
"github.com/ava-labs/avalanchego/utils/json"
23
24
"github.com/ava-labs/avalanchego/utils/logging"
25
+ "github.com/ava-labs/avalanchego/utils/set"
24
26
"github.com/ava-labs/avalanchego/version"
25
27
"github.com/ava-labs/avalanchego/vms"
26
28
"github.com/ava-labs/avalanchego/vms/platformvm/signer"
@@ -32,6 +34,7 @@ var errNoChainProvided = errors.New("argument 'chain' not given")
32
34
type Info struct {
33
35
Parameters
34
36
log logging.Logger
37
+ validators validators.Manager
35
38
myIP ips.DynamicIPPort
36
39
networking network.Network
37
40
chainManager chains.Manager
@@ -59,6 +62,7 @@ type Parameters struct {
59
62
func NewService (
60
63
parameters Parameters ,
61
64
log logging.Logger ,
65
+ validators validators.Manager ,
62
66
chainManager chains.Manager ,
63
67
vmManager vms.Manager ,
64
68
myIP ips.DynamicIPPort ,
@@ -73,6 +77,7 @@ func NewService(
73
77
& Info {
74
78
Parameters : parameters ,
75
79
log : log ,
80
+ validators : validators ,
76
81
chainManager : chainManager ,
77
82
vmManager : vmManager ,
78
83
myIP : myIP ,
@@ -319,6 +324,64 @@ func (i *Info) Uptime(_ *http.Request, args *UptimeRequest, reply *UptimeRespons
319
324
return nil
320
325
}
321
326
327
+ type ACP struct {
328
+ SupportWeight json.Uint64 `json:"supportWeight"`
329
+ Supporters set.Set [ids.NodeID ] `json:"supporters"`
330
+ ObjectWeight json.Uint64 `json:"objectWeight"`
331
+ Objectors set.Set [ids.NodeID ] `json:"objectors"`
332
+ AbstainWeight json.Uint64 `json:"abstainWeight"`
333
+ }
334
+
335
+ type ACPsReply struct {
336
+ ACPs map [uint32 ]* ACP `json:"acps"`
337
+ }
338
+
339
+ func (a * ACPsReply ) getACP (acpNum uint32 ) * ACP {
340
+ acp , ok := a .ACPs [acpNum ]
341
+ if ! ok {
342
+ acp = & ACP {}
343
+ a .ACPs [acpNum ] = acp
344
+ }
345
+ return acp
346
+ }
347
+
348
+ func (i * Info ) Acps (_ * http.Request , _ * struct {}, reply * ACPsReply ) error {
349
+ i .log .Debug ("API called" ,
350
+ zap .String ("service" , "info" ),
351
+ zap .String ("method" , "acps" ),
352
+ )
353
+
354
+ reply .ACPs = make (map [uint32 ]* ACP , constants .CurrentACPs .Len ())
355
+ peers := i .networking .PeerInfo (nil )
356
+ for _ , peer := range peers {
357
+ weight := json .Uint64 (i .validators .GetWeight (constants .PrimaryNetworkID , peer .ID ))
358
+ if weight == 0 {
359
+ continue
360
+ }
361
+
362
+ for acpNum := range peer .SupportedACPs {
363
+ acp := reply .getACP (acpNum )
364
+ acp .Supporters .Add (peer .ID )
365
+ acp .SupportWeight += weight
366
+ }
367
+ for acpNum := range peer .ObjectedACPs {
368
+ acp := reply .getACP (acpNum )
369
+ acp .Objectors .Add (peer .ID )
370
+ acp .ObjectWeight += weight
371
+ }
372
+ }
373
+
374
+ totalWeight , err := i .validators .TotalWeight (constants .PrimaryNetworkID )
375
+ if err != nil {
376
+ return err
377
+ }
378
+ for acpNum := range constants .CurrentACPs {
379
+ acp := reply .getACP (acpNum )
380
+ acp .AbstainWeight = json .Uint64 (totalWeight ) - acp .SupportWeight - acp .ObjectWeight
381
+ }
382
+ return nil
383
+ }
384
+
322
385
type GetTxFeeResponse struct {
323
386
TxFee json.Uint64 `json:"txFee"`
324
387
CreateAssetTxFee json.Uint64 `json:"createAssetTxFee"`
0 commit comments