lncli: add hold invoice
This commit is contained in:
parent
fcdc8f0e83
commit
22b68e5dc7
@ -9,12 +9,14 @@ import (
|
|||||||
|
|
||||||
"github.com/lightningnetwork/lnd/lnrpc/invoicesrpc"
|
"github.com/lightningnetwork/lnd/lnrpc/invoicesrpc"
|
||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
// invoicesCommands will return nil for non-invoicesrpc builds.
|
// invoicesCommands will return nil for non-invoicesrpc builds.
|
||||||
func invoicesCommands() []cli.Command {
|
func invoicesCommands() []cli.Command {
|
||||||
return []cli.Command{
|
return []cli.Command{
|
||||||
cancelInvoiceCommand,
|
cancelInvoiceCommand,
|
||||||
|
addHoldInvoiceCommand,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,3 +82,120 @@ func cancelInvoice(ctx *cli.Context) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var addHoldInvoiceCommand = cli.Command{
|
||||||
|
Name: "addholdinvoice",
|
||||||
|
Category: "Payments",
|
||||||
|
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 payee
|
||||||
|
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.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 3600 seconds (1 hour) " +
|
||||||
|
"is implied.",
|
||||||
|
},
|
||||||
|
cli.BoolTFlag{
|
||||||
|
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
|
||||||
|
amt int64
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
|
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: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
args = args.Tail()
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case ctx.IsSet("amt"):
|
||||||
|
amt = ctx.Int64("amt")
|
||||||
|
case args.Present():
|
||||||
|
amt, err = strconv.ParseInt(args.First(), 10, 64)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unable to decode amt argument: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unable to parse preimage: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
descHash, err = hex.DecodeString(ctx.String("description_hash"))
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unable to parse description_hash: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
invoice := &invoicesrpc.AddHoldInvoiceRequest{
|
||||||
|
Memo: ctx.String("memo"),
|
||||||
|
Hash: hash,
|
||||||
|
Value: amt,
|
||||||
|
DescriptionHash: descHash,
|
||||||
|
FallbackAddr: ctx.String("fallback_addr"),
|
||||||
|
Expiry: ctx.Int64("expiry"),
|
||||||
|
Private: ctx.Bool("private"),
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := client.AddHoldInvoice(context.Background(), invoice)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
printJSON(struct {
|
||||||
|
PayReq string `json:"pay_req"`
|
||||||
|
}{
|
||||||
|
PayReq: resp.PaymentRequest,
|
||||||
|
})
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user