|
1 | 1 | package cli |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "encoding/json" |
4 | 5 | "errors" |
5 | 6 | "fmt" |
6 | 7 | "strings" |
| 8 | + "time" |
7 | 9 |
|
8 | 10 | sdkclient "github.com/cosmos/cosmos-sdk/client" |
| 11 | + sdk "github.com/cosmos/cosmos-sdk/types" |
9 | 12 | "github.com/cosmos/cosmos-sdk/version" |
10 | 13 | "github.com/cosmos/cosmos-sdk/x/authz" |
11 | 14 | "github.com/spf13/cobra" |
| 15 | + "gopkg.in/yaml.v3" |
12 | 16 |
|
13 | 17 | cflags "pkg.akt.dev/go/cli/flags" |
| 18 | + bme "pkg.akt.dev/go/node/bme/v1" |
| 19 | + dv1 "pkg.akt.dev/go/node/deployment/v1" |
| 20 | + dv1beta "pkg.akt.dev/go/node/deployment/v1beta4" |
14 | 21 | "pkg.akt.dev/go/node/escrow/module" |
15 | 22 | etypes "pkg.akt.dev/go/node/escrow/v1" |
| 23 | + mv1 "pkg.akt.dev/go/node/market/v1" |
| 24 | + mvbeta "pkg.akt.dev/go/node/market/v1beta5" |
| 25 | + oracle "pkg.akt.dev/go/node/oracle/v1" |
| 26 | + "pkg.akt.dev/go/node/utils" |
| 27 | + "pkg.akt.dev/go/sdkutil" |
| 28 | + netutil "pkg.akt.dev/go/util/network" |
16 | 29 | ) |
17 | 30 |
|
18 | 31 | var errNoLeaseMatches = errors.New("leases for deployment do not exist") |
@@ -222,92 +235,108 @@ func GetQueryEscrowBlocksRemainingCmd() *cobra.Command { |
222 | 235 | Short: "Compute the number of blocks remaining for an escrow account", |
223 | 236 | Args: cobra.ExactArgs(0), |
224 | 237 | PersistentPreRunE: QueryPersistentPreRunE, |
225 | | - //RunE: func(cmd *cobra.Command, _ []string) error { |
226 | | - // ctx := cmd.Context() |
227 | | - // cl := MustLightClientFromContext(ctx) |
228 | | - // |
229 | | - // id, err := cflags.DeploymentIDFromFlags(cmd.Flags()) |
230 | | - // if err != nil { |
231 | | - // return err |
232 | | - // } |
233 | | - // |
234 | | - // // Fetch leases matching owner & dseq |
235 | | - // leaseRequest := mv1beta.QueryLeasesRequest{ |
236 | | - // Filters: mv1beta.LeaseFilters{ |
237 | | - // Owner: id.Owner, |
238 | | - // DSeq: id.DSeq, |
239 | | - // GSeq: 0, |
240 | | - // OSeq: 0, |
241 | | - // Provider: "", |
242 | | - // State: mv1.LeaseActive.String(), |
243 | | - // }, |
244 | | - // Pagination: nil, |
245 | | - // } |
246 | | - // |
247 | | - // leasesResponse, err := cl.Query().Market().Leases(ctx, &leaseRequest) |
248 | | - // if err != nil { |
249 | | - // return err |
250 | | - // } |
251 | | - // |
252 | | - // if len(leasesResponse.Leases) == 0 { |
253 | | - // return errNoLeaseMatches |
254 | | - // } |
255 | | - // |
256 | | - // // Fetch the balance of the escrow account |
257 | | - // totalLeaseAmount := leasesResponse.TotalPricesAmount() |
258 | | - // blockchainHeight, err := cl.Node().CurrentBlockHeight(ctx) |
259 | | - // if err != nil { |
260 | | - // return err |
261 | | - // } |
262 | | - // |
263 | | - // res, err := cl.Query().Deployment().Deployment(cmd.Context(), &dv1beta.QueryDeploymentRequest{ |
264 | | - // ID: dv1.DeploymentID{Owner: id.Owner, DSeq: id.DSeq}, |
265 | | - // }) |
266 | | - // if err != nil { |
267 | | - // return err |
268 | | - // } |
269 | | - // |
270 | | - // balancesRemaining := make(sdk.DecCoins, 0, len(res.EscrowAccount.State.Funds)) |
271 | | - // |
272 | | - // for _, funds := range res.EscrowAccount.State.Funds { |
273 | | - // if funds.Amount.IsNegative() { |
274 | | - // continue |
275 | | - // } |
276 | | - // |
277 | | - // val := utils.LeaseCalcBalanceRemain(funds.Amount, blockchainHeight, res.EscrowAccount.State.SettledAt, totalLeaseAmount) |
278 | | - // |
279 | | - // balancesRemaining = append(balancesRemaining, val) |
280 | | - // blocksRemain := utils.LeaseCalcBlocksRemain(balanceRemain, totalLeaseAmount) |
281 | | - // } |
282 | | - // |
283 | | - // output := struct { |
284 | | - // BalanceRemain float64 `json:"balance_remaining" yaml:"balance_remaining"` |
285 | | - // BlocksRemain int64 `json:"blocks_remaining" yaml:"blocks_remaining"` |
286 | | - // EstimatedTimeRemain time.Duration `json:"estimated_time_remaining" yaml:"estimated_time_remaining"` |
287 | | - // }{ |
288 | | - // BalanceRemain: balanceRemain, |
289 | | - // BlocksRemain: blocksRemain, |
290 | | - // //EstimatedTimeRemain: netutil.AverageBlockTime * time.Duration(blocksRemain), |
291 | | - // } |
292 | | - // |
293 | | - // outputType, err := cmd.Flags().GetString("output") |
294 | | - // if err != nil { |
295 | | - // return err |
296 | | - // } |
297 | | - // |
298 | | - // var data []byte |
299 | | - // if outputType == "json" { |
300 | | - // data, err = json.MarshalIndent(output, " ", "\t") |
301 | | - // } else { |
302 | | - // data, err = yaml.Marshal(output) |
303 | | - // } |
304 | | - // |
305 | | - // if err != nil { |
306 | | - // return err |
307 | | - // } |
308 | | - // |
309 | | - // return cl.ClientContext().PrintBytes(data) |
310 | | - //}, |
| 238 | + RunE: func(cmd *cobra.Command, _ []string) error { |
| 239 | + ctx := cmd.Context() |
| 240 | + cl := MustLightClientFromContext(ctx) |
| 241 | + |
| 242 | + id, err := cflags.DeploymentIDFromFlags(cmd.Flags()) |
| 243 | + if err != nil { |
| 244 | + return err |
| 245 | + } |
| 246 | + |
| 247 | + // Fetch leases matching owner & dseq |
| 248 | + leaseRequest := mvbeta.QueryLeasesRequest{ |
| 249 | + Filters: mv1.LeaseFilters{ |
| 250 | + Owner: id.Owner, |
| 251 | + DSeq: id.DSeq, |
| 252 | + GSeq: 0, |
| 253 | + OSeq: 0, |
| 254 | + Provider: "", |
| 255 | + State: mv1.LeaseActive.String(), |
| 256 | + }, |
| 257 | + Pagination: nil, |
| 258 | + } |
| 259 | + |
| 260 | + bmeStatus, err := cl.Query().BME().Status(ctx, &bme.QueryStatusRequest{}) |
| 261 | + if err != nil { |
| 262 | + return err |
| 263 | + } |
| 264 | + |
| 265 | + aktPrice, err := cl.Query().Oracle().AggregatedPrice(ctx, &oracle.QueryAggregatedPriceRequest{Denom: sdkutil.DenomAkt}) |
| 266 | + if err != nil { |
| 267 | + return err |
| 268 | + } |
| 269 | + |
| 270 | + leasesResponse, err := cl.Query().Market().Leases(ctx, &leaseRequest) |
| 271 | + if err != nil { |
| 272 | + return err |
| 273 | + } |
| 274 | + |
| 275 | + if len(leasesResponse.Leases) == 0 { |
| 276 | + return errNoLeaseMatches |
| 277 | + } |
| 278 | + |
| 279 | + // Fetch the balance of the escrow account |
| 280 | + totalLeaseRate := leasesResponse.TotalPriceAmount() |
| 281 | + blockchainHeight, err := cl.Node().CurrentBlockHeight(ctx) |
| 282 | + if err != nil { |
| 283 | + return err |
| 284 | + } |
| 285 | + |
| 286 | + res, err := cl.Query().Deployment().Deployment(cmd.Context(), &dv1beta.QueryDeploymentRequest{ |
| 287 | + ID: dv1.DeploymentID{Owner: id.Owner, DSeq: id.DSeq}, |
| 288 | + }) |
| 289 | + if err != nil { |
| 290 | + return err |
| 291 | + } |
| 292 | + |
| 293 | + balanceRemaining := sdk.NewInt64DecCoin(sdkutil.DenomUact, 0) |
| 294 | + |
| 295 | + for _, funds := range res.EscrowAccount.State.Funds { |
| 296 | + if funds.Amount.IsNegative() { |
| 297 | + continue |
| 298 | + } |
| 299 | + |
| 300 | + if funds.Denom == sdkutil.DenomUact { |
| 301 | + balanceRemaining.Amount.AddMut(funds.Amount) |
| 302 | + } else if (bmeStatus.Status >= bme.MintStatusHaltCR) && aktPrice.PriceHealth.IsHealthy { |
| 303 | + // account for any AKT only if BME CB is active |
| 304 | + swappedRate := funds.Amount.Mul(aktPrice.AggregatedPrice.TWAP) |
| 305 | + balanceRemaining.Amount.AddMut(swappedRate) |
| 306 | + } |
| 307 | + } |
| 308 | + |
| 309 | + balanceRemaining = utils.LeaseCalcBalanceRemain(balanceRemaining.Amount, blockchainHeight, res.EscrowAccount.State.SettledAt, sdk.NewDecCoinFromDec(sdkutil.DenomUact, totalLeaseRate)) |
| 310 | + blocksRemaining := utils.LeaseCalcBlocksRemain(balanceRemaining.Amount, totalLeaseRate) |
| 311 | + |
| 312 | + output := struct { |
| 313 | + BalanceRemain sdk.DecCoin `json:"balance_remaining" yaml:"balance_remaining"` |
| 314 | + BlocksRemain int64 `json:"blocks_remaining" yaml:"blocks_remaining"` |
| 315 | + EstimatedTimeRemaining time.Duration `json:"estimated_time_remaining" yaml:"estimated_time_remaining"` |
| 316 | + }{ |
| 317 | + BalanceRemain: balanceRemaining, |
| 318 | + BlocksRemain: blocksRemaining, |
| 319 | + EstimatedTimeRemaining: netutil.AverageBlockTime * time.Duration(blocksRemaining), |
| 320 | + } |
| 321 | + |
| 322 | + outputType, err := cmd.Flags().GetString("output") |
| 323 | + if err != nil { |
| 324 | + return err |
| 325 | + } |
| 326 | + |
| 327 | + var data []byte |
| 328 | + if outputType == "json" { |
| 329 | + data, err = json.MarshalIndent(output, " ", "\t") |
| 330 | + } else { |
| 331 | + data, err = yaml.Marshal(output) |
| 332 | + } |
| 333 | + |
| 334 | + if err != nil { |
| 335 | + return err |
| 336 | + } |
| 337 | + |
| 338 | + return cl.ClientContext().PrintBytes(data) |
| 339 | + }, |
311 | 340 | } |
312 | 341 |
|
313 | 342 | cflags.AddQueryFlagsToCmd(cmd) |
|
0 commit comments