Files
lndhub.go/notes.md
Roman Useinov 628071160c Cleanup (#25)
* remove cmd folder as we are going to have only one entrypoint

* get rid of pkg directory

* rename test -> integration_tests as unit tests should reside next to the actual files they are testing

* database migration WIP

* reinstate gorm boilerplate in the addinvoice for now to make it compile

* introduce migrations

* add Makefile

* don't use unsigned types for database mappings

* migrations work now

* add build target

* use echo groups

* gorm removed

* add envconfig

* fix comments
2022-01-16 00:49:19 +01:00

131 lines
3.5 KiB
Markdown

# Rebuilding LNDHub
Goal of this project is to build a simple accounting system with a [LNDHub](https://github.com/BlueWallet/LndHub) compatible API that focusses on simplicity, maintainability and ease of deployment.
[LNDHub](https://github.com/BlueWallet/LndHub) is a simple accounting system for LND. It allows users to send and receive lightning payments. Through the API people can access funds through a shared lightning node. (see overview.png diagram)
Some design goals:
* No runtime dependencies (all compiled into a single, simple deployable executable)
* Use of an ORM ([bun](https://bun.uptrace.dev/)?)to support deployments with SQLite and PostgreSQL (default) as databases
* Focus on offchain payments (no onchain transactions supported)
* Plan for multiple node backends ([LND](https://github.com/lightningnetwork/lnd/) gRPC interface is the first implementation) (also through Tor)
* Admin panel for better Ops
* All configuration stored in the DB
* Using constraints and functions in the DB to prevent inconsistent data
### API endpoints
See [LNDHub API](https://github.com/BlueWallet/LndHub/blob/master/controllers/api.js) for enpoints and request/response signatures.
#### /create
Create a new user account
#### /auth
Get new "session" access/refresh tokens. access token is required for all other API endpoints
#### /addinvoice
Generate a new lightning invoice
#### /payinvoice
Pay a lightning invoice
#### /checkpayment/:payment_hash
Check the status of an incoming transaction
#### /balance
Get the user's balanc
#### /gettxs
Get all transactions
### ToDos
- [ ] Project setup for [Echo](https://echo.labstack.com/), [bun](https://bun.uptrace.dev/) (with support for PostgreSQL and SQLite), Unit-Test setup
- [ ] Implement first endpoints (`/create`, `/auth`, `/addinvoice`)
- [ ] Connect to LND (gRPC API) (in the future the API implementation should be configurable)
- [ ] ...
### Datamodel
* Double entry accounting?
+ https://gist.github.com/NYKevin/9433376
+ https://gocardless.com/guides/posts/double-entry-bookkeeping/
+
#### users
```
+ id (primary key)
+ email (optional)
+ login (auto generated, random string)
+ password (auto generated, random string)
+ refresh_token (auto generated on /auth call)
+ access_token (auto generated on /auth call)
+ updated_at (datetime)
+ created_at (datetime)
```
#### tokens
```
+ id (primary key)
+ user_id (foreign_key)
+ name (string - optional name of the application)
+ access_token (string auto generated on /auth call)
+ refresh_token (string auto generated on /auth call)
+ expires_at (datetime / created_at + 2 weeks)
+ created_at (datetime)
```
#### invoices
```
+ id (primary key)
+ type (enum: incoming, outgoing)
+ user_id (foreign key, constaint)
+ transaction_entry_id (foreign key)
+ amount (integer, constraint >=0)
+ memo (string)
+ description_hash (string)
+ payment_request (string)
+ r_hash (string)
+ state (string (enum: )
+ created_at (datetime)
+ expires_at (datetime)
+ settled_at (datetime)
```
#### accounts
```
+ user_id
+ type (enum: outgoing, incoming, current)
```
#### transaction_entries
```
+ user_id
+ invoice_id
+ credit_account_id
+ debit_account_id
+ amount (integer >0 constraint)
+ created_at (datetime)
```
### Know Issues
#### Self-payments
How do we identify self-payments?
We could use two different lightning wallets for sending and receiving. This would avoid the need to identify self-payments completely and any payment would be a proper lightning payment.
### Links
* [LNDHub](https://github.com/BlueWallet/LndHub) - Current nodejs implementation