2023-06-29 11:14:01 +00:00
NIP-88
======
2023-06-29 13:11:13 +00:00
Nostr Cash (simple Nostr cash/token/cheque)
2023-06-29 11:14:01 +00:00
-----------------------------------
`draft` `optional` `author:benarc`
2023-06-29 13:11:13 +00:00
Electronic cash is useful and relays should have the option to offer minting/custodial services. Other mints could exist as stand-alone clients, but relays are ideally placed to package in with their service offerings.
2023-06-29 11:14:01 +00:00
2023-06-29 13:55:01 +00:00
Nostr Cash is simple and flexible. User gives a mint some money and the mint issues the user electromic cash/cheque/token that can be used as money in nostr.
2023-06-29 13:58:28 +00:00
Nostr Cash is entirely custodial and trust based, and is just a common standard for users to send/receive value in nostr. Keeping mints simple means more users can run, for themselves, their family, or the whole world.
2023-06-29 11:14:01 +00:00
Relays offering mints must have a keypair and an additional nostr keypair for its mint.
2023-06-30 11:18:56 +00:00
Nostr Cash uses derived keys, much like [NIP06 ](https://github.com/nostr-protocol/nips/blob/master/06.md ). Each "cash" is actually just a derived private key that can be burned or passed to another user.
2023-06-29 11:14:01 +00:00
All communication between the relay and user happen over [NIP04 ](https://github.com/nostr-protocol/nips/blob/master/04.md ).
The mints ledger is two tables `active` and `spent` :
```
active:
key: < integer , keypair deriviation number from master > ,
amount: < integer BTC millisat denomination > ,
user: < string , public-key of user > ,
timestamp: < integer timestamp >
spent:
key: < integer , keypair deriviation number from master > ,
amount: < integer BTC millisat denomination > ,
user: < string , public-key of user > ,
timestamp: < integer timestamp >
```
2023-06-29 13:11:13 +00:00
User client cash wallet stores:
2023-06-29 11:14:01 +00:00
```
active:
2023-06-29 13:11:13 +00:00
key: < string , derived private key / cash > ,
2023-06-29 11:14:01 +00:00
amount: < integer BTC millisat denomination > ,
relay: < string , relay ws address > ,
relaykey: < string , public-key of relay > ,
timestamp: < integer timestamp >
spent:
2023-06-29 13:11:13 +00:00
key: < string , derived private key / cash > ,
2023-06-29 11:14:01 +00:00
amount: < integer BTC millisat denomination > ,
relay: < string , relay ws address > ,
relaykey: < string , public-key of relay > ,
timestamp: < integer timestamp >
```
## Workflows
### Mint details
2023-06-29 11:14:54 +00:00
**For fetching info about the mint.**
2023-06-29 11:14:01 +00:00
User DMs the relay:
```json
{
"mint": < bool true >
}
```
Relay DMs user (maybe after a check if the relays mint has restricted access):
```json
{
"title": < string mints title > ,
"description": < string mints description > ,
"liquiity": < integer optional public millisat balance of mint > ,
"type": < list different offered payment types bolt11 bolt12 onchain stripe paypal shitcoin etc > ,
"fee": < integer millisat fee for internal nostr payments > ,
}
```
### Minting
2023-06-29 13:11:13 +00:00
**For creating new cash from a mint.**
2023-06-29 11:14:01 +00:00
User DMs the relay:
```json
{
"amount": < integer millisats >
}
```
Relay responds with payment request, which user pays:
```json
{
"request": < string payment request bolt11 bolt12 onchain stripe paypal shitcoin etc >
}
```
Once paid the mint generates derived keypair from the mints private key, storing in table `active` :
```json
{
"key": < integer derived keypair number > ,
"amount": < integer BTC millisat denomination > ,
"user": < string public-key of user >
}
```
2023-06-29 14:03:36 +00:00
Mint replies to user:
2023-06-29 11:14:01 +00:00
```json
{
2023-06-29 13:11:13 +00:00
"key": < string derived private key / cash > ,
2023-06-29 11:14:01 +00:00
"amount": < integer BTC millisat denomination >
}
```
User client stores:
```json
{
2023-06-29 13:11:13 +00:00
"key": < string derived private key / cash > ,
2023-06-29 11:14:01 +00:00
"amount": < integer BTC millisat denomination > ,
"relay": < string relay ws address > ,
"relaykey": < string public-key of relay > ,
"timestamp": < integer timestamp >
}
```
### Claiming
2023-06-29 13:11:13 +00:00
**For cashing in cash with the mint.**
2023-06-29 11:14:01 +00:00
User DMs relay:
```json
{
2023-06-29 13:11:13 +00:00
"key": < String , derived private key / cash > ,
2023-06-29 11:14:01 +00:00
"amount": < Integer , BTC millisat denomination > ,
"type": < String , preffered payment method bolt11 bolt12 onchain stripe paypal shitcoin etc >
}
```
Relay DMs user:
```json
{
"type": < String , bolt11 bolt12 onchain stripe paypal shitcoin etc >
}
```
User DMs relay:
```json
{
"request": < String , payment-request bolt11 bolt12 onchain stripe paypal shitcoin etc > ,
}
```
### Sending
2023-06-29 13:11:13 +00:00
**For sending cash to another nostr user.**
2023-06-29 11:14:01 +00:00
User DMs relay:
```json
{
2023-06-29 13:11:13 +00:00
"key": < String , derived private key / cash > ,
2023-06-29 11:14:01 +00:00
"amount": < Integer , BTC millisat denomination > ,
"type": < String , public key of recipient >
}
```
2023-06-29 13:11:13 +00:00
Mint `burns` the old record for the cash and creates a new record(s), depending on if sending user is owed change (the old record moves from `active` to `spent` table). The mint creates a new record in `active` and DMs the recipient user the private-key/cash. If change is due, another record is created in `active` and sent back to the sender user.
2023-06-29 11:14:01 +00:00
Relay DMs user(s):
```json
{
2023-06-29 13:11:13 +00:00
"key": < string derived private key / cash > ,
2023-06-29 11:14:01 +00:00
"amount": < integer BTC millisat denomination >
}
```
User(s) client stores:
```json
{
2023-06-29 13:11:13 +00:00
"key": < string derived private key / cash > ,
2023-06-29 11:14:01 +00:00
"amount": < integer BTC millisat denomination > ,
"relay": < string , relay ws address > ,
"relaykey": < string public-key of relay > ,
"timestamp": < integer timestamp >
}
```