MCPcopy Create free account
hub / github.com/akash-network/node / settleFromAktFallback

Method settleFromAktFallback

x/escrow/keeper/keeper.go:609–687  ·  view source on GitHub ↗

settleFromAktFallback attempts to settle overdrawn payments using AKT funds when BME is halted due to low collateral ratio and oracle is available. It transfers uakt directly to the payment owner (provider).

(ctx sdk.Context, acc *account, payments []payment)

Source from the content-addressed store, hash-verified

607// when BME is halted due to low collateral ratio and oracle is available.
608// It transfers uakt directly to the payment owner (provider).
609func (k *keeper) settleFromAktFallback(ctx sdk.Context, acc *account, payments []payment) error {
610 // Check AKT funds exist
611 var aktFunds *etypes.Balance
612 for i := range acc.State.Funds {
613 if acc.State.Funds[i].Denom == sdkutil.DenomUakt {
614 aktFunds = &acc.State.Funds[i]
615 break
616 }
617 }
618 if aktFunds == nil || !aktFunds.Amount.IsPositive() {
619 return nil
620 }
621
622 // Check BME halt status
623 status, err := k.bmeKeeper.GetMintStatus(ctx)
624 if err != nil || status < bmetypes.MintStatusHaltCR {
625 return nil
626 }
627
628 // Check oracle availability
629 aktPrice, err := k.oracleKeeper.GetAggregatedPrice(ctx, sdkutil.DenomUakt)
630 if err != nil || !aktPrice.IsPositive() {
631 return nil
632 }
633
634 for idx := range payments {
635 if payments[idx].State.State != etypes.StateOverdrawn {
636 continue
637 }
638 unsettled := payments[idx].State.Unsettled.Amount
639 if unsettled.IsZero() {
640 continue
641 }
642
643 // Convert uact unsettled → uakt needed: unsettled_uact / akt_price
644 uaktNeeded := unsettled.Quo(aktPrice)
645 aktCoin := sdk.NewDecCoinFromDec(sdkutil.DenomUakt, uaktNeeded)
646
647 // Deduct from AKT funds/deposits
648 settled, od := acc.deductFromBalance(aktCoin)
649 if settled.Amount.IsZero() {
650 continue
651 }
652
653 // AKT fallback doesn't carry debt - reset to zero if overdrawn
654 if od {
655 aktFunds.Amount = sdkmath.LegacyZeroDec()
656 }
657
658 // Transfer settled uakt directly to payment owner (provider)
659 owner, err := k.ac.StringToBytes(payments[idx].State.Owner)
660 if err != nil {
661 return err
662 }
663
664 uaktTransfer := sdk.NewCoin(sdkutil.DenomUakt, settled.Amount.TruncateInt())
665 if uaktTransfer.IsPositive() {
666 if err := k.bkeeper.SendCoinsFromModuleToAccount(ctx, module.ModuleName, owner, sdk.NewCoins(uaktTransfer)); err != nil {

Callers 1

accountSettleMethod · 0.95

Calls 4

deductFromBalanceMethod · 0.80
GetMintStatusMethod · 0.65
GetAggregatedPriceMethod · 0.65

Tested by

no test coverage detected