NIP-88 ====== Nostr Cash (simple Nostr ecash) ----------------------------------- `draft` `optional` `author:benarc` > Nostr Cash is not blinded by default. Ecash is useful and relays should have the option to offer ecash mints. Other mints could exist as stand-alone clients, but relays are ideally placed to package in with their service offerings. Users can use relays offering mints they trust, or relays they don't trust but for smaller amounts. Relays offering mints must have a keypair and an additional nostr keypair for its mint. Nostr Cash uses derived keys, much like [NIP26](https://github.com/nostr-protocol/nips/blob/master/26.md). 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: , amount: , user: , timestamp: spent: key: , amount: , user: , timestamp: ``` User client ecash wallet stores: ``` active: key: , amount: , relay: , relaykey: , timestamp: spent: key: , amount: , relay: , relaykey: , timestamp: ``` ## Workflows ### Mint details User DMs the relay: ```json { "mint": } ``` Relay DMs user (maybe after a check if the relays mint has restricted access): ```json { "title": , "description": , "liquiity": , "type": , "fee": , } ``` ### Minting User DMs the relay: ```json { "amount": } ``` Relay responds with payment request, which user pays: ```json { "request": } ``` Once paid the mint generates derived keypair from the mints private key, storing in table `active`: ```json { "key": , "amount": , "user": } ``` Mint replies: ```json { "key": , "amount": } ``` User client stores: ```json { "key": , "amount": , "relay": , "relaykey": , "timestamp": } ``` ### Claiming User DMs relay: ```json { "key": , "amount": , "type": } ``` Relay DMs user: ```json { "type": } ``` User DMs relay: ```json { "request": , } ``` ### Sending User DMs relay: ```json { "key": , "amount": , "type": } ``` Mint `burns` the old record for the ecash 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/ecash. If change is due, another record is created in `active` and sent back to the sender user. Relay DMs user(s): ```json { "key": , "amount": } ``` User(s) client stores: ```json { "key": , "amount": , "relay": , "relaykey": , "timestamp": } ```