Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 27 additions & 52 deletions 47.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,22 @@ This NIP describes a way for clients to access a remote Lightning wallet through

## Events

There are two event kinds:
There are three event kinds:
- `NIP-47 info event`: 13194
- `NIP-47 request`: 23194
- `NIP-47 response`: 23195

Both the request and response events SHOULD only contain one `p` tag, containing the public key of the **wallet service** if this is a request, and the public key of the **client** if this is a response.
The info event should be a replaceable event that is published by the **wallet service** on the relay to indicate which commands it supports. The content should be
a plaintext string with the supported commands, space-seperated, eg. `pay_invoice get_balance`. Only the `pay_invoice` command is described in this NIP, but other commands might be defined in different NIPs.
Both the request and response events SHOULD contain one `p` tag, containing the public key of the **wallet service** if this is a request, and the public key of the **client** if this is a response. The response event SHOULD contain an `e` tag with the id of the request event it is responding to.

The content is encrypted with [NIP04](https://github.com/nostr-protocol/nips/blob/master/04.md), and is a JSON object. The content depends on the kind.
The content of requests and responses is encrypted with [NIP04](https://github.com/nostr-protocol/nips/blob/master/04.md), and is a JSON-RPCish object with a semi-fixed structure:

Request:
```jsonc
{
"cmd": "pay_invoice", // command, string
"data": { // data, object
"method": "pay_invoice", // method, string
"params": { // params, object
"invoice": "lnbc50n1..." // command-related data
}
}
Expand All @@ -38,21 +41,26 @@ Request:
Response:
```jsonc
{
"status": "ok", // status, "ok" | "error"
"event": "0123456789abcdef...", // event the command is in response to, string
"data": { // response data
"result_type": "pay_invoice", //indicates the structure of the result field
"error": { //object, non-null in case of error
"code": "UNAUTHORIZED", //string error code, see below
"message": "human readable error message"
},
"result": { // result, object. null in case of error.
"preimage": "0123456789abcdef..." // command-related data
}
}
```

The data field SHOULD contain a `message` field with a human readable error message and a `code` field with the error code if the status is `error`.
The `result_type` field MUST contain the name of the method that this event is responding to.
The `error` field MUST contain a `message` field with a human readable error message and a `code` field with the error code if the command was not succesful.
If the command was succesful, the `error` field must be null.

### Error codes
- `RATE_LIMITED`: The client is sending commands too fast. It should retry in a few seconds.
- `NOT_IMPLEMENTED`: The command is not known or is intentionally not implemented.
- `INSUFFICIENT_BALANCE`: The wallet does not have enough funds to cover a fee reserve or the payment amount.
- `QUOTA_EXCEEDED`: The wallet has exceeded
- `QUOTA_EXCEEDED`: The wallet has exceeded its spending quota.
- `RESTRICTED`: This public key is not allowed to do this operation.
- `UNAUTHORIZED`: This public key has no wallet connected.
- `INTERNAL`: An internal error.
Expand All @@ -64,7 +72,7 @@ The data field SHOULD contain a `message` field with a human readable error mess
The **wallet service** generates this connection URI with protocol `nostr+walletconnect:` and base path it's hex-encoded `pubkey` with the following query string parameters:

- `relay` Required. URL of the relay where the **wallet service** is connected and will be listening for events. May be more than one.
- `secret` Required. 32-byte randomly generated hex encoded string. The **client** should use this to sign events when communicating with the **wallet service**.
- `secret` Required. 32-byte randomly generated hex encoded string. The **client** MUST use this to sign events and encrypt payloads when communicating with the **wallet service**.
- Authorization does not require passing keys back and forth.
- The user can have different keys for different applications. Keys can be revoked and created at will and have arbitrary constraints (eg. budgets).
- The key is harder to leak since it is not shown to the user and backed up.
Expand All @@ -79,60 +87,27 @@ nostr+walletconnect:b889ff5b1513b641e2a139f661a661364979c5beee91842f8f0ef42ab558

## Commands

### `get_info`

Description: Get information about the wallet and service.

Request: Empty object.

Response:
```jsonc
{
"balance": 100000, // balance in msat, int
// this should be capped at the quota allowed for this client
// to not report unspendable balance.
"implemented_commands": ["get_info", "pay_invoice"] // commands supported, string array
// extensions can be specified via command+extension:
// get_info+node_info
}
```

### `create_invoice`

Description: Requests creation of an invoice.

Request:
```jsonc
{
"amount": 1000, // amount in msat, int
// must be a whole number of sats unless
// create_invoice+msat_amount is implemented.
"description": "memo" // a description, string, optional
}
```

Response:
```jsonc
{
"invoice": "lnbc50n1..." // BOLT11 invoice, string
}
```

### `pay_invoice`

Description: Requests payment of an invoice.

Request:
```jsonc
{
"invoice": "lnbc50n1..." // BOLT11 invoice, string
"method": "pay_invoice",
"params": {
"invoice": "lnbc50n1..." // bolt11 invoice
}
}
```

Response:
```jsonc
{
"preimage": "0123456789abcdef..." // preimage after payment, string
"result_type": "pay_invoice",
"result": {
"preimage": "0123456789abcdef..." // preimage of the payment
}
}
```

Expand Down