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)
| 607 | // when BME is halted due to low collateral ratio and oracle is available. |
| 608 | // It transfers uakt directly to the payment owner (provider). |
| 609 | func (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 { |
no test coverage detected