|
|
|
package keybase
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
// walletAPIOut sends JSON requests to the wallet API and returns its response.
|
|
|
|
func walletAPIOut(k *Keybase, w WalletAPI) (WalletAPI, error) {
|
|
|
|
jsonBytes, _ := json.Marshal(w)
|
|
|
|
|
|
|
|
cmdOut, err := k.Exec("wallet", "api", "-m", string(jsonBytes))
|
|
|
|
if err != nil {
|
|
|
|
return WalletAPI{}, err
|
|
|
|
}
|
|
|
|
|
|
|
|
var r WalletAPI
|
|
|
|
json.Unmarshal(cmdOut, &r)
|
|
|
|
if r.Error != nil {
|
|
|
|
return WalletAPI{}, errors.New(r.Error.Message)
|
|
|
|
}
|
|
|
|
return r, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// TxDetail returns details of a stellar transaction
|
|
|
|
func (w Wallet) TxDetail(txid string) (WalletAPI, error) {
|
|
|
|
m := WalletAPI{
|
|
|
|
Params: &wParams{},
|
|
|
|
}
|
|
|
|
m.Method = "details"
|
|
|
|
m.Params.Options.Txid = txid
|
|
|
|
|
|
|
|
r, err := walletAPIOut(w.keybase, m)
|
|
|
|
return r, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// StellarAddress returns the primary stellar address of a given user
|
|
|
|
func (w Wallet) StellarAddress(user string) (string, error) {
|
|
|
|
m := WalletAPI{
|
|
|
|
Params: &wParams{},
|
|
|
|
}
|
|
|
|
m.Method = "lookup"
|
|
|
|
m.Params.Options.Name = user
|
|
|
|
|
|
|
|
r, err := walletAPIOut(w.keybase, m)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
return r.Result.AccountID, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// StellarUser returns the keybase username of a given wallet address
|
|
|
|
func (w Wallet) StellarUser(wallet string) (string, error) {
|
|
|
|
m := WalletAPI{
|
|
|
|
Params: &wParams{},
|
|
|
|
}
|
|
|
|
m.Method = "lookup"
|
|
|
|
m.Params.Options.Name = wallet
|
|
|
|
|
|
|
|
r, err := walletAPIOut(w.keybase, m)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
return r.Result.Username, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// RequestPayment sends a request for payment to a user
|
|
|
|
func (w Wallet) RequestPayment(user string, amount float64, memo ...string) error {
|
|
|
|
k := w.keybase
|
|
|
|
if len(memo) > 0 {
|
|
|
|
_, err := k.Exec("wallet", "request", user, fmt.Sprintf("%f", amount), "-m", memo[0])
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
_, err := k.Exec("wallet", "request", user, fmt.Sprintf("%f", amount))
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// CancelRequest cancels a request for payment previously sent to a user
|
|
|
|
func (w Wallet) CancelRequest(requestID string) error {
|
|
|
|
k := w.keybase
|
|
|
|
_, err := k.Exec("wallet", "cancel-request", requestID)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// Send sends the specified amount of the specified currency to a user
|
|
|
|
func (w Wallet) Send(recipient string, amount string, currency string, message ...string) (WalletAPI, error) {
|
|
|
|
m := WalletAPI{
|
|
|
|
Params: &wParams{},
|
|
|
|
}
|
|
|
|
m.Method = "send"
|
|
|
|
m.Params.Options.Recipient = recipient
|
|
|
|
m.Params.Options.Amount = amount
|
|
|
|
m.Params.Options.Currency = currency
|
|
|
|
if len(message) > 0 {
|
|
|
|
m.Params.Options.Message = strings.Join(message, " ")
|
|
|
|
}
|
|
|
|
|
|
|
|
r, err := walletAPIOut(w.keybase, m)
|
|
|
|
if err != nil {
|
|
|
|
return WalletAPI{}, err
|
|
|
|
}
|
|
|
|
return r, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// SendXLM sends the specified amount of XLM to a user
|
|
|
|
func (w Wallet) SendXLM(recipient string, amount string, message ...string) (WalletAPI, error) {
|
|
|
|
result, err := w.Send(recipient, amount, "XLM", message...)
|
|
|
|
return result, err
|
|
|
|
}
|