github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/stellar/inflation.go (about)

     1  package stellar
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/keybase/client/go/libkb"
     7  	"github.com/keybase/client/go/protocol/stellar1"
     8  	"github.com/keybase/stellarnet"
     9  )
    10  
    11  func GetPredefinedInflationDestinations(mctx libkb.MetaContext) (ret []stellar1.PredefinedInflationDestination, err error) {
    12  	return getGlobal(mctx.G()).walletState.GetInflationDestinations(mctx.Ctx())
    13  }
    14  
    15  func SetInflationDestinationLocal(mctx libkb.MetaContext, arg stellar1.SetInflationDestinationLocalArg) (err error) {
    16  	defer mctx.Trace(
    17  		fmt.Sprintf("Stellar.SetInflationDestinationLocal(on=%s,to=%s)", arg.AccountID, arg.Destination),
    18  		&err)()
    19  
    20  	walletState := getGlobal(mctx.G()).walletState
    21  
    22  	// look up sender account
    23  	senderEntry, senderAccountBundle, err := LookupSender(mctx, arg.AccountID)
    24  	if err != nil {
    25  		return err
    26  	}
    27  	senderSeed := senderAccountBundle.Signers[0]
    28  	senderSeed2, err := stellarnet.NewSeedStr(senderSeed.SecureNoLogString())
    29  	if err != nil {
    30  		return err
    31  	}
    32  
    33  	destinationAddrStr, err := stellarnet.NewAddressStr(arg.Destination.String())
    34  	if err != nil {
    35  		return fmt.Errorf("Malformed destination account ID: %s", err)
    36  	}
    37  
    38  	sp, unlock := NewSeqnoProvider(mctx, walletState)
    39  	defer unlock()
    40  
    41  	tb, err := getTimeboundsForSending(mctx, walletState)
    42  	if err != nil {
    43  		return err
    44  	}
    45  
    46  	baseFee := walletState.BaseFee(mctx)
    47  
    48  	sig, err := stellarnet.SetInflationDestinationTransaction(senderSeed2, destinationAddrStr, sp, tb, baseFee)
    49  	if err != nil {
    50  		return err
    51  	}
    52  	err = walletState.SetInflationDestination(mctx.Ctx(), sig.Signed)
    53  	if err != nil {
    54  		return err
    55  	}
    56  
    57  	// force load this transaction before refreshing the wallet state
    58  	loader := DefaultLoader(mctx.G())
    59  	loader.LoadPaymentSync(mctx.Ctx(), stellar1.PaymentID(sig.TxHash))
    60  
    61  	err = walletState.Refresh(mctx, senderEntry.AccountID, "set inflation destination")
    62  	if err != nil {
    63  		mctx.Debug("SetInflationDestinationLocal ws.Refresh error: %s", err)
    64  	}
    65  
    66  	return nil
    67  }
    68  
    69  func GetInflationDestination(mctx libkb.MetaContext, accountID stellar1.AccountID) (res stellar1.InflationDestinationResultLocal, err error) {
    70  	defer mctx.Trace("Stellar.GetInflationDestination", &err)()
    71  
    72  	walletState := getGlobal(mctx.G()).walletState
    73  	details, err := walletState.Details(mctx.Ctx(), accountID)
    74  	if err != nil {
    75  		return res, err
    76  	}
    77  
    78  	dest := details.InflationDestination
    79  	if dest == nil {
    80  		// Inflation destination is not set on the account.
    81  		res.Destination = nil
    82  		return res, nil
    83  	}
    84  
    85  	res.Destination = dest
    86  	if dest.Eq(accountID) {
    87  		res.Self = true
    88  	} else {
    89  		destinations, err := GetPredefinedInflationDestinations(mctx)
    90  		if err != nil {
    91  			return res, err
    92  		}
    93  		for _, known := range destinations {
    94  			if dest.Eq(known.AccountID) {
    95  				res.KnownDestination = &known
    96  				break
    97  			}
    98  		}
    99  	}
   100  
   101  	return res, nil
   102  }