github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/stellar/stellarcommon/common.go (about)

     1  package stellarcommon
     2  
     3  import (
     4  	"encoding/base64"
     5  	"errors"
     6  	"strconv"
     7  
     8  	"github.com/keybase/client/go/libkb"
     9  	"github.com/keybase/client/go/protocol/keybase1"
    10  	"github.com/keybase/stellarnet"
    11  )
    12  
    13  type RecipientInput string
    14  
    15  type Recipient struct {
    16  	Input RecipientInput
    17  	// These 5 fields are nullable.
    18  	User      *User
    19  	Assertion *keybase1.SocialAssertion
    20  	// Recipient may not have a stellar wallet ready to receive
    21  	AccountID *stellarnet.AddressStr // User entered G... OR target has receiving address
    22  
    23  	// federation address lookups can return a memo
    24  	PublicMemo     *string
    25  	PublicMemoType *string
    26  }
    27  
    28  func (r Recipient) HasMemo() bool {
    29  	return r.PublicMemo != nil && r.PublicMemoType != nil
    30  }
    31  
    32  func (r Recipient) Memo() (*stellarnet.Memo, error) {
    33  	if !r.HasMemo() {
    34  		return nil, nil
    35  	}
    36  
    37  	switch *r.PublicMemoType {
    38  	case "text":
    39  		return stellarnet.NewMemoText(*r.PublicMemo), nil
    40  	case "hash":
    41  		data, err := base64.StdEncoding.DecodeString(*r.PublicMemo)
    42  		if err != nil {
    43  			return nil, errors.New("invalid federation memo hash")
    44  		}
    45  		if len(data) != 32 {
    46  			return nil, errors.New("invalid federation memo hash")
    47  		}
    48  		var hash stellarnet.MemoHash
    49  		copy(hash[:], data)
    50  		return stellarnet.NewMemoHash(hash), nil
    51  	case "id":
    52  		id, err := strconv.ParseUint(*r.PublicMemo, 10, 64)
    53  		if err != nil {
    54  			return nil, err
    55  		}
    56  		return stellarnet.NewMemoID(id), nil
    57  	default:
    58  		return nil, errors.New("invalid federation memo type")
    59  	}
    60  
    61  }
    62  
    63  type User struct {
    64  	UV       keybase1.UserVersion
    65  	Username libkb.NormalizedUsername
    66  }