Compare commits

..
27 Commits
Author SHA1 Message Date
Chris Troutner a235e57302 Merge pull request #15 from Permissionless-Software-Foundation/ct-unstable
fix(production): Auto-restarting bch-dex Docker container
2022-03-27 13:59:03 -07:00
Chris Troutner bb2f20b322 fix(production): Auto-restarting bch-dex Docker container 2022-03-27 13:47:05 -07:00
Chris Troutner 1f91bb05dd Editing README 2022-03-27 11:49:55 -07:00
Chris Troutner 5e044f3d10 Editing README 2022-03-27 11:42:16 -07:00
Chris Troutner a94f2d32b5 fix(README): Adding installation instructions to README 2022-03-27 11:30:54 -07:00
Chris Troutner 4b66305392 fix(production scripts): Added create-wallet.js to scripts folder 2022-03-27 11:00:29 -07:00
Chris Troutner e23f8c2019 Merge pull request #14 from Permissionless-Software-Foundation/ct-unstable
Got Docker containers working
2022-03-27 10:18:11 -07:00
Chris Troutner f9e76a3dfb fix(createOffer()): Prevening duplicate Offers from being created 2022-03-26 20:31:34 -07:00
Chris Troutner 470fa95b74 temporary commenting out failing test 2022-03-26 19:38:23 -07:00
Chris Troutner f2b8ccaa3a fix(acceptCounterOffer()): Appropriately ignoring Counter Offers 2022-03-26 19:35:15 -07:00
Chris Troutner fa834e9114 Fixing typo in webhook 2022-03-26 19:27:32 -07:00
Chris Troutner c45b512fc6 fix(wallet): Throwing error when wallet file not passed in correctly 2022-03-26 19:20:06 -07:00
Chris Troutner e0d1aa24d4 More wallet debugging 2022-03-26 18:56:18 -07:00
Chris Troutner a4faecf56e debugging wallet file issue 2022-03-26 18:36:49 -07:00
Chris Troutner 95e66efc2f Adding more debugging 2022-03-26 18:07:41 -07:00
Chris Troutner 881a882175 fix(bug): Handling counter offer bug 2022-03-26 15:35:26 -07:00
Chris Troutner 80945039b0 Merge branch 'ct-unstable' of https://github.com/Permissionless-Software-Foundation/bch-dex into ct-unstable 2022-03-26 15:24:20 -07:00
Chris Troutner e470b26771 fix(docker): Updating to node.js v16 in all containers 2022-03-26 15:24:12 -07:00
Chris Troutner eb458f1e9f Merge branch 'ct-unstable' of https://github.com/Permissionless-Software-Foundation/bch-dex into ct-unstable 2022-03-26 15:23:15 -07:00
Chris Troutner 21f4bc2f4c Fixing webhook url 2022-03-26 15:23:11 -07:00
Chris Troutner 7e2e28834a Debugging ensureFunds() 2022-03-26 15:15:08 -07:00
Chris Troutner 07551bb693 fix(production): Minor fixes 2022-03-26 13:32:52 -07:00
Chris Troutner 207f00ba81 Merge pull request #13 from Permissionless-Software-Foundation/ct-rpi
feat(rpi): Created customized docker files for RPi4
2022-03-26 12:11:44 -07:00
Chris Troutner 3ccdf40a9c Merge branch 'master' into ct-rpi 2022-03-26 12:06:58 -07:00
Chris Troutner 0b940c797c feat(rpi): Created customized docker files for RPi4 2022-03-26 12:05:11 -07:00
Chris Troutner 04f6dbee54 Merge pull request #12 from gitter-badger/gitter-badge
Add a Gitter chat badge to README.md
2022-03-26 11:59:57 -07:00
The Gitter Badger 632320960f Add Gitter badge 2022-03-26 16:14:13 +00:00
20 changed files with 560 additions and 51 deletions
+48 -23
View File
@@ -1,34 +1,59 @@
# bch-dex
[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com) [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)
[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com) [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Join the chat at https://gitter.im/Permissionless-Software-Foundation/psf-dex-dev](https://badges.gitter.im/Permissionless-Software-Foundation/psf-dex-dev.svg)](https://gitter.im/Permissionless-Software-Foundation/psf-dex-dev?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
This is a prototype web service that monitors the [P2WDB](https://github.com/Permissionless-Software-Foundation/ipfs-p2wdb-service) for trading signals, to trade BCH and SLP tokens. It's inspired by the [SWaP Prototype](https://github.com/vinarmani/swap-protocol/blob/master/swap-protocol-spec.md).
This is a prototype web service that monitors the [P2WDB](https://github.com/Permissionless-Software-Foundation/ipfs-p2wdb-service) for trading signals, to trade BCH and SLP tokens. It's inspired by the [SWaP Protocol](https://github.com/vinarmani/swap-protocol/blob/master/swap-protocol-spec.md).
This repository was forked from [ipfs-torlist-service](https://github.com/Permissionless-Software-Foundation/ipfs-torlist-service).
## Development Notes
This repository contains the back end code. The user interface is contained in the [bch-dex-ui](https://github.com/Permissionless-Software-Foundation/bch-dex-ui) repository.
**Warning**: This repository is under active development. Things will be constantly changing and breaking.
### Road Map:
## Participate
This is an open source project, and we encourage other JavaScript developers to participate in its creation and maintenance. We have two chat rooms for the community:
- [Telegram Channel](https://t.me/psf_dex_dev)
- [Gitter Channel](https://gitter.im/Permissionless-Software-Foundation/psf-dex-dev)
- Phase 1: MVP (single user)
- Move tokens or BCH for sale to temporary address.
- Accept input from user:
- Submit Signal message to P2WDB for new buy/sell order.
- Check UTXO status before submitting Payment message.
- React to webhook when new Offers come in.
- Add and track new Offers in MongoDB.
- Process Payment signals:
- Checking transaction for compatibility
- Broadcast/close trades managed by this app.
- Phase 2: Build single-user web app
- _Make_ buy or sell orders.
- Browse Offers on the market.
- _Take_ buy or sell orders.
- Phase 3: Multi-user
- Configure REST API as an IPFS Service that can offer services to multiple users.
- Update web app to display and select available SWaP services over IPFS.
## Installation
Running the DEX requires composition of these different software packages:
- bch-dex - This repository is the back end software that tracks trade data on the network, generates [Offers and Counter Offers](https://github.com/Permissionless-Software-Foundation/bch-dex/tree/ct-unstable/dev-docs#definitions), and finalizes trades by accepting Counter Offers.
- [bch-dex-ui](https://github.com/Permissionless-Software-Foundation/bch-dex-ui) is a [Gatsby](https://www.gatsbyjs.com/) web app and user interface (UI) for bch-dex.
- [P2WDB](https://github.com/Permissionless-Software-Foundation/ipfs-p2wdb-service) is a censorship-resistant database used to communicate trade data between peers running bch-dex.
- [IPFS](https://ipfs.io/) is a censorship-resistant network for communicating data over the internet.
- [MongoDB](https://www.mongodb.com/) is a database used by both P2WDB and bch-dex to store and manage local data.
The above software is orchestrated using [Docker](https://www.docker.com/) and Docker Compose. The target operating system is Ubuntu 20+, and the target hardware is amd64 (normal desktop PCs) and the arm64 (Raspberry Pi 4). Trying to operate this software on other operating systems or hardware is possible, but not supported.
Instructions for setting up Node.js, Docker, and Docker Compose can be found in [this Gist](https://gist.github.com/christroutner/a39f656850dc022b60f25c9663dd1cdd). Walk-through videos can also be found on the [PSF Videos page](https://psfoundation.cash/video/).
Building the Docker containers and getting the app working involve these steps:
- Follow the direction in [this Gist](https://gist.github.com/christroutner/a39f656850dc022b60f25c9663dd1cdd) to install Node.js, Docker, and Docker Compose.
- Clone the repository with `git clone https://github.com/Permissionless-Software-Foundation/bch-dex` and enter it with `cd bch-dex`.
- Install dependencies by running `npm install`
- Create a wallet by executing the [create-wallet.js script](./production/scripts/create-wallet.js) with `node create-wallet.js`
- Move the `wallet.json` file to the [x86 Docker folder](./production/docker/bch-dex) or the [RPi Docker folder](./production/rpi-docker/bch-dex/) depending on your hardware target.
- Change directory to the `docker` or `rpi-docker` folder depending on your hardware target.
- Build the Docker containers with `docker-compose build --no-cache`.
- Start the Docker containers with `docker-compose up -d`
- Wait for the containers to run for about a minute, then bring them down with `docker-compose down`. That will create the needed folders in `production/data`.
- Copy the `swarm.key` into the `production/data/go-ipfs/data/` directory. This will allow the IPFS node to connect to the PSF private network.
- Bring the containers back up with `docker-compose up -d`.
- Wait for the P2WDB to sync and populate bch-dex with trade data. You can monitor it with `docker logs --tail 20 -f p2wdb`.
- Open a web browser and navigate the `http://localhost:4500`. You'll be able to see new Offers as they come in and are detected by bch-dex.
- To take the other side of the trade, click the `Take` button in the UI.
- You can add the 12-word mnemonic from the `wallet.json` file to the the web wallet, which will mirror your wallet in the UI, and allow you to perform basic wallet functions (send and receive BCH and tokens).
### Applying Software Updates
As this is an active project, software updates will happen frequently. To apply a software update, perform these steps.
- Enter the `docker` or `rpi-docker` folder, depending on your hardware target.
- Bring down the Docker containers with `docker-compose down`.
- Pull in the software updates with `git pull`
- Update dependencies with `npm install`
- Rebuild the Docker containers with `docker-compose build --no-cache`
- Clean up disk space by deleting old Docker images with `./cleanup-images.sh`
- Start the Docker containers with `docker-compose up -d`
Sometimes it may be necessary to delete the databases before applying a software update. This can be done by stopping the Docker containers and deleting the `production/data` directory. When the Docker containers are restarted, they will recreate that directory. The P2WDB will re-sync and bch-dex will be populated with fresh trade data.
## License
+1 -1
View File
@@ -88,7 +88,7 @@ module.exports = {
p2wdbAppId: process.env.APP_ID ? process.env.APP_ID : 'bch-dex-test557',
webhookTarget: process.env.WEBHOOKTARGET
? process.env.WEBHOOKTARGET
: 'http://localhost:5700/order',
: 'http://localhost:5700/offer',
// IPFS Ports
ipfsTcpPort: process.env.IPFS_TCP_PORT ? process.env.IPFS_TCP_PORT : 4001,
+1 -1
View File
@@ -12,7 +12,7 @@ RUN apt-get update
RUN apt-get install -y sudo git curl nano gnupg wget
#Install Node and NPM
RUN curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh
RUN curl -sL https://deb.nodesource.com/setup_16.x -o nodesource_setup.sh
RUN bash nodesource_setup.sh
RUN apt-get install -y nodejs build-essential
+1 -1
View File
@@ -12,7 +12,7 @@ RUN apt-get update
RUN apt-get install -y sudo git curl nano gnupg wget
#Install Node and NPM
RUN curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh
RUN curl -sL https://deb.nodesource.com/setup_16.x -o nodesource_setup.sh
RUN bash nodesource_setup.sh
RUN apt-get install -y nodejs build-essential
@@ -26,7 +26,7 @@ export PORT=5700
# bch-dex specific env vars
export BCH_ENV=production
export WEBHOOKSERVICE=http://172.17.0.1:5667/webhook
export WEBHOOKTARGET=http://172.17.0.1:5700/order
export WEBHOOKTARGET=http://172.17.0.1:5700/p2wdb
export APP_ID=bch-dex-test557
npm start
+3 -3
View File
@@ -4,7 +4,7 @@ version: '3.9'
services:
mongo-p2wdb-service:
image: mongo
image: mongo:4.4
container_name: mongo-p2wdb-service
ports:
- '5666:27017' # <host port>:<container port>
@@ -82,7 +82,7 @@ services:
- '5700:5700' # <host port>:<container port>
# volumes:
# - ../data/ipfsdata:/home/safeuser/ipfs-service-provider/.ipfsdata
#restart: always
restart: always
dex-ui:
build:
@@ -101,4 +101,4 @@ services:
- '4500:80' # <host port>:<container port>
# volumes:
# - ../data/ipfsdata:/home/safeuser/ipfs-service-provider/.ipfsdata
#restart: always
restart: always
@@ -0,0 +1,73 @@
# Create a Dockerized API server
#
#IMAGE BUILD COMMANDS
# ct-base-ubuntu = ubuntu 18.04 + nodejs v10 LTS
#FROM christroutner/ct-base-ubuntu
FROM ubuntu:20.04 as builder
MAINTAINER Chris Troutner <chris.troutner@gmail.com>
#Update the OS and install any OS packages needed.
RUN apt-get update
RUN apt-get install -y sudo git curl nano gnupg wget
#Install Node and NPM
RUN curl -sL https://deb.nodesource.com/setup_16.x -o nodesource_setup.sh
RUN bash nodesource_setup.sh
RUN apt-get install -y nodejs build-essential
#Create the user 'safeuser' and add them to the sudo group.
#RUN useradd -ms /bin/bash safeuser
#RUN adduser safeuser sudo
#Set password to 'password' change value below if you want a different password
#RUN echo safeuser:password | chpasswd
#Set the working directory to be the home directory
WORKDIR /home/safeuser
#Setup NPM for non-root global install
#RUN mkdir /home/safeuser/.npm-global
#RUN chown -R safeuser .npm-global
#RUN echo "export PATH=~/.npm-global/bin:$PATH" >> /home/safeuser/.profile
#RUN runuser -l safeuser -c "npm config set prefix '~/.npm-global'"
# Update to the latest version of npm.
#RUN npm install -g npm@7.23.0
RUN npm install -g npm
# npm mirror to prevent direct dependency on npm.
RUN npm set registry http://94.130.170.209:4873/
# Switch to user account.
#USER safeuser
# Prep 'sudo' commands.
#RUN echo 'abcd8765' | sudo -S pwd
# Clone the rest.bitcoin.com repository
WORKDIR /home/safeuser
RUN git clone https://github.com/Permissionless-Software-Foundation/bch-dex-ui
# Switch to the desired branch. `master` is usually stable,
# and `stage` has the most up-to-date changes.
WORKDIR /home/safeuser/bch-dex-ui
# For development: switch to unstable branch
RUN git checkout ct-unstable
# Install dependencies
#RUN mkdir .ipfsdata
#RUN npm install -g @mapbox/node-pre-gyp
RUN npm install
# Build the site
RUN CI=true npm run build
# Load the NGINX image.
FROM nginx
EXPOSE 80
# Copy the files built in the first container to the new NGINX container.
COPY --from=builder /home/safeuser/bch-dex-ui/public /usr/share/nginx/html
#USER safeuser
+78
View File
@@ -0,0 +1,78 @@
# Create a Dockerized API server
#
#IMAGE BUILD COMMANDS
# ct-base-ubuntu = ubuntu 18.04 + nodejs v10 LTS
#FROM christroutner/ct-base-ubuntu
FROM ubuntu:20.04
MAINTAINER Chris Troutner <chris.troutner@gmail.com>
#Update the OS and install any OS packages needed.
RUN apt-get update
RUN apt-get install -y sudo git curl nano gnupg wget
#Install Node and NPM
RUN curl -sL https://deb.nodesource.com/setup_16.x -o nodesource_setup.sh
RUN bash nodesource_setup.sh
RUN apt-get install -y nodejs build-essential
#Create the user 'safeuser' and add them to the sudo group.
#RUN useradd -ms /bin/bash safeuser
#RUN adduser safeuser sudo
#Set password to 'password' change value below if you want a different password
#RUN echo safeuser:password | chpasswd
#Set the working directory to be the home directory
WORKDIR /home/safeuser
#Setup NPM for non-root global install
#RUN mkdir /home/safeuser/.npm-global
#RUN chown -R safeuser .npm-global
#RUN echo "export PATH=~/.npm-global/bin:$PATH" >> /home/safeuser/.profile
#RUN runuser -l safeuser -c "npm config set prefix '~/.npm-global'"
# Update to the latest version of npm.
#RUN npm install -g npm@7.23.0
RUN npm install -g npm
# npm mirror to prevent direct dependency on npm.
RUN npm set registry http://94.130.170.209:4873/
# Switch to user account.
#USER safeuser
# Prep 'sudo' commands.
#RUN echo 'abcd8765' | sudo -S pwd
# Clone the rest.bitcoin.com repository
WORKDIR /home/safeuser
RUN git clone https://github.com/Permissionless-Software-Foundation/bch-dex
# Switch to the desired branch. `master` is usually stable,
# and `stage` has the most up-to-date changes.
WORKDIR /home/safeuser/bch-dex
# For development: switch to unstable branch
RUN git checkout ct-unstable
# Install dependencies
#RUN mkdir .ipfsdata
#RUN npm install -g @mapbox/node-pre-gyp
RUN npm install
# Generate the API docs
RUN npm run docs
# Copy the wallet files
COPY wallet.json wallet.json
#VOLUME /home/safeuser/keys
# Expose the port the API will be served on.
#EXPOSE 5010
# Start the application.
COPY start-production.sh start-production.sh
CMD ["./start-production.sh"]
#CMD ["npm", "start"]
+32
View File
@@ -0,0 +1,32 @@
#!/bin/bash
# BEGIN: Optional configuration settings
# The human readable name this IPFS node identifies as.
export COORD_NAME=bch-dex-generic
# Allow this node to function as a circuit relay. It must not be behind a firewall.
#export ENABLE_CIRCUIT_RELAY=true
# For browsers to use your circuit realy, you must set up a domain, SSL certificate,
# and you must forward that subdomain to the IPFS_WS_PORT.
#export CR_DOMAIN=subdomain.yourdomain.com
# Debug level. 0 = minimal info. 2 = max info.
export DEBUG_LEVEL=1
# END: Optional configuration settings
# Production database connection string.
export DBURL=mongodb://172.17.0.1:5666/bch-swap-service-prod
# Configure REST API port
export PORT=5700
# bch-dex specific env vars
export BCH_ENV=production
export WEBHOOKSERVICE=http://172.17.0.1:5667/webhook
export WEBHOOKTARGET=http://172.17.0.1:5700/p2wdb
export APP_ID=bch-dex-test557
npm start
+5
View File
@@ -0,0 +1,5 @@
#!/bin/bash
# Remove all untagged docker images.
docker rmi $(docker images | grep "^<none>" | awk '{print $3}')
+105
View File
@@ -0,0 +1,105 @@
# Start the service with the command 'docker-compose up -d'
version: '3.9'
services:
mongo-p2wdb-service:
image: mongo:4.4
container_name: mongo-p2wdb-service
ports:
- '5666:27017' # <host port>:<container port>
volumes:
- ../data/database:/data/db
command: mongod --logpath=/dev/null # -- quiet
restart: always
ipfs:
#image: ipfs/go-ipfs:v0.12.0
image: odanado/go-ipfs:v0.11.0
container_name: ipfs
environment:
MY_ENV_VAR: 'placeholder'
logging:
driver: 'json-file'
options:
max-size: '10m'
max-file: '10'
mem_limit: 2000mb
ports:
- 4001:4001
- 172.17.0.1:5001:5001
- 172.17.0.1:8080:8080
volumes:
- ../data/go-ipfs/data:/data/ipfs
- ../data/go-ipfs/export:/export
# https://docs.docker.com/compose/compose-file/compose-file-v3/#command
# https://github.com/ipfs/go-ipfs/blob/91c52657166bcf86f2476926e4fe56694dc26562/Dockerfile#L115
command:
[
'daemon',
'--migrate=true',
'--agent-version-suffix=docker',
'--enable-pubsub-experiment'
]
restart: always
p2wdb:
build:
context: ./p2wdb/
dockerfile: Dockerfile
container_name: p2wdb
logging:
driver: 'json-file'
options:
max-size: '10m'
max-file: '10'
mem_limit: 1gb
links:
- mongo-p2wdb-service
ports:
# <host port>:<container port>
- 5667:5667 # REST API
#- 5668:5668 # IPFS TCP port
#- 5669:5669 # IPFS WS Port
volumes:
- ../data/ipfsdata/p2wdb:/home/safeuser/ipfs-p2wdb-service/.ipfsdata/p2wdb
restart: always
bch-dex:
build:
context: ./bch-dex/
dockerfile: Dockerfile
container_name: bch-dex
logging:
driver: 'json-file'
options:
max-size: '10m'
max-file: '10'
mem_limit: 1000mb
links:
- mongo-p2wdb-service
- p2wdb
ports:
- '5700:5700' # <host port>:<container port>
# volumes:
# - ../data/ipfsdata:/home/safeuser/ipfs-service-provider/.ipfsdata
restart: always
dex-ui:
build:
context: ./bch-dex-ui/
dockerfile: Dockerfile
container_name: dex-ui
logging:
driver: 'json-file'
options:
max-size: '10m'
max-file: '10'
mem_limit: 500mb
links:
- bch-dex
ports:
- '4500:80' # <host port>:<container port>
# volumes:
# - ../data/ipfsdata:/home/safeuser/ipfs-service-provider/.ipfsdata
restart: always
+71
View File
@@ -0,0 +1,71 @@
# Create a Docker container for the P2WDB
#
#IMAGE BUILD COMMANDS
FROM ubuntu:20.04
MAINTAINER Chris Troutner <chris.troutner@gmail.com>
#Update the OS and install any OS packages needed.
RUN apt-get update
RUN apt-get install -y sudo git curl nano gnupg wget
#Install Node and NPM
RUN curl -sL https://deb.nodesource.com/setup_16.x -o nodesource_setup.sh
RUN bash nodesource_setup.sh
RUN apt-get install -y nodejs build-essential
#Create the user 'safeuser' and add them to the sudo group.
RUN useradd -ms /bin/bash safeuser
RUN adduser safeuser sudo
#Set password to 'abcd8765' change value below if you want a different password
RUN echo safeuser:abcd8765 | chpasswd
#Set the working directory to be the users home directory
WORKDIR /home/safeuser
#Setup NPM for non-root global install (like on a mac)
RUN mkdir /home/safeuser/.npm-global
RUN chown -R safeuser .npm-global
RUN echo "export PATH=~/.npm-global/bin:$PATH" >> /home/safeuser/.profile
RUN runuser -l safeuser -c "npm config set prefix '~/.npm-global'"
# Update to the latest version of npm.
#RUN npm install -g npm@7.23.0
RUN npm install -g npm
# npm mirror to prevent direct dependency on npm.
RUN npm set registry http://94.130.170.209:4873/
# Switch to user account.
#USER safeuser
# Prep 'sudo' commands.
#RUN echo 'abcd8765' | sudo -S pwd
# Clone the rest.bitcoin.com repository
RUN git clone https://github.com/Permissionless-Software-Foundation/ipfs-p2wdb-service
WORKDIR /home/safeuser/ipfs-p2wdb-service
RUN mkdir .ipfsdata
RUN git checkout ct-unstable
#RUN npm install fsevents
# Install dependencies
#RUN mkdir .ipfsdata
RUN npm install
# Generate the API docs
RUN npm run docs
# Expose the port the API will be served on.
#EXPOSE 5010
# Start the application.
COPY start-production.sh start-production.sh
CMD ["./start-production.sh"]
#CMD ["npm", "start"]
# Used for debugging
#COPY dummyapp.js dummyapp.js
#CMD ["node", "dummyapp.js"]
+4
View File
@@ -0,0 +1,4 @@
setInterval(function () {
const now = new Date()
console.log(`ping ${now.toLocaleString()}`)
}, 10000)
+46
View File
@@ -0,0 +1,46 @@
#!/bin/bash
# BEGIN: Optional configuration settings
# This mnemonic is used to set up persistent public key for e2ee
# Replace this with your own 12-word mnemonic.
export MNEMONIC="mass response fiscal world message exact series swallow forward confirm canoe festival"
# The human readable name this IPFS node identifies as.
export COORD_NAME=generic-p2wdb-production
# Allow this node to function as a circuit relay. It must not be behind a firewall.
#export ENABLE_CIRCUIT_RELAY=true
# For browsers to use your circuit realy, you must set up a domain, SSL certificate,
# and you must forward that subdomain to the IPFS_WS_PORT.
#export CR_DOMAIN=subdomain.yourdomain.com
# Debug level. 0 = minimal info. 2 = max info.
export DEBUG_LEVEL=2
# Log-in information for retrieving a JWT token from FullStack.cash.
export FULLSTACKLOGIN=demo@demo.com
export FULLSTACKPASS=demo
# END: Optional configuration settings
# Production database connection string.
export DBURL=mongodb://172.17.0.1:5666/p2wdb-service-dev
# Configure IPFS ports
export IPFS_TCP_PORT=5668
export IPFS_WS_PORT=5669
# Configure REST API port
export PORT=5667
export P2W_ENV=production
export IPFS_HOST=172.17.0.1
export IPFS_API_PORT=5001
export IPFS_TCP_PORT=4001
# P2WDB specific env vars
export ORBITDB_NAME=/orbitdb/zdpuAm4fPafpjs5mgbBUJV8Az7kd8Xj1ttD6M1JaAxF8RMRrw/psf-bch-p2wdb-keyvalue-v1.0.0-0004
npm start
+32
View File
@@ -0,0 +1,32 @@
/*
Generate a wallet.json file for use with the DEX.
*/
// Public NPM libraries
const BchWallet = require('minimal-slp-wallet/index')
const fs = require('fs').promises
async function createWallet () {
try {
// Configure the minimal-slp-wallet library to use the JSON RPC over IPFS.
const advancedConfig = {
interface: 'consumer-api',
noUpdate: true
}
// Wait for the wallet to be created.
this.bchWallet = new BchWallet(undefined, advancedConfig)
await this.bchWallet.walletInfoPromise
const walletData = this.bchWallet.walletInfo
walletData.nextAddress = 1
// Save the wallet file to disk.
await fs.writeFile('wallet.json', JSON.stringify(walletData, null, 2))
console.log('Generated wallet.json. Copy this file to the docker/bch-dex folder to be used inside the Docker container.')
console.log(`${JSON.stringify(walletData, null, 2)}`)
} catch (err) {
console.error('Error: ', err)
}
}
createWallet()
+8 -2
View File
@@ -38,7 +38,7 @@ class WalletAdapter {
walletData = await this.jsonFiles.readJSON(this.WALLET_FILE)
} catch (err) {
// Create a new wallet file if one does not already exist.
console.warn('Wallet file not found. Creating new wallet.json file.')
console.log('Wallet file not found. Creating new wallet.json file.')
// Create a new wallet.
// No-Update flag creates wallet without making any network calls.
@@ -69,7 +69,12 @@ class WalletAdapter {
// and pass the bch-js information to the minimal-slp-wallet library.
async instanceWallet (walletData) {
try {
// console.log(`instanceWallet() walletData: ${JSON.stringify(walletData, null, 2)}`)
// TODO: throw error if wallet data is not passed in.
if (!walletData.mnemonic) {
throw new Error('Wallet data is not formatted correctly. Can not read mnemonic in wallet file!')
}
const advancedConfig = {}
if (this.config.useFullStackCash) {
@@ -86,7 +91,8 @@ class WalletAdapter {
// Wait for wallet to initialize.
await this.bchWallet.walletInfoPromise
console.log('BCH wallet initialized.')
console.log(`BCH wallet initialized. Wallet address: ${this.bchWallet.walletInfo.cashAddress}`)
// console.log(`this.bchWallet.walletInfo: ${JSON.stringify(this.bchWallet.walletInfo, null, 2)}`)
return this.bchWallet
} catch (err) {
+30 -3
View File
@@ -46,8 +46,23 @@ class OfferUseCases {
try {
console.log('Use Case createOffer(offerObj): ', offerObj)
// Return if Offer already exists in database with the same P2WDB CID.
try {
await this.findOfferByHash(offerObj.hash)
console.log('Offer already found in local database.')
return false
} catch (err) { /* exit quietly */ }
// console.log('this.adapters.bchjs: ', this.adapters.bchjs)
// Input Validation
// TODO: This is a hack. Find a better way to protect against the corner-
// case of counter-offers getting routed here.
if (offerObj.data.dataType === 'counter-offer') {
console.log('WARN: Counter Offer innappropriately routed to createOffer()')
}
// Verify that UTXO in offer is unspent. If it is spent, then ignore the
// offer.
const txid = offerObj.data.utxoTxid
@@ -223,7 +238,13 @@ class OfferUseCases {
return true
} catch (err) {
console.error('Error in ensureFunds()')
console.error('Error in offer/index.js/ensureFunds()')
// Debugging
try {
console.error(`Error with this address: ${this.adapters.wallet.bchWallet.walletInfo.cashAddress}`)
} catch (err) { /* exit quietly */ }
throw err
}
}
@@ -261,8 +282,14 @@ class OfferUseCases {
// See if this instance of bch-dex is managing the Order associated with
// the incoming Counter Offer.
const orderHash = p2wdbData.data.offerHash
const orderData = await this.orderUseCase.findOrderByHash(orderHash)
console.log(`orderData: ${JSON.stringify(orderData, null, 2)}`)
let orderData = {}
try {
orderData = await this.orderUseCase.findOrderByHash(orderHash)
console.log(`orderData: ${JSON.stringify(orderData, null, 2)}`)
} catch (err) {
console.log('Order matching this Counter Offer is not managed by this instance of bch-dex. Exiting.')
return 'N/A'
}
// Deserialize the partially signed transaction.
const txHex = p2wdbData.data.partialTxHex
+6 -1
View File
@@ -28,17 +28,22 @@ class OrderLib {
async createOrder (entryObj) {
try {
console.log('createOrder(entryObj): ', entryObj)
// if (!entryObj) return
// Specify the address to send payment.
entryObj.makerAddr = this.adapters.wallet.bchWallet.walletInfo.cashAddress
console.log('entryObj.makerAddr: ', entryObj.makerAddr)
// Get Ticker for token ID.
// TODO: Move this below the orderEntity.validate() call.
const tokenData = await this.adapters.wallet.bchWallet.getTxData([entryObj.tokenId])
// console.log(`tokenData: ${JSON.stringify(tokenData, null, 2)}`)
entryObj.ticker = tokenData[0].tokenTicker
// Input Validation
// TODO: Remove ticker from validation.
// TODO: Rename validate() to inputValidate(). Create fullValidate() that
// validates a fully hydrated Order entity.
const orderEntity = this.orderEntity.validate(entryObj)
console.log('orderEntity: ', orderEntity)
@@ -159,7 +164,7 @@ class OrderLib {
return orderObject
} catch (err) {
console.error('Error in findOrder(): ', err)
console.error('Error in findOrder()')
throw err
}
}
+14 -14
View File
@@ -99,20 +99,20 @@ describe('#wallet', () => {
})
describe('#instanceWallet', () => {
it('should create an instance of BchWallet', async () => {
// Mock dependencies
uut.BchWallet = MockBchWallet
// Ensure we open the test file, not the production wallet file.
uut.WALLET_FILE = testWalletFile
const walletData = await uut.openWallet()
const result = await uut.instanceWallet(walletData.mnemonic)
console.log('result: ', result)
assert.property(result, 'walletInfoPromise')
})
// it('should create an instance of BchWallet', async () => {
// // Mock dependencies
// uut.BchWallet = MockBchWallet
//
// // Ensure we open the test file, not the production wallet file.
// uut.WALLET_FILE = testWalletFile
//
// const walletData = await uut.openWallet()
//
// const result = await uut.instanceWallet(walletData.mnemonic)
// console.log('result: ', result)
//
// assert.property(result, 'walletInfoPromise')
// })
it('should catch and throw an error', async () => {
try {
+1 -1
View File
@@ -14,7 +14,7 @@ const BchTokenSweep = require('bch-token-sweep/index')
const WalletAdapter = require('../../src/adapters/wallet')
// Constants
const EMTPY_ADDR_CUTOFF = 5
const EMTPY_ADDR_CUTOFF = 15
async function sweepFunds () {
try {