@@ -10,7 +10,9 @@ import (
1010
1111 "github.com/spf13/cobra"
1212
13+ "github.com/oasisprotocol/oasis-core/go/beacon/api"
1314 "github.com/oasisprotocol/oasis-core/go/common/crypto/signature"
15+ "github.com/oasisprotocol/oasis-core/go/common/entity"
1416 consensusPretty "github.com/oasisprotocol/oasis-core/go/common/prettyprint"
1517 consensus "github.com/oasisprotocol/oasis-core/go/consensus/api"
1618 "github.com/oasisprotocol/oasis-core/go/consensus/api/transaction"
@@ -40,6 +42,80 @@ const (
4042 selParameters
4143)
4244
45+ func printEntityNodes (ctx context.Context , npa * common.NPASelection , stakingConn staking.Backend , registryConn registry.Backend , beaconConn api.Backend , entity * entity.Entity , height int64 ) error {
46+ epoch , err := beaconConn .GetEpoch (ctx , height )
47+ if err != nil {
48+ return err
49+ }
50+
51+ fmt .Printf ("=== ENTITY ===\n " )
52+
53+ entityAddr := staking .NewAddress (entity .ID )
54+ fmt .Printf ("Entity Address: %s\n " , entityAddr .String ())
55+
56+ fmt .Printf ("Entity ID: %s\n " , entity .ID .String ())
57+
58+ account , err := stakingConn .Account (
59+ ctx ,
60+ & staking.OwnerQuery {Height : height , Owner : entityAddr },
61+ )
62+ if err != nil {
63+ return err
64+ }
65+
66+ balance := & account .Escrow .Active .Balance
67+ commission := account .Escrow .CommissionSchedule .CurrentRate (epoch )
68+
69+ fmt .Printf ("Stake: %s %s\n " , consensusPretty .QuantityFrac (* balance , uint8 (9 )), npa .Network .Denomination .Symbol )
70+
71+ var commissionString string
72+ if commission != nil {
73+ commissionString = staking .PrettyPrintCommissionRatePercentage (* commission )
74+ } else {
75+ commissionString = "not set"
76+ }
77+ fmt .Printf ("Commission: %s\n " , commissionString )
78+
79+ fmt .Println ()
80+ fmt .Printf ("=== NODES ===\n " )
81+ for i , node := range entity .Nodes {
82+ fmt .Printf ("Node ID: %s\n " , node .String ())
83+ idQuery2 := & registry.IDQuery {
84+ Height : height ,
85+ ID : node ,
86+ }
87+
88+ nodeStatus , err := registryConn .GetNodeStatus (ctx , idQuery2 )
89+ if err != nil {
90+ fmt .Println (" Node is not active" )
91+ continue
92+ }
93+
94+ if node , err2 := registryConn .GetNode (ctx , idQuery2 ); err2 == nil {
95+ fmt .Printf (" Node Roles: %s\n " , node .Roles .String ())
96+ fmt .Printf (" Software Version: %s\n " , node .SoftwareVersion )
97+ if len (node .Runtimes ) > 0 {
98+ fmt .Printf (" Runtimes:\n " )
99+ }
100+ for _ , runtime := range node .Runtimes {
101+ fmt .Printf (" Runtime ID: %s\n " , runtime .ID )
102+ fmt .Printf (" Runtime Version: %s\n " , runtime .Version )
103+ }
104+ fmt .Printf (" Node Status:\n " )
105+ fmt .Printf (" Expiration Processed: %t\n " , nodeStatus .ExpirationProcessed )
106+ fmt .Printf (" Freeze End Time: %d\n " , nodeStatus .FreezeEndTime )
107+ fmt .Printf (" Election Eligible After: %d\n " , nodeStatus .ElectionEligibleAfter )
108+ } else {
109+ return fmt .Errorf ("could not get a node: %s" , err2 )
110+ }
111+
112+ if i < len (entity .Nodes )- 1 {
113+ fmt .Println ()
114+ }
115+ }
116+ return nil
117+ }
118+
43119var showCmd = & cobra.Command {
44120 Use : "show { <id> | committees | entities | gas-costs | native-token | nodes | parameters | paratimes | validators }" ,
45121 Short : "Show network properties" ,
@@ -63,6 +139,7 @@ var showCmd = &cobra.Command{
63139 roothashConn := conn .Consensus ().RootHash ()
64140 schedulerConn := conn .Consensus ().Scheduler ()
65141 stakingConn := conn .Consensus ().Staking ()
142+ beaconConn := conn .Consensus ().Beacon ()
66143
67144 // Figure out the height to use if "latest".
68145 height , err := common .GetActualHeight (
@@ -92,7 +169,7 @@ var showCmd = &cobra.Command{
92169 }
93170
94171 if entity , err := registryConn .GetEntity (ctx , idQuery ); err == nil {
95- err = prettyPrint ( entity )
172+ err = printEntityNodes ( ctx , npa , stakingConn , registryConn , beaconConn , entity , height )
96173 cobra .CheckErr (err )
97174 return
98175 }
@@ -125,7 +202,7 @@ var showCmd = &cobra.Command{
125202 cobra .CheckErr (err ) // If this doesn't work the other large queries won't either.
126203 for _ , entity := range entities {
127204 if staking .NewAddress (entity .ID ).Equal (addr ) {
128- err = prettyPrint ( entity )
205+ err = printEntityNodes ( ctx , npa , stakingConn , registryConn , beaconConn , entity , height )
129206 cobra .CheckErr (err )
130207 return
131208 }
0 commit comments