lnd/cmd/lncli/invoicesrpc_active.go

256 lines
5.6 KiB
Go
Raw Normal View History

//go:build invoicesrpc
2018-11-26 14:19:43 +01:00
// +build invoicesrpc
package main
import (
"encoding/hex"
"fmt"
2019-02-10 21:03:39 +01:00
"strconv"
2018-11-26 14:19:43 +01:00
"github.com/lightningnetwork/lnd/lnrpc/invoicesrpc"
"github.com/urfave/cli"
)
// invoicesCommands will return nil for non-invoicesrpc builds.
func invoicesCommands() []cli.Command {
return []cli.Command{
cancelInvoiceCommand,
2018-12-19 15:20:55 +01:00
addHoldInvoiceCommand,
2019-02-10 21:03:39 +01:00
settleInvoiceCommand,
2018-11-26 14:19:43 +01:00
}
}
func getInvoicesClient(ctx *cli.Context) (invoicesrpc.InvoicesClient, func()) {
conn := getClientConn(ctx, false)
cleanUp := func() {
conn.Close()
}
return invoicesrpc.NewInvoicesClient(conn), cleanUp
}
2019-02-10 21:03:39 +01:00
var settleInvoiceCommand = cli.Command{
Name: "settleinvoice",
Category: "Invoices",
2019-02-10 21:03:39 +01:00
Usage: "Reveal a preimage and use it to settle the corresponding invoice.",
Description: `
Todo.`,
ArgsUsage: "preimage",
Flags: []cli.Flag{
cli.StringFlag{
Name: "preimage",
Usage: "the hex-encoded preimage (32 byte) which will " +
"allow settling an incoming HTLC payable to this " +
"preimage.",
},
},
Action: actionDecorator(settleInvoice),
}
func settleInvoice(ctx *cli.Context) error {
var (
preimage []byte
err error
)
ctxc := getContext()
2019-02-10 21:03:39 +01:00
client, cleanUp := getInvoicesClient(ctx)
defer cleanUp()
args := ctx.Args()
switch {
case ctx.IsSet("preimage"):
preimage, err = hex.DecodeString(ctx.String("preimage"))
case args.Present():
preimage, err = hex.DecodeString(args.First())
}
if err != nil {
return fmt.Errorf("unable to parse preimage: %w", err)
2019-02-10 21:03:39 +01:00
}
invoice := &invoicesrpc.SettleInvoiceMsg{
Preimage: preimage,
}
resp, err := client.SettleInvoice(ctxc, invoice)
2019-02-10 21:03:39 +01:00
if err != nil {
return err
}
printRespJSON(resp)
2019-02-10 21:03:39 +01:00
return nil
}
2018-11-26 14:19:43 +01:00
var cancelInvoiceCommand = cli.Command{
Name: "cancelinvoice",
Category: "Invoices",
2021-07-17 13:43:11 +02:00
Usage: "Cancels a (hold) invoice.",
2018-11-26 14:19:43 +01:00
Description: `
Todo.`,
ArgsUsage: "paymenthash",
Flags: []cli.Flag{
cli.StringFlag{
Name: "paymenthash",
Usage: "the hex-encoded payment hash (32 byte) for which the " +
"corresponding invoice will be canceled.",
},
},
Action: actionDecorator(cancelInvoice),
}
func cancelInvoice(ctx *cli.Context) error {
var (
paymentHash []byte
err error
)
ctxc := getContext()
2018-11-26 14:19:43 +01:00
client, cleanUp := getInvoicesClient(ctx)
defer cleanUp()
args := ctx.Args()
switch {
case ctx.IsSet("paymenthash"):
paymentHash, err = hex.DecodeString(ctx.String("paymenthash"))
case args.Present():
paymentHash, err = hex.DecodeString(args.First())
}
if err != nil {
return fmt.Errorf("unable to parse preimage: %w", err)
2018-11-26 14:19:43 +01:00
}
invoice := &invoicesrpc.CancelInvoiceMsg{
PaymentHash: paymentHash,
}
resp, err := client.CancelInvoice(ctxc, invoice)
2018-11-26 14:19:43 +01:00
if err != nil {
return err
}
printRespJSON(resp)
2018-11-26 14:19:43 +01:00
return nil
}
2018-12-19 15:20:55 +01:00
var addHoldInvoiceCommand = cli.Command{
Name: "addholdinvoice",
Category: "Invoices",
2018-12-19 15:20:55 +01:00
Usage: "Add a new hold invoice.",
Description: `
Add a new invoice, expressing intent for a future payment.
Invoices without an amount can be created by not supplying any
parameters or providing an amount of 0. These invoices allow the payer
2018-12-19 15:20:55 +01:00
to specify the amount of satoshis they wish to send.`,
ArgsUsage: "hash [amt]",
Flags: []cli.Flag{
cli.StringFlag{
Name: "memo",
Usage: "a description of the payment to attach along " +
"with the invoice (default=\"\")",
},
cli.Int64Flag{
Name: "amt",
Usage: "the amt of satoshis in this invoice",
},
cli.Int64Flag{
Name: "amt_msat",
Usage: "the amt of millisatoshis in this invoice",
},
2018-12-19 15:20:55 +01:00
cli.StringFlag{
Name: "description_hash",
Usage: "SHA-256 hash of the description of the payment. " +
"Used if the purpose of payment cannot naturally " +
"fit within the memo. If provided this will be " +
"used instead of the description(memo) field in " +
"the encoded invoice.",
},
cli.StringFlag{
Name: "fallback_addr",
Usage: "fallback on-chain address that can be used in " +
"case the lightning payment fails",
},
cli.Int64Flag{
Name: "expiry",
Usage: "the invoice's expiry time in seconds. If not " +
"specified, an expiry of " +
"86400 seconds (24 hours) is implied.",
2018-12-19 15:20:55 +01:00
},
cli.BoolFlag{
2018-12-19 15:20:55 +01:00
Name: "private",
Usage: "encode routing hints in the invoice with " +
"private channels in order to assist the " +
"payer in reaching you",
},
},
Action: actionDecorator(addHoldInvoice),
}
func addHoldInvoice(ctx *cli.Context) error {
var (
descHash []byte
err error
)
ctxc := getContext()
2018-12-19 15:20:55 +01:00
client, cleanUp := getInvoicesClient(ctx)
defer cleanUp()
args := ctx.Args()
if ctx.NArg() == 0 {
cli.ShowCommandHelp(ctx, "addholdinvoice")
return nil
}
hash, err := hex.DecodeString(args.First())
if err != nil {
return fmt.Errorf("unable to parse hash: %w", err)
2018-12-19 15:20:55 +01:00
}
args = args.Tail()
amt := ctx.Int64("amt")
amtMsat := ctx.Int64("amt_msat")
2018-12-19 15:20:55 +01:00
if !ctx.IsSet("amt") && !ctx.IsSet("amt_msat") && args.Present() {
amt, err = strconv.ParseInt(args.First(), 10, 64)
2018-12-19 15:20:55 +01:00
if err != nil {
return fmt.Errorf("unable to decode amt argument: %w",
err)
2018-12-19 15:20:55 +01:00
}
}
descHash, err = hex.DecodeString(ctx.String("description_hash"))
if err != nil {
return fmt.Errorf("unable to parse description_hash: %w", err)
2018-12-19 15:20:55 +01:00
}
invoice := &invoicesrpc.AddHoldInvoiceRequest{
Memo: ctx.String("memo"),
Hash: hash,
Value: amt,
ValueMsat: amtMsat,
2018-12-19 15:20:55 +01:00
DescriptionHash: descHash,
FallbackAddr: ctx.String("fallback_addr"),
Expiry: ctx.Int64("expiry"),
Private: ctx.Bool("private"),
}
resp, err := client.AddHoldInvoice(ctxc, invoice)
2018-12-19 15:20:55 +01:00
if err != nil {
return err
}
printRespJSON(resp)
2018-12-19 15:20:55 +01:00
return nil
}