-
Notifications
You must be signed in to change notification settings - Fork 210
/
query.go
139 lines (113 loc) · 3.56 KB
/
query.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package cli
import (
"context"
"encoding/json"
"errors"
"time"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/flags"
"github.com/spf13/cobra"
"gopkg.in/yaml.v3"
deploymentTypes "github.com/akash-network/akash-api/go/node/deployment/v1beta3"
types "github.com/akash-network/akash-api/go/node/escrow/v1beta3"
marketTypes "github.com/akash-network/akash-api/go/node/market/v1beta3"
netutil "github.com/akash-network/node/util/network"
"github.com/akash-network/node/x/deployment/client/cli"
"github.com/akash-network/node/x/escrow/client/util"
)
func GetQueryCmd() *cobra.Command {
cmd := &cobra.Command{
Use: types.ModuleName,
Short: "Escrow query commands",
SuggestionsMinimumDistance: 2,
RunE: client.ValidateCmd,
}
cmd.AddCommand(
cmdBlocksRemaining(),
)
return cmd
}
var errNoLeaseMatches = errors.New("leases for deployment do not exist")
func cmdBlocksRemaining() *cobra.Command {
cmd := &cobra.Command{
Use: "blocks-remaining",
Short: "Compute the number of blocks remaining for an ecrow account",
Args: cobra.ExactArgs(0),
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx, err := client.GetClientQueryContext(cmd)
if err != nil {
return err
}
marketClient := marketTypes.NewQueryClient(clientCtx)
ctx := context.Background()
id, err := cli.DeploymentIDFromFlags(cmd.Flags())
if err != nil {
return err
}
// Fetch leases matching owner & dseq
leaseRequest := marketTypes.QueryLeasesRequest{
Filters: marketTypes.LeaseFilters{
Owner: id.Owner,
DSeq: id.DSeq,
GSeq: 0,
OSeq: 0,
Provider: "",
State: "active",
},
Pagination: nil,
}
leasesResponse, err := marketClient.Leases(ctx, &leaseRequest)
if err != nil {
return err
}
if len(leasesResponse.Leases) == 0 {
return errNoLeaseMatches
}
// Fetch the balance of the escrow account
deploymentClient := deploymentTypes.NewQueryClient(clientCtx)
totalLeaseAmount := leasesResponse.TotalPriceAmount()
blockchainHeight, err := cli.CurrentBlockHeight(clientCtx)
if err != nil {
return err
}
res, err := deploymentClient.Deployment(ctx, &deploymentTypes.QueryDeploymentRequest{
ID: deploymentTypes.DeploymentID{Owner: id.Owner, DSeq: id.DSeq},
})
if err != nil {
return err
}
balanceRemain := util.LeaseCalcBalanceRemain(res.EscrowAccount.TotalBalance().Amount,
int64(blockchainHeight),
res.EscrowAccount.SettledAt,
totalLeaseAmount)
blocksRemain := util.LeaseCalcBlocksRemain(balanceRemain, totalLeaseAmount)
output := struct {
BalanceRemain float64 `json:"balance_remaining" yaml:"balance_remaining"`
BlocksRemain int64 `json:"blocks_remaining" yaml:"blocks_remaining"`
EstimatedTimeRemain time.Duration `json:"estimated_time_remaining" yaml:"estimated_time_remaining"`
}{
BalanceRemain: balanceRemain,
BlocksRemain: blocksRemain,
EstimatedTimeRemain: netutil.AverageBlockTime * time.Duration(blocksRemain),
}
outputType, err := cmd.Flags().GetString("output")
if err != nil {
return err
}
var data []byte
if outputType == "json" {
data, err = json.MarshalIndent(output, " ", "\t")
} else {
data, err = yaml.Marshal(output)
}
if err != nil {
return err
}
return clientCtx.PrintBytes(data)
},
}
flags.AddQueryFlagsToCmd(cmd)
cli.AddDeploymentIDFlags(cmd.Flags())
cli.MarkReqDeploymentIDFlags(cmd)
return cmd
}