Skip to content

Commit bd6e3a6

Browse files
authored
fix(go/cli): update escrow balance estimator (#268)
Signed-off-by: Artur Troian <troian@users.noreply.github.com> Co-authored-by: Artur Troian <troian@users.noreply.github.com>
1 parent 1f74eb5 commit bd6e3a6

File tree

3 files changed

+121
-92
lines changed

3 files changed

+121
-92
lines changed

go/cli/escrow_query.go

Lines changed: 115 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,31 @@
11
package cli
22

33
import (
4+
"encoding/json"
45
"errors"
56
"fmt"
67
"strings"
8+
"time"
79

810
sdkclient "github.com/cosmos/cosmos-sdk/client"
11+
sdk "github.com/cosmos/cosmos-sdk/types"
912
"github.com/cosmos/cosmos-sdk/version"
1013
"github.com/cosmos/cosmos-sdk/x/authz"
1114
"github.com/spf13/cobra"
15+
"gopkg.in/yaml.v3"
1216

1317
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"
1421
"pkg.akt.dev/go/node/escrow/module"
1522
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"
1629
)
1730

1831
var errNoLeaseMatches = errors.New("leases for deployment do not exist")
@@ -222,92 +235,108 @@ func GetQueryEscrowBlocksRemainingCmd() *cobra.Command {
222235
Short: "Compute the number of blocks remaining for an escrow account",
223236
Args: cobra.ExactArgs(0),
224237
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+
},
311340
}
312341

313342
cflags.AddQueryFlagsToCmd(cmd)

go/node/utils/escrow_query.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ package utils
33
import (
44
sdkmath "cosmossdk.io/math"
55

6-
sdk "pkg.akt.dev/go/node/types/sdk"
6+
sdk "github.com/cosmos/cosmos-sdk/types"
77
)
88

99
func LeaseCalcBalanceRemain(balance sdkmath.LegacyDec, currBlock, settledAt int64, leasePrice sdk.DecCoin) sdk.DecCoin {
10-
res, _ := sdk.NewDecFromStr(balance.String())
11-
diff := sdk.ZeroDec()
10+
res, _ := sdkmath.LegacyNewDecFromStr(balance.String())
11+
diff := sdkmath.LegacyZeroDec()
1212

1313
diff = diff.Add(leasePrice.Amount)
1414
diff = diff.MulInt64(currBlock - settledAt)
@@ -18,6 +18,6 @@ func LeaseCalcBalanceRemain(balance sdkmath.LegacyDec, currBlock, settledAt int6
1818
return sdk.NewDecCoinFromDec(leasePrice.Denom, res)
1919
}
2020

21-
func LeaseCalcBlocksRemain(balance float64, leasePrice sdkmath.LegacyDec) int64 {
22-
return int64(balance / leasePrice.MustFloat64())
21+
func LeaseCalcBlocksRemain(balance sdkmath.LegacyDec, leasePrice sdkmath.LegacyDec) int64 {
22+
return balance.Quo(leasePrice).TruncateInt64()
2323
}

go/util/network/network.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ import (
55
)
66

77
const (
8-
AverageBlockTime = 6500 * time.Millisecond
8+
AverageBlockTime = 6000 * time.Millisecond
99
)

0 commit comments

Comments
 (0)